Changeset 34659 in webkit for trunk/JavaScriptCore
- Timestamp:
- Jun 19, 2008, 10:29:29 AM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 59 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/API/JSBase.cpp
r34581 r34659 29 29 30 30 #include "APICast.h" 31 #include "completion.h" 31 32 #include <kjs/ExecState.h> 32 33 #include <kjs/InitializeThreading.h> … … 86 87 initializeThreading(); 87 88 89 // It might seem that we have a context passed to this function, and can use toJS(ctx)->heap(), but the parameter is likely to be NULL, 90 // and it may actually be garbage for some clients (most likely, because of JSGarbageCollect being called after releasing the context). 91 88 92 JSLock lock; 89 if (!Collector::isBusy()) 90 Collector::collect(); 93 94 // FIXME: It would be good to avoid creating a JSGlobalData instance if it didn't exist for this thread yet. 95 Heap* heap = JSGlobalData::threadInstance().heap; 96 if (!heap->isBusy()) 97 heap->collect(); 98 99 // FIXME: Similarly, we shouldn't create a shared instance here. 100 heap = JSGlobalData::sharedInstance().heap; 101 if (!heap->isBusy()) 102 heap->collect(); 103 91 104 // FIXME: Perhaps we should trigger a second mark and sweep 92 105 // once the garbage collector is done if this is called when -
trunk/JavaScriptCore/API/JSCallbackObjectFunctions.h
r34607 r34659 471 471 if (StaticFunctionEntry* entry = staticFunctions->get(propertyName.ustring().rep())) { 472 472 if (JSObjectCallAsFunctionCallback callAsFunction = entry->callAsFunction) { 473 JSObject* o = new JSCallbackFunction(exec, callAsFunction, propertyName);473 JSObject* o = new (exec) JSCallbackFunction(exec, callAsFunction, propertyName); 474 474 thisObj->putDirect(propertyName, o, entry->attributes); 475 475 return o; -
trunk/JavaScriptCore/API/JSClassRef.cpp
r34361 r34659 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/JSContextRef.cpp
r34581 r34659 45 45 46 46 if (!globalObjectClass) { 47 JSGlobalObject* globalObject = new JSGlobalObject;47 JSGlobalObject* globalObject = new (JSGlobalObject::Shared) JSGlobalObject; 48 48 return JSGlobalContextRetain(toGlobalRef(globalObject->globalExec())); 49 49 } 50 50 51 JSGlobalObject* globalObject = new JSCallbackObject<JSGlobalObject>(globalObjectClass);51 JSGlobalObject* globalObject = new (JSGlobalObject::Shared) JSCallbackObject<JSGlobalObject>(globalObjectClass); 52 52 JSGlobalContextRef ctx = toGlobalRef(globalObject->globalExec()); 53 53 JSValue* prototype = globalObjectClass->prototype(ctx); -
trunk/JavaScriptCore/API/JSObjectRef.cpp
r34607 r34659 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(exec, toJS(name)) : Identifier(exec, "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 ArgList 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
r34581 r34659 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
r34634 r34659 1 2008-06-17 Alexey Proskuryakov <[email protected]> 2 3 Reviewed by Darin. 4 5 Prepare JavaScript heap for being per-thread. 6 7 * kjs/ExecState.h: Shuffle includes, making it possible to include ExecState.h in JSValue.h. 8 (KJS::ExecState::heap): Added an accessor. 9 10 * API/JSBase.cpp: (JSGarbageCollect): Collect both shared and per-thread heaps. 11 12 * API/JSContextRef.cpp: (JSGlobalContextCreate): When allocating JSGlobalObject, indicate 13 that it belongs to a shared heap. 14 15 * JavaScriptCore.xcodeproj/project.pbxproj: 16 * kjs/AllInOneFile.cpp: 17 Moved JSGlobalObject.cpp to AllInOneFile, as a build fix for inlineAllocate magic. 18 19 * VM/CodeGenerator.h: (KJS::CodeGenerator::globalExec): Added an accessor (working via 20 m_scopeChain). 21 22 * VM/RegisterFile.h: 23 (KJS::RegisterFile::mark): 24 * VM/RegisterFileStack.h: 25 (KJS::RegisterFileStack::mark): 26 Made these pseudo-mark functions take Heap*. 27 28 * kjs/InitializeThreading.cpp: 29 (KJS::initializeThreading): Initialize heap introspector. 30 31 * kjs/JSGlobalData.h: Added Heap to the structure. 32 33 * kjs/JSGlobalData.cpp: 34 (KJS::JSGlobalData::JSGlobalData): Initialize Heap. 35 (KJS::JSGlobalData::sharedInstance): Added a method to access shared global data instance 36 for legacy clients. 37 38 * kjs/JSGlobalObject.cpp: 39 (KJS::JSGlobalObject::~JSGlobalObject): Changed to work with per-thread head; fixed list 40 maintenance logic. 41 (KJS::JSGlobalObject::init): Changed to work with per-thread head. 42 (KJS::JSGlobalObject::put): Assert that a cross-heap operation is not being attempted. 43 (KJS::JSGlobalObject::reset): Pass ExecState* where now required. 44 (KJS::JSGlobalObject::mark): Pass the current heap to RegisterFileStack::mark. 45 (KJS::JSGlobalObject::operator new): Overload operator new to use per-thread or shared heap. 46 * kjs/JSGlobalObject.h: Removed static s_head member. 47 48 * kjs/PropertyMap.h: (KJS::PropertyMap::PropertyMap): Removed unused SavedProperty. 49 50 * kjs/collector.h: Turned Collector into an actual object with its own data, renamed to Heap. 51 (KJS::Heap::initializeHeapIntrospector): Added. 52 (KJS::Heap::heap): Added a method to determine which heap a JSValue is in, if any. 53 (KJS::Heap::allocate): Made non-static. 54 (KJS::Heap::inlineAllocateNumber): Ditto. 55 (KJS::Heap::markListSet): Ditto. 56 (KJS::Heap::cellBlock): Ditto. 57 (KJS::Heap::cellOffset): Ditto. 58 (KJS::Heap::isCellMarked): Ditto. 59 (KJS::Heap::markCell): Ditto. 60 (KJS::Heap::reportExtraMemoryCost): Ditto. 61 (KJS::CollectorBlock): Added a back-reference to Heap for Heap::heap() method. 62 (KJS::SmallCellCollectorBlock): Ditto. 63 64 * kjs/collector.cpp: Changed MIN_ARRAY_SIZE to a #define to avoid a PIC branch. Removed 65 main thread related machinery. 66 (KJS::Heap::Heap): Initialize the newly added data members. 67 (KJS::allocateBlock): Marked NEVER_INLINE, as this is a rare case that uses a PIC branch. 68 Moved static pagesize to the class to make it safely initialized. 69 (KJS::Heap::heapAllocate): Initialize heap back reference after a new block is allocated. 70 (KJS::Heap::registerThread): Removed introspector initialization, as it is now performed 71 in InitializeThreading.cpp. 72 (KJS::Heap::markOtherThreadConservatively): Assert that the "other thread" case only occurs 73 for legacy clients using a shared heap. 74 (KJS::Heap::markStackObjectsConservatively): Moved fastMallocForbid/Allow down here, since 75 it doesn't need to be forbidden during other GC phases. 76 77 * kjs/JSImmediate.h: 78 (KJS::jsUndefined): 79 (KJS::jsNull): 80 (KJS::jsBoolean): 81 Moved from JSvalue.h, to make these usable in files that cannot include JSValue.h (such 82 as list.h). 83 84 * API/JSCallbackObjectFunctions.h: 85 (KJS::::staticFunctionGetter): 86 * API/JSClassRef.cpp: 87 (OpaqueJSClass::prototype): 88 * API/JSObjectRef.cpp: 89 (JSObjectMake): 90 (JSObjectMakeFunctionWithCallback): 91 (JSObjectMakeConstructor): 92 (JSObjectMakeFunction): 93 * API/JSValueRef.cpp: 94 (JSValueMakeNumber): 95 (JSValueMakeString): 96 * JavaScriptCore.exp: 97 * VM/CodeGenerator.cpp: 98 (KJS::CodeGenerator::emitLoad): 99 * VM/JSPropertyNameIterator.cpp: 100 (KJS::JSPropertyNameIterator::create): 101 (KJS::JSPropertyNameIterator::next): 102 * VM/Machine.cpp: 103 (KJS::jsAddSlowCase): 104 (KJS::jsAdd): 105 (KJS::jsTypeStringForValue): 106 (KJS::scopeChainForCall): 107 (KJS::Machine::throwException): 108 (KJS::Machine::execute): 109 (KJS::Machine::privateExecute): 110 (KJS::Machine::retrieveArguments): 111 * kjs/ArrayPrototype.cpp: 112 (KJS::arrayProtoFuncToString): 113 (KJS::arrayProtoFuncToLocaleString): 114 (KJS::arrayProtoFuncJoin): 115 (KJS::arrayProtoFuncConcat): 116 (KJS::arrayProtoFuncPop): 117 (KJS::arrayProtoFuncPush): 118 (KJS::arrayProtoFuncShift): 119 (KJS::arrayProtoFuncSlice): 120 (KJS::arrayProtoFuncSplice): 121 (KJS::arrayProtoFuncUnShift): 122 (KJS::arrayProtoFuncFilter): 123 (KJS::arrayProtoFuncMap): 124 (KJS::arrayProtoFuncEvery): 125 (KJS::arrayProtoFuncForEach): 126 (KJS::arrayProtoFuncSome): 127 (KJS::arrayProtoFuncIndexOf): 128 (KJS::arrayProtoFuncLastIndexOf): 129 (KJS::ArrayConstructor::ArrayConstructor): 130 (KJS::ArrayConstructor::construct): 131 (KJS::ArrayConstructor::callAsFunction): 132 * kjs/BooleanObject.cpp: 133 (KJS::BooleanPrototype::BooleanPrototype): 134 (KJS::booleanProtoFuncToString): 135 (KJS::BooleanConstructor::BooleanConstructor): 136 (KJS::BooleanConstructor::construct): 137 * kjs/FunctionPrototype.cpp: 138 (KJS::FunctionPrototype::FunctionPrototype): 139 (KJS::functionProtoFuncToString): 140 (KJS::FunctionConstructor::FunctionConstructor): 141 (KJS::FunctionConstructor::construct): 142 * kjs/JSActivation.cpp: 143 (KJS::JSActivation::createArgumentsObject): 144 * kjs/JSArray.cpp: 145 (KJS::JSArray::JSArray): 146 (KJS::JSArray::lengthGetter): 147 * kjs/JSFunction.cpp: 148 (KJS::JSFunction::lengthGetter): 149 (KJS::JSFunction::construct): 150 (KJS::Arguments::Arguments): 151 (KJS::encode): 152 (KJS::decode): 153 (KJS::globalFuncParseInt): 154 (KJS::globalFuncParseFloat): 155 (KJS::globalFuncEscape): 156 (KJS::globalFuncUnescape): 157 (KJS::PrototypeFunction::PrototypeFunction): 158 (KJS::PrototypeReflexiveFunction::PrototypeReflexiveFunction): 159 * kjs/JSImmediate.cpp: 160 (KJS::JSImmediate::toObject): 161 * kjs/JSLock.cpp: 162 (KJS::JSLock::registerThread): 163 * kjs/JSObject.cpp: 164 (KJS::JSObject::put): 165 (KJS::JSObject::defineGetter): 166 (KJS::JSObject::defineSetter): 167 (KJS::Error::create): 168 * kjs/JSObject.h: 169 (KJS::JSObject::putDirect): 170 * kjs/JSString.h: 171 (KJS::JSString::JSString): 172 * kjs/JSValue.cpp: 173 (KJS::JSCell::operator new): 174 (KJS::jsString): 175 (KJS::jsOwnedString): 176 * kjs/JSValue.h: 177 (KJS::JSNumberCell::operator new): 178 (KJS::jsNumberCell): 179 (KJS::jsNaN): 180 (KJS::jsNumber): 181 (KJS::JSCell::marked): 182 (KJS::JSCell::mark): 183 (KJS::JSValue::toJSNumber): 184 * kjs/MathObject.cpp: 185 (KJS::MathObject::getValueProperty): 186 (KJS::mathProtoFuncAbs): 187 (KJS::mathProtoFuncACos): 188 (KJS::mathProtoFuncASin): 189 (KJS::mathProtoFuncATan): 190 (KJS::mathProtoFuncATan2): 191 (KJS::mathProtoFuncCeil): 192 (KJS::mathProtoFuncCos): 193 (KJS::mathProtoFuncExp): 194 (KJS::mathProtoFuncFloor): 195 (KJS::mathProtoFuncLog): 196 (KJS::mathProtoFuncMax): 197 (KJS::mathProtoFuncMin): 198 (KJS::mathProtoFuncPow): 199 (KJS::mathProtoFuncRandom): 200 (KJS::mathProtoFuncRound): 201 (KJS::mathProtoFuncSin): 202 (KJS::mathProtoFuncSqrt): 203 (KJS::mathProtoFuncTan): 204 * kjs/NumberObject.cpp: 205 (KJS::NumberPrototype::NumberPrototype): 206 (KJS::numberProtoFuncToString): 207 (KJS::numberProtoFuncToLocaleString): 208 (KJS::numberProtoFuncToFixed): 209 (KJS::numberProtoFuncToExponential): 210 (KJS::numberProtoFuncToPrecision): 211 (KJS::NumberConstructor::NumberConstructor): 212 (KJS::NumberConstructor::getValueProperty): 213 (KJS::NumberConstructor::construct): 214 (KJS::NumberConstructor::callAsFunction): 215 * kjs/RegExpObject.cpp: 216 (KJS::RegExpPrototype::RegExpPrototype): 217 (KJS::regExpProtoFuncToString): 218 (KJS::RegExpObject::getValueProperty): 219 (KJS::RegExpConstructor::RegExpConstructor): 220 (KJS::RegExpMatchesArray::fillArrayInstance): 221 (KJS::RegExpConstructor::arrayOfMatches): 222 (KJS::RegExpConstructor::getBackref): 223 (KJS::RegExpConstructor::getLastParen): 224 (KJS::RegExpConstructor::getLeftContext): 225 (KJS::RegExpConstructor::getRightContext): 226 (KJS::RegExpConstructor::getValueProperty): 227 (KJS::RegExpConstructor::construct): 228 * kjs/RegExpObject.h: 229 * kjs/Shell.cpp: 230 (GlobalObject::GlobalObject): 231 (functionGC): 232 (functionRun): 233 (functionReadline): 234 (jscmain): 235 * kjs/date_object.cpp: 236 (KJS::formatLocaleDate): 237 (KJS::DatePrototype::DatePrototype): 238 (KJS::DateConstructor::DateConstructor): 239 (KJS::DateConstructor::construct): 240 (KJS::DateConstructor::callAsFunction): 241 (KJS::DateFunction::DateFunction): 242 (KJS::DateFunction::callAsFunction): 243 (KJS::dateProtoFuncToString): 244 (KJS::dateProtoFuncToUTCString): 245 (KJS::dateProtoFuncToDateString): 246 (KJS::dateProtoFuncToTimeString): 247 (KJS::dateProtoFuncToLocaleString): 248 (KJS::dateProtoFuncToLocaleDateString): 249 (KJS::dateProtoFuncToLocaleTimeString): 250 (KJS::dateProtoFuncValueOf): 251 (KJS::dateProtoFuncGetTime): 252 (KJS::dateProtoFuncGetFullYear): 253 (KJS::dateProtoFuncGetUTCFullYear): 254 (KJS::dateProtoFuncToGMTString): 255 (KJS::dateProtoFuncGetMonth): 256 (KJS::dateProtoFuncGetUTCMonth): 257 (KJS::dateProtoFuncGetDate): 258 (KJS::dateProtoFuncGetUTCDate): 259 (KJS::dateProtoFuncGetDay): 260 (KJS::dateProtoFuncGetUTCDay): 261 (KJS::dateProtoFuncGetHours): 262 (KJS::dateProtoFuncGetUTCHours): 263 (KJS::dateProtoFuncGetMinutes): 264 (KJS::dateProtoFuncGetUTCMinutes): 265 (KJS::dateProtoFuncGetSeconds): 266 (KJS::dateProtoFuncGetUTCSeconds): 267 (KJS::dateProtoFuncGetMilliSeconds): 268 (KJS::dateProtoFuncGetUTCMilliseconds): 269 (KJS::dateProtoFuncGetTimezoneOffset): 270 (KJS::dateProtoFuncSetTime): 271 (KJS::setNewValueFromTimeArgs): 272 (KJS::setNewValueFromDateArgs): 273 (KJS::dateProtoFuncSetYear): 274 (KJS::dateProtoFuncGetYear): 275 * kjs/error_object.cpp: 276 (KJS::ErrorPrototype::ErrorPrototype): 277 (KJS::errorProtoFuncToString): 278 (KJS::ErrorConstructor::ErrorConstructor): 279 (KJS::ErrorConstructor::construct): 280 (KJS::NativeErrorPrototype::NativeErrorPrototype): 281 (KJS::NativeErrorConstructor::NativeErrorConstructor): 282 (KJS::NativeErrorConstructor::construct): 283 * kjs/identifier.h: 284 * kjs/internal.cpp: 285 (KJS::StringObject::create): 286 (KJS::JSString::lengthGetter): 287 (KJS::JSString::indexGetter): 288 (KJS::JSString::indexNumericPropertyGetter): 289 * kjs/interpreter.cpp: 290 * kjs/list.cpp: 291 (KJS::ArgList::slowAppend): 292 * kjs/list.h: 293 * kjs/lookup.h: 294 (KJS::staticFunctionGetter): 295 (KJS::cacheGlobalObject): 296 * kjs/nodes.cpp: 297 (KJS::Node::emitThrowError): 298 (KJS::StringNode::emitCode): 299 (KJS::ArrayNode::emitCode): 300 (KJS::FuncDeclNode::makeFunction): 301 (KJS::FuncExprNode::makeFunction): 302 * kjs/nodes.h: 303 * kjs/object_object.cpp: 304 (KJS::ObjectPrototype::ObjectPrototype): 305 (KJS::objectProtoFuncToLocaleString): 306 (KJS::objectProtoFuncToString): 307 (KJS::ObjectConstructor::ObjectConstructor): 308 (KJS::ObjectConstructor::construct): 309 * kjs/protect.h: 310 (KJS::gcProtect): 311 (KJS::gcUnprotect): 312 * kjs/string_object.cpp: 313 (KJS::StringObject::StringObject): 314 (KJS::StringPrototype::StringPrototype): 315 (KJS::replace): 316 (KJS::stringProtoFuncCharAt): 317 (KJS::stringProtoFuncCharCodeAt): 318 (KJS::stringProtoFuncConcat): 319 (KJS::stringProtoFuncIndexOf): 320 (KJS::stringProtoFuncLastIndexOf): 321 (KJS::stringProtoFuncMatch): 322 (KJS::stringProtoFuncSearch): 323 (KJS::stringProtoFuncReplace): 324 (KJS::stringProtoFuncSlice): 325 (KJS::stringProtoFuncSplit): 326 (KJS::stringProtoFuncSubstr): 327 (KJS::stringProtoFuncSubstring): 328 (KJS::stringProtoFuncToLowerCase): 329 (KJS::stringProtoFuncToUpperCase): 330 (KJS::stringProtoFuncToLocaleLowerCase): 331 (KJS::stringProtoFuncToLocaleUpperCase): 332 (KJS::stringProtoFuncLocaleCompare): 333 (KJS::stringProtoFuncBig): 334 (KJS::stringProtoFuncSmall): 335 (KJS::stringProtoFuncBlink): 336 (KJS::stringProtoFuncBold): 337 (KJS::stringProtoFuncFixed): 338 (KJS::stringProtoFuncItalics): 339 (KJS::stringProtoFuncStrike): 340 (KJS::stringProtoFuncSub): 341 (KJS::stringProtoFuncSup): 342 (KJS::stringProtoFuncFontcolor): 343 (KJS::stringProtoFuncFontsize): 344 (KJS::stringProtoFuncAnchor): 345 (KJS::stringProtoFuncLink): 346 (KJS::StringConstructor::StringConstructor): 347 (KJS::StringConstructor::construct): 348 (KJS::StringConstructor::callAsFunction): 349 (KJS::StringConstructorFunction::StringConstructorFunction): 350 (KJS::StringConstructorFunction::callAsFunction): 351 * kjs/string_object.h: 352 (KJS::StringObjectThatMasqueradesAsUndefined::StringObjectThatMasqueradesAsUndefined): 353 * kjs/ustring.h: 354 Updated for the above changes. 355 1 356 2008-06-17 Timothy Hatcher <[email protected]> 2 357 -
trunk/JavaScriptCore/JavaScriptCore.exp
r34634 r34659 98 98 __ZN3KJS11PropertyMapD1Ev 99 99 __ZN3KJS12DateInstance4infoE 100 __ZN3KJS12JSGlobalData14sharedInstanceEv 100 101 __ZN3KJS12JSGlobalData14threadInstanceEv 101 102 __ZN3KJS12PropertySlot15undefinedGetterEPNS_9ExecStateERKNS_10IdentifierERKS0_ … … 107 108 __ZN3KJS12StringObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueE 108 109 __ZN3KJS12StringObject4infoE 109 __ZN3KJS12StringObjectC2EPNS_ 8JSObjectERKNS_7UStringE110 __ZN3KJS12StringObjectC2EPNS_9ExecStateEPNS_8JSObjectERKNS_7UStringE 110 111 __ZN3KJS13CodeGenerator21setDumpsGeneratedCodeEb 111 112 __ZN3KJS13StatementNode6setLocEii 112 __ZN3KJS13jsOwnedStringE RKNS_7UStringE113 __ZN3KJS13jsOwnedStringEPNS_9ExecStateERKNS_7UStringE 113 114 __ZN3KJS14JSGlobalObject10globalExecEv 114 115 __ZN3KJS14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE … … 121 122 __ZN3KJS14JSGlobalObject4markEv 122 123 __ZN3KJS14JSGlobalObjectD2Ev 124 __ZN3KJS14JSGlobalObjectnwEm 125 __ZN3KJS14JSGlobalObjectnwEmNS0_9SharedTagE 123 126 __ZN3KJS15JSWrapperObject4markEv 124 127 __ZN3KJS16InternalFunction11getCallDataERNS_8CallDataE … … 135 138 __ZN3KJS19initializeThreadingEv 136 139 __ZN3KJS23objectProtoFuncToStringEPNS_9ExecStateEPNS_8JSObjectERKNS_7ArgListE 140 __ZN3KJS4Heap14allocateNumberEm 141 __ZN3KJS4Heap15recordExtraCostEm 142 __ZN3KJS4Heap17globalObjectCountEv 143 __ZN3KJS4Heap20protectedObjectCountEv 144 __ZN3KJS4Heap23collectOnMainThreadOnlyEPNS_7JSValueE 145 __ZN3KJS4Heap25protectedObjectTypeCountsEv 146 __ZN3KJS4Heap26protectedGlobalObjectCountEv 147 __ZN3KJS4Heap4heapEPKNS_7JSValueE 148 __ZN3KJS4Heap4sizeEv 149 __ZN3KJS4Heap7collectEv 150 __ZN3KJS4Heap7protectEPNS_7JSValueE 151 __ZN3KJS4Heap8allocateEm 152 __ZN3KJS4Heap9unprotectEPNS_7JSValueE 137 153 __ZN3KJS5equalEPKNS_7UString3RepES3_ 138 154 __ZN3KJS6JSCell11getCallDataERNS_8CallDataE … … 143 159 __ZN3KJS6JSCell3putEPNS_9ExecStateEjPNS_7JSValueE 144 160 __ZN3KJS6JSCell9getObjectEv 145 __ZN3KJS6JSCellnwEm 161 __ZN3KJS6JSCellnwEmPNS_9ExecStateE 146 162 __ZN3KJS6JSLock12DropAllLocksC1Ev 147 163 __ZN3KJS6JSLock12DropAllLocksD1Ev … … 197 213 __ZN3KJS8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE 198 214 __ZN3KJS8Profiler8profilerEv 199 __ZN3KJS8jsStringEPKc 200 __ZN3KJS8jsStringERKNS_7UStringE 201 __ZN3KJS9Collector14allocateNumberEm 202 __ZN3KJS9Collector15recordExtraCostEm 203 __ZN3KJS9Collector17globalObjectCountEv 204 __ZN3KJS9Collector20protectedObjectCountEv 205 __ZN3KJS9Collector23collectOnMainThreadOnlyEPNS_7JSValueE 206 __ZN3KJS9Collector25protectedObjectTypeCountsEv 207 __ZN3KJS9Collector26protectedGlobalObjectCountEv 208 __ZN3KJS9Collector4sizeEv 209 __ZN3KJS9Collector7collectEv 210 __ZN3KJS9Collector7protectEPNS_7JSValueE 211 __ZN3KJS9Collector9unprotectEPNS_7JSValueE 215 __ZN3KJS8jsStringEPNS_9ExecStateEPKc 216 __ZN3KJS8jsStringEPNS_9ExecStateERKNS_7UStringE 212 217 __ZN3KJSeqERKNS_7UStringEPKc 213 218 __ZN3KJSgtERKNS_7UStringES2_ … … 247 252 __ZNK3KJS16JSVariableObject16isVariableObjectEv 248 253 __ZNK3KJS16JSVariableObject21getPropertyAttributesEPNS_9ExecStateERKNS_10IdentifierERj 249 __ZNK3KJS17DebuggerCallFrame4typeEv250 254 __ZNK3KJS17DebuggerCallFrame10thisObjectEv 251 255 __ZNK3KJS17DebuggerCallFrame12functionNameEv 256 __ZNK3KJS17DebuggerCallFrame4typeEv 252 257 __ZNK3KJS17DebuggerCallFrame8evaluateERKNS_7UStringERPNS_7JSValueE 253 258 __ZNK3KJS4Node8toStringEv -
trunk/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r34615 r34659 103 103 14D797810DAC3307001A9F05 /* RegisterFileStack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14D7977F0DAC3307001A9F05 /* RegisterFileStack.cpp */; }; 104 104 14DA81900D99FD2000B0A4FB /* JSActivation.h in Headers */ = {isa = PBXBuildFile; fileRef = 14DA818E0D99FD2000B0A4FB /* JSActivation.h */; }; 105 14DE0D690D02431400AACCA2 /* JSGlobalObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 14DE0D680D02431400AACCA2 /* JSGlobalObject.cpp */; };106 105 14E0FF120DBAAED00007C0AB /* Machine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 149B15E70D81F986009CB8C7 /* Machine.cpp */; settings = {COMPILER_FLAGS = "-fno-tree-pre"; }; }; 107 106 14F252570D08DD8D004ECFFF /* JSVariableObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F252560D08DD8D004ECFFF /* JSVariableObject.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1540 1539 1440FCE40A51E46B0005F061 /* JSClassRef.cpp in Sources */, 1541 1540 14BD5A300A3E91F600BAF59C /* JSContextRef.cpp in Sources */, 1542 14DE0D690D02431400AACCA2 /* JSGlobalObject.cpp in Sources */,1543 1541 1482B7E40A43076000517CFC /* JSObjectRef.cpp in Sources */, 1544 1542 1482B74E0A43032800517CFC /* JSStringRef.cpp in Sources */, -
trunk/JavaScriptCore/VM/CodeGenerator.cpp
r34610 r34659 569 569 emitOpcode(op_load); 570 570 instructions().append(dst->index()); 571 instructions().append(addConstant(jsNumber( d)));571 instructions().append(addConstant(jsNumber(globalExec(), d))); 572 572 return dst; 573 573 } -
trunk/JavaScriptCore/VM/CodeGenerator.h
r34607 r34659 279 279 CodeType codeType() const { return m_codeType; } 280 280 281 ExecState* globalExec() { return m_scopeChain->globalObject()->globalExec(); } 282 281 283 private: 282 284 void emitOpcode(OpcodeID); -
trunk/JavaScriptCore/VM/JSPropertyNameIterator.cpp
r34607 r34659 41 41 { 42 42 if (v->isUndefinedOrNull()) 43 return new JSPropertyNameIterator(0, 0, 0);43 return new (exec) JSPropertyNameIterator(0, 0, 0); 44 44 45 45 JSObject* o = v->toObject(exec); … … 47 47 o->getPropertyNames(exec, propertyNames); 48 48 size_t numProperties = propertyNames.size(); 49 return new JSPropertyNameIterator(o, propertyNames.releaseIdentifiers(), numProperties);49 return new (exec) JSPropertyNameIterator(o, propertyNames.releaseIdentifiers(), numProperties); 50 50 } 51 51 … … 115 115 while (m_position != m_end) { 116 116 if (m_object->hasProperty(exec, *m_position)) 117 return jsOwnedString( (*m_position++).ustring());;117 return jsOwnedString(exec, (*m_position++).ustring());; 118 118 m_position++; 119 119 } -
trunk/JavaScriptCore/VM/Machine.cpp
r34607 r34659 132 132 if (value.isNull()) 133 133 return throwOutOfMemoryError(exec); 134 return jsString( value);135 } 136 137 return jsNumber( p1->toNumber(exec) + p2->toNumber(exec));134 return jsString(exec, value); 135 } 136 137 return jsNumber(exec, p1->toNumber(exec) + p2->toNumber(exec)); 138 138 } 139 139 … … 154 154 155 155 if (bothTypes == ((NumberType << 3) | NumberType)) 156 return jsNumber( v1->uncheckedGetNumber() + v2->uncheckedGetNumber());156 return jsNumber(exec, v1->uncheckedGetNumber() + v2->uncheckedGetNumber()); 157 157 if (bothTypes == ((StringType << 3) | StringType)) { 158 158 UString value = static_cast<JSString*>(v1)->value() + static_cast<JSString*>(v2)->value(); 159 159 if (value.isNull()) 160 160 return throwOutOfMemoryError(exec); 161 return jsString( value);161 return jsString(exec, value); 162 162 } 163 163 … … 166 166 } 167 167 168 static JSValue* jsTypeStringForValue( JSValue* v)168 static JSValue* jsTypeStringForValue(ExecState* exec, JSValue* v) 169 169 { 170 170 switch (v->type()) { 171 171 case UndefinedType: 172 return jsString( "undefined");172 return jsString(exec, "undefined"); 173 173 case NullType: 174 return jsString( "object");174 return jsString(exec, "object"); 175 175 case BooleanType: 176 return jsString( "boolean");176 return jsString(exec, "boolean"); 177 177 case NumberType: 178 return jsString( "number");178 return jsString(exec, "number"); 179 179 case StringType: 180 return jsString( "string");180 return jsString(exec, "string"); 181 181 default: 182 182 if (v->isObject()) { … … 184 184 // as null when doing comparisons. 185 185 if (static_cast<JSObject*>(v)->masqueradeAsUndefined()) 186 return jsString( "undefined");186 return jsString(exec, "undefined"); 187 187 else if (static_cast<JSObject*>(v)->implementsCall()) 188 return jsString( "function");188 return jsString(exec, "function"); 189 189 } 190 190 191 return jsString( "object");191 return jsString(exec, "object"); 192 192 } 193 193 } … … 413 413 } 414 414 415 ALWAYS_INLINE ScopeChainNode* scopeChainForCall( FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r)415 ALWAYS_INLINE ScopeChainNode* scopeChainForCall(ExecState* exec, FunctionBodyNode* functionBodyNode, CodeBlock* newCodeBlock, ScopeChainNode* callDataScopeChain, Register** registerBase, Register* r) 416 416 { 417 417 if (newCodeBlock->needsFullScopeChain) { 418 JSActivation* activation = new JSActivation(functionBodyNode, registerBase, r - (*registerBase));418 JSActivation* activation = new (exec) JSActivation(functionBodyNode, registerBase, r - (*registerBase)); 419 419 r[Machine::OptionalCalleeActivation - Machine::CallFrameHeaderSize - newCodeBlock->numLocals].u.jsValue = activation; 420 420 … … 611 611 JSObject* exception = static_cast<JSObject*>(exceptionValue); 612 612 if (!exception->hasProperty(exec, Identifier(exec, "line")) && !exception->hasProperty(exec, Identifier(exec, "sourceURL"))) { 613 exception->put(exec, Identifier(exec, "line"), jsNumber( codeBlock->lineNumberForVPC(vPC)));614 exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString( codeBlock->ownerNode->sourceURL()));613 exception->put(exec, Identifier(exec, "line"), jsNumber(exec, codeBlock->lineNumberForVPC(vPC))); 614 exception->put(exec, Identifier(exec, "sourceURL"), jsOwnedString(exec, codeBlock->ownerNode->sourceURL())); 615 615 } 616 616 } … … 726 726 } 727 727 728 scopeChain = scopeChainForCall( functionBodyNode, newCodeBlock, scopeChain, registerBase, r);728 scopeChain = scopeChainForCall(exec, functionBodyNode, newCodeBlock, scopeChain, registerBase, r); 729 729 730 730 ExecState newExec(exec, this, registerFile, scopeChain, callFrameOffset); … … 971 971 int dst = (++vPC)->u.operand; 972 972 int regExp = (++vPC)->u.operand; 973 r[dst].u.jsValue = new RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]);973 r[dst].u.jsValue = new (exec) RegExpObject(scopeChain->globalObject()->regExpPrototype(), codeBlock->regexps[regExp]); 974 974 975 975 ++vPC; … … 1114 1114 result = JSImmediate::incImmediateNumber(v); 1115 1115 else 1116 result = jsNumber( v->toNumber(exec) + 1);1116 result = jsNumber(exec, v->toNumber(exec) + 1); 1117 1117 VM_CHECK_EXCEPTION(); 1118 1118 r[srcDst].u.jsValue = result; … … 1133 1133 result = JSImmediate::decImmediateNumber(v); 1134 1134 else 1135 result = jsNumber( v->toNumber(exec) - 1);1135 result = jsNumber(exec, v->toNumber(exec) - 1); 1136 1136 VM_CHECK_EXCEPTION(); 1137 1137 r[srcDst].u.jsValue = result; … … 1157 1157 } else { 1158 1158 number = r[srcDst].u.jsValue->toJSNumber(exec); 1159 result = jsNumber( number->uncheckedGetNumber() + 1);1159 result = jsNumber(exec, number->uncheckedGetNumber() + 1); 1160 1160 } 1161 1161 VM_CHECK_EXCEPTION(); … … 1184 1184 } else { 1185 1185 number = r[srcDst].u.jsValue->toJSNumber(exec); 1186 result = jsNumber( number->uncheckedGetNumber() - 1);1186 result = jsNumber(exec, number->uncheckedGetNumber() - 1); 1187 1187 } 1188 1188 VM_CHECK_EXCEPTION(); … … 1218 1218 int dst = (++vPC)->u.operand; 1219 1219 int src = (++vPC)->u.operand; 1220 JSValue* result = jsNumber( -r[src].u.jsValue->toNumber(exec));1220 JSValue* result = jsNumber(exec, -r[src].u.jsValue->toNumber(exec)); 1221 1221 VM_CHECK_EXCEPTION(); 1222 1222 r[dst].u.jsValue = result; … … 1255 1255 JSValue* src1 = r[(++vPC)->u.operand].u.jsValue; 1256 1256 JSValue* src2 = r[(++vPC)->u.operand].u.jsValue; 1257 JSValue* result = jsNumber( src1->toNumber(exec) * src2->toNumber(exec));1257 JSValue* result = jsNumber(exec, src1->toNumber(exec) * src2->toNumber(exec)); 1258 1258 VM_CHECK_EXCEPTION(); 1259 1259 dst = result; … … 1272 1272 int dividend = (++vPC)->u.operand; 1273 1273 int divisor = (++vPC)->u.operand; 1274 JSValue* result = jsNumber( r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec));1274 JSValue* result = jsNumber(exec, r[dividend].u.jsValue->toNumber(exec) / r[divisor].u.jsValue->toNumber(exec)); 1275 1275 VM_CHECK_EXCEPTION(); 1276 1276 r[dst].u.jsValue = result; … … 1289 1289 int divisor = (++vPC)->u.operand; 1290 1290 double d = r[dividend].u.jsValue->toNumber(exec); 1291 JSValue* result = jsNumber( fmod(d, r[divisor].u.jsValue->toNumber(exec)));1291 JSValue* result = jsNumber(exec, fmod(d, r[divisor].u.jsValue->toNumber(exec))); 1292 1292 VM_CHECK_EXCEPTION(); 1293 1293 r[dst].u.jsValue = result; … … 1309 1309 result = JSImmediate::subImmediateNumbers(src1, src2); 1310 1310 else { 1311 result = jsNumber( src1->toNumber(exec) - src2->toNumber(exec));1311 result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec)); 1312 1312 VM_CHECK_EXCEPTION(); 1313 1313 } … … 1328 1328 JSValue* result; 1329 1329 if (JSImmediate::areBothImmediateNumbers(val, shift)) 1330 result = jsNumber( JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f));1330 result = jsNumber(exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::toTruncatedUInt32(shift) & 0x1f)); 1331 1331 else { 1332 result = jsNumber( (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));1332 result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f)); 1333 1333 VM_CHECK_EXCEPTION(); 1334 1334 } … … 1352 1352 result = JSImmediate::rightShiftImmediateNumbers(val, shift); 1353 1353 else { 1354 result = jsNumber( (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));1354 result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f)); 1355 1355 VM_CHECK_EXCEPTION(); 1356 1356 } … … 1374 1374 result = JSImmediate::rightShiftImmediateNumbers(val, shift); 1375 1375 else { 1376 result = jsNumber( (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));1376 result = jsNumber(exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f)); 1377 1377 VM_CHECK_EXCEPTION(); 1378 1378 } … … 1396 1396 result = JSImmediate::andImmediateNumbers(src1, src2); 1397 1397 else { 1398 result = jsNumber( src1->toInt32(exec) & src2->toInt32(exec));1398 result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec)); 1399 1399 VM_CHECK_EXCEPTION(); 1400 1400 } … … 1418 1418 result = JSImmediate::xorImmediateNumbers(src1, src2); 1419 1419 else { 1420 result = jsNumber( src1->toInt32(exec) ^ src2->toInt32(exec));1420 result = jsNumber(exec, src1->toInt32(exec) ^ src2->toInt32(exec)); 1421 1421 VM_CHECK_EXCEPTION(); 1422 1422 } … … 1440 1440 result = JSImmediate::orImmediateNumbers(src1, src2); 1441 1441 else { 1442 result = jsNumber( src1->toInt32(exec) | src2->toInt32(exec));1442 result = jsNumber(exec, src1->toInt32(exec) | src2->toInt32(exec)); 1443 1443 VM_CHECK_EXCEPTION(); 1444 1444 } … … 1456 1456 int dst = (++vPC)->u.operand; 1457 1457 int src = (++vPC)->u.operand; 1458 JSValue* result = jsNumber( ~r[src].u.jsValue->toInt32(exec));1458 JSValue* result = jsNumber(exec, ~r[src].u.jsValue->toInt32(exec)); 1459 1459 VM_CHECK_EXCEPTION(); 1460 1460 r[dst].u.jsValue = result; … … 1510 1510 int dst = (++vPC)->u.operand; 1511 1511 int src = (++vPC)->u.operand; 1512 r[dst].u.jsValue = jsTypeStringForValue( r[src].u.jsValue);1512 r[dst].u.jsValue = jsTypeStringForValue(exec, r[src].u.jsValue); 1513 1513 1514 1514 ++vPC; … … 2096 2096 codeBlock = newCodeBlock; 2097 2097 exec->m_callFrameOffset = callFrameOffset; 2098 setScopeChain(exec, scopeChain, scopeChainForCall( functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));2098 setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r)); 2099 2099 k = codeBlock->jsValues.data(); 2100 2100 vPC = codeBlock->instructions.begin(); … … 2224 2224 else 2225 2225 prototype = scopeChain->globalObject()->objectPrototype(); 2226 JSObject* newObject = new JSObject(prototype);2226 JSObject* newObject = new (exec) JSObject(prototype); 2227 2227 r[firstArg].u.jsValue = newObject; // "this" value 2228 2228 … … 2239 2239 codeBlock = newCodeBlock; 2240 2240 exec->m_callFrameOffset = callFrameOffset; 2241 setScopeChain(exec, scopeChain, scopeChainForCall( functionBodyNode, codeBlock, callDataScopeChain, registerBase, r));2241 setScopeChain(exec, scopeChain, scopeChainForCall(exec, functionBodyNode, codeBlock, callDataScopeChain, registerBase, r)); 2242 2242 k = codeBlock->jsValues.data(); 2243 2243 vPC = codeBlock->instructions.begin(); … … 2551 2551 if (!activation) { 2552 2552 CodeBlock* codeBlock = &function->body->generatedCode(); 2553 activation = new JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals);2553 activation = new (exec) JSActivation(function->body, registerBase, callFrameOffset + CallFrameHeaderSize + codeBlock->numLocals); 2554 2554 callFrame[OptionalCalleeActivation].u.jsValue = activation; 2555 2555 } -
trunk/JavaScriptCore/VM/RegisterFile.h
r34372 r34659 137 137 void copyGlobals(RegisterFile* src); 138 138 139 void mark( )139 void mark(Heap* heap) 140 140 { 141 Collector::markStackObjectsConservatively(m_buffer, m_base + m_size);141 heap->markStackObjectsConservatively(m_buffer, m_base + m_size); 142 142 } 143 143 -
trunk/JavaScriptCore/VM/RegisterFileStack.h
r34372 r34659 52 52 RegisterFile* current() { return m_stack.last(); } 53 53 54 void mark( )54 void mark(Heap* heap) 55 55 { 56 56 Stack::iterator end = m_stack.end(); 57 57 for (Stack::iterator it = m_stack.begin(); it != end; ++it) 58 (*it)->mark( );58 (*it)->mark(heap); 59 59 } 60 60 -
trunk/JavaScriptCore/kjs/AllInOneFile.cpp
r34582 r34659 57 57 #include "NumberObject.cpp" 58 58 #include "JSObject.cpp" 59 #include "JSGlobalObject.cpp" 59 60 #include "object_object.cpp" 60 61 #include "operations.cpp" -
trunk/JavaScriptCore/kjs/ArrayPrototype.cpp
r34607 r34659 101 101 Vector<UChar, 256> strBuffer; 102 102 if (alreadyVisited) 103 return jsString( UString(0, 0)); // return an empty string, avoding infinite recursion.103 return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion. 104 104 105 105 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 129 129 } 130 130 exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj); 131 return jsString( UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));131 return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0)); 132 132 } 133 133 … … 144 144 Vector<UChar, 256> strBuffer; 145 145 if (alreadyVisited) 146 return jsString( UString(0, 0)); // return an empty string, avoding infinite recursion.146 return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion. 147 147 148 148 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); … … 178 178 } 179 179 exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj); 180 return jsString( UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));180 return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0)); 181 181 } 182 182 … … 190 190 Vector<UChar, 256> strBuffer; 191 191 if (alreadyVisited) 192 return jsString( UString(0, 0)); // return an empty string, avoding infinite recursion.192 return jsString(exec, UString(0, 0)); // return an empty string, avoding infinite recursion. 193 193 194 194 UChar comma = ','; … … 221 221 } 222 222 exec->dynamicGlobalObject()->arrayVisitedElements().remove(thisObj); 223 return jsString( UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0));223 return jsString(exec, UString(strBuffer.data(), strBuffer.data() ? strBuffer.size() : 0)); 224 224 } 225 225 … … 254 254 ++it; 255 255 } 256 arr->put(exec, exec->propertyNames().length, jsNumber( n));256 arr->put(exec, exec->propertyNames().length, jsNumber(exec, n)); 257 257 return arr; 258 258 } … … 263 263 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); 264 264 if (length == 0) { 265 thisObj->put(exec, exec->propertyNames().length, jsNumber( length));265 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length)); 266 266 result = jsUndefined(); 267 267 } else { 268 268 result = thisObj->get(exec, length - 1); 269 269 thisObj->deleteProperty(exec, length - 1); 270 thisObj->put(exec, exec->propertyNames().length, jsNumber( length - 1));270 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1)); 271 271 } 272 272 return result; … … 279 279 thisObj->put(exec, length + n, args[n]); 280 280 length += args.size(); 281 thisObj->put(exec, exec->propertyNames().length, jsNumber( length));282 return jsNumber( length);281 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length)); 282 return jsNumber(exec, length); 283 283 } 284 284 … … 312 312 unsigned length = thisObj->get(exec, exec->propertyNames().length)->toUInt32(exec); 313 313 if (length == 0) { 314 thisObj->put(exec, exec->propertyNames().length, jsNumber( length));314 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length)); 315 315 result = jsUndefined(); 316 316 } else { … … 323 323 } 324 324 thisObj->deleteProperty(exec, length - 1); 325 thisObj->put(exec, exec->propertyNames().length, jsNumber( length - 1));325 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - 1)); 326 326 } 327 327 return result; … … 367 367 resObj->put(exec, n, v); 368 368 } 369 resObj->put(exec, exec->propertyNames().length, jsNumber( n));369 resObj->put(exec, exec->propertyNames().length, jsNumber(exec, n)); 370 370 return result; 371 371 } … … 452 452 resObj->put(exec, k, v); 453 453 } 454 resObj->put(exec, exec->propertyNames().length, jsNumber( deleteCount));454 resObj->put(exec, exec->propertyNames().length, jsNumber(exec, deleteCount)); 455 455 456 456 unsigned additionalArgs = std::max<int>(args.size() - 2, 0); … … 477 477 thisObj->put(exec, k + begin, args[k + 2]); 478 478 479 thisObj->put(exec, exec->propertyNames().length, jsNumber( length - deleteCount + additionalArgs));479 thisObj->put(exec, exec->propertyNames().length, jsNumber(exec, length - deleteCount + additionalArgs)); 480 480 return result; 481 481 } … … 496 496 for (unsigned k = 0; k < nrArgs; ++k) 497 497 thisObj->put(exec, k, args[k]); 498 JSValue* result = jsNumber( length + nrArgs);498 JSValue* result = jsNumber(exec, length + nrArgs); 499 499 thisObj->put(exec, exec->propertyNames().length, result); 500 500 return result; … … 524 524 525 525 eachArguments.append(v); 526 eachArguments.append(jsNumber( k));526 eachArguments.append(jsNumber(exec, k)); 527 527 eachArguments.append(thisObj); 528 528 … … 546 546 547 547 ArgList mapArgs; 548 mapArgs.append(jsNumber( length));548 mapArgs.append(jsNumber(exec, length)); 549 549 JSObject* resultArray = static_cast<JSObject*>(exec->lexicalGlobalObject()->arrayConstructor()->construct(exec, mapArgs)); 550 550 … … 559 559 560 560 eachArguments.append(v); 561 eachArguments.append(jsNumber( k));561 eachArguments.append(jsNumber(exec, k)); 562 562 eachArguments.append(thisObj); 563 563 … … 595 595 596 596 eachArguments.append(slot.getValue(exec, k)); 597 eachArguments.append(jsNumber( k));597 eachArguments.append(jsNumber(exec, k)); 598 598 eachArguments.append(thisObj); 599 599 … … 626 626 ArgList eachArguments; 627 627 eachArguments.append(slot.getValue(exec, k)); 628 eachArguments.append(jsNumber( k));628 eachArguments.append(jsNumber(exec, k)); 629 629 eachArguments.append(thisObj); 630 630 … … 653 653 ArgList eachArguments; 654 654 eachArguments.append(slot.getValue(exec, k)); 655 eachArguments.append(jsNumber( k));655 eachArguments.append(jsNumber(exec, k)); 656 656 eachArguments.append(thisObj); 657 657 … … 689 689 continue; 690 690 if (strictEqual(searchElement, e)) 691 return jsNumber( index);692 } 693 694 return jsNumber( -1);691 return jsNumber(exec, index); 692 } 693 694 return jsNumber(exec, -1); 695 695 } 696 696 … … 707 707 d += length; 708 708 if (d < 0) 709 return jsNumber( -1);709 return jsNumber(exec, -1); 710 710 } 711 711 if (d < length) … … 718 718 continue; 719 719 if (strictEqual(searchElement, e)) 720 return jsNumber( index);721 } 722 723 return jsNumber( -1);720 return jsNumber(exec, index); 721 } 722 723 return jsNumber(exec, -1); 724 724 } 725 725 … … 733 733 734 734 // no. of arguments for constructor 735 putDirect(exec->propertyNames().length, jsNumber( 1), ReadOnly|DontDelete|DontEnum);735 putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum); 736 736 } 737 737 … … 749 749 if (n != args[0]->toNumber(exec)) 750 750 return throwError(exec, RangeError, "Array size is not a small enough positive integer."); 751 return new JSArray(exec->lexicalGlobalObject()->arrayPrototype(), n);751 return new (exec) JSArray(exec->lexicalGlobalObject()->arrayPrototype(), n); 752 752 } 753 753 754 754 // otherwise the array is constructed with the arguments in it 755 return new JSArray(exec->lexicalGlobalObject()->arrayPrototype(), args);755 return new (exec) JSArray(exec->lexicalGlobalObject()->arrayPrototype(), args); 756 756 } 757 757 … … 760 760 { 761 761 // equivalent to 'new Array(....)' 762 return construct(exec, args);763 } 764 765 } 762 return construct(exec, args); 763 } 764 765 } -
trunk/JavaScriptCore/kjs/BooleanObject.cpp
r34607 r34659 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 ArgList&) … … 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* BooleanConstructor::construct(ExecState* exec, const ArgList& args) 103 103 { 104 BooleanObject* obj(new BooleanObject(exec->lexicalGlobalObject()->booleanPrototype()));104 BooleanObject* obj(new (exec) BooleanObject(exec->lexicalGlobalObject()->booleanPrototype())); 105 105 obj->setInternalValue(jsBoolean(args[0]->toBoolean(exec))); 106 106 return obj; -
trunk/JavaScriptCore/kjs/ExecState.h
r34615 r34659 26 26 27 27 #include "JSGlobalData.h" 28 #include "LabelStack.h"29 #include "completion.h"30 #include "list.h"31 28 #include "ScopeChain.h" 32 29 … … 92 89 static const HashTable* stringTable(ExecState* exec) { return exec->m_globalData->stringTable; } 93 90 91 Heap* heap() const { return m_globalData->heap; } 92 94 93 private: 95 94 // Default constructor required for gcc 3. -
trunk/JavaScriptCore/kjs/FunctionPrototype.cpp
r34607 r34659 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(&JSFunction::info)) { 72 72 JSFunction* fi = static_cast<JSFunction*>(thisObj); 73 return jsString( "function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toSourceString());74 } 75 76 return jsString( "function " + static_cast<InternalFunction*>(thisObj)->functionName().ustring() + "() {\n [native code]\n}");73 return jsString(exec, "function " + fi->functionName().ustring() + "(" + fi->body->paramString() + ") " + fi->body->toSourceString()); 74 } 75 76 return jsString(exec, "function " + static_cast<InternalFunction*>(thisObj)->functionName().ustring() + "() {\n [native code]\n}"); 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 … … 175 175 ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue()); 176 176 177 JSFunction* fimp = new JSFunction(exec, functionName, functionBody.get(), scopeChain.node());177 JSFunction* fimp = new (exec) JSFunction(exec, functionName, functionBody.get(), scopeChain.node()); 178 178 179 179 // parse parameter list. throw syntax error on illegal identifiers -
trunk/JavaScriptCore/kjs/InitializeThreading.cpp
r34412 r34659 50 50 s_dtoaP5Mutex = new Mutex; 51 51 #if !PLATFORM(DARWIN) // Darwin has pthread_main_np(), and doesn't need registerAsMainThread() called. 52 Collector::registerAsMainThread();52 Heap::registerAsMainThread(); 53 53 #endif 54 54 JSGlobalData::threadInstance(); … … 62 62 #if PLATFORM(DARWIN) 63 63 pthread_once(&initializeThreadingKeyOnce, initializeThreadingOnce); 64 65 // FIXME: do we want heap introspector to work on other threads? 66 if (pthread_main_np()) 67 JSGlobalData::threadInstance().heap->initializeHeapIntrospector(); 64 68 #else 65 69 static bool initializedThreading = false; -
trunk/JavaScriptCore/kjs/JSActivation.cpp
r34587 r34659 187 187 exec->machine()->getFunctionAndArguments(registerBase(), callFrame, function, argv, argc); 188 188 ArgList args(reinterpret_cast<JSValue***>(registerBase()), argv - *registerBase(), argc); 189 return new Arguments(exec, function, args, this);189 return new (exec) Arguments(exec, function, args, this); 190 190 } 191 191 -
trunk/JavaScriptCore/kjs/JSArray.cpp
r34607 r34659 89 89 m_storage = static_cast<ArrayStorage*>(fastZeroedMalloc(storageSize(initialCapacity))); 90 90 91 Collector::reportExtraMemoryCost(initialCapacity * sizeof(JSValue*));91 Heap::heap(this)->reportExtraMemoryCost(initialCapacity * sizeof(JSValue*)); 92 92 93 93 checkConsistency(); … … 147 147 } 148 148 149 JSValue* JSArray::lengthGetter(ExecState* , const Identifier&, const PropertySlot& slot)150 { 151 return jsNumber( static_cast<JSArray*>(slot.slotBase())->m_length);149 JSValue* JSArray::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot) 150 { 151 return jsNumber(exec, static_cast<JSArray*>(slot.slotBase())->m_length); 152 152 } 153 153 -
trunk/JavaScriptCore/kjs/JSFunction.cpp
r34607 r34659 114 114 } 115 115 116 JSValue* JSFunction::lengthGetter(ExecState* , const Identifier&, const PropertySlot& slot)116 JSValue* JSFunction::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot) 117 117 { 118 118 JSFunction* thisObj = static_cast<JSFunction*>(slot.slotBase()); 119 return jsNumber( thisObj->body->parameters().size());119 return jsNumber(exec, thisObj->body->parameters().size()); 120 120 } 121 121 … … 196 196 proto = exec->lexicalGlobalObject()->objectPrototype(); 197 197 198 JSObject* thisObj = new JSObject(proto);198 JSObject* thisObj = new (exec) JSObject(proto); 199 199 200 200 JSValue* exception = 0; … … 285 285 { 286 286 putDirect(exec->propertyNames().callee, func, DontEnum); 287 putDirect(exec ->propertyNames().length, args.size(), DontEnum);287 putDirect(exec, exec->propertyNames().length, args.size(), DontEnum); 288 288 289 289 int i = 0; … … 356 356 } 357 357 } 358 return jsString( r);358 return jsString(exec, r); 359 359 } 360 360 … … 421 421 s.append(c); 422 422 } 423 return jsString( s);423 return jsString(exec, s); 424 424 } 425 425 … … 593 593 JSValue* globalFuncParseInt(ExecState* exec, JSObject*, const ArgList& args) 594 594 { 595 return jsNumber( parseInt(args[0]->toString(exec), args[1]->toInt32(exec)));595 return jsNumber(exec, parseInt(args[0]->toString(exec), args[1]->toInt32(exec))); 596 596 } 597 597 598 598 JSValue* globalFuncParseFloat(ExecState* exec, JSObject*, const ArgList& args) 599 599 { 600 return jsNumber( parseFloat(args[0]->toString(exec)));600 return jsNumber(exec, parseFloat(args[0]->toString(exec))); 601 601 } 602 602 … … 673 673 } 674 674 675 return jsString( r);675 return jsString(exec, r); 676 676 } 677 677 … … 698 698 } 699 699 700 return jsString( s);700 return jsString(exec, s); 701 701 } 702 702 … … 718 718 { 719 719 ASSERT_ARG(function, function); 720 putDirect(exec->propertyNames().length, jsNumber( len), DontDelete | ReadOnly | DontEnum);720 putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum); 721 721 } 722 722 … … 726 726 { 727 727 ASSERT_ARG(function, function); 728 putDirect(exec->propertyNames().length, jsNumber( len), DontDelete | ReadOnly | DontEnum);728 putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum); 729 729 } 730 730 … … 743 743 ASSERT_ARG(function, function); 744 744 ASSERT_ARG(cachedGlobalObject, cachedGlobalObject); 745 putDirect(exec->propertyNames().length, jsNumber( len), DontDelete | ReadOnly | DontEnum);745 putDirect(exec->propertyNames().length, jsNumber(exec, len), DontDelete | ReadOnly | DontEnum); 746 746 } 747 747 -
trunk/JavaScriptCore/kjs/JSGlobalData.cpp
r34607 r34659 39 39 40 40 #if USE(MULTIPLE_THREADS) 41 #include <wtf/Threading.h> 41 42 #include <wtf/ThreadSpecific.h> 42 43 #endif … … 56 57 57 58 JSGlobalData::JSGlobalData() 58 //: heap(new Heap)59 : heap(new Heap) 59 60 #if USE(MULTIPLE_THREADS) 60 :arrayTable(new HashTable(KJS::arrayTable))61 , arrayTable(new HashTable(KJS::arrayTable)) 61 62 , dateTable(new HashTable(KJS::dateTable)) 62 63 , mathTable(new HashTable(KJS::mathTable)) … … 66 67 , stringTable(new HashTable(KJS::stringTable)) 67 68 #else 68 :arrayTable(&KJS::arrayTable)69 , arrayTable(&KJS::arrayTable) 69 70 , dateTable(&KJS::dateTable) 70 71 , mathTable(&KJS::mathTable) … … 119 120 } 120 121 122 JSGlobalData& JSGlobalData::sharedInstance() 123 { 124 return threadInstance(); 125 /* 126 #if USE(MULTIPLE_THREADS) 127 AtomicallyInitializedStatic(JSGlobalData, sharedInstance); 128 #else 129 static JSGlobalData sharedInstance; 130 #endif 131 return sharedInstance; 132 */ 121 133 } 134 135 } -
trunk/JavaScriptCore/kjs/JSGlobalData.h
r34587 r34659 31 31 32 32 #include "list.h" 33 #include "ustring.h"34 33 #include <wtf/HashCountedSet.h> 35 34 #include <wtf/HashSet.h> … … 43 42 44 43 class CommonIdentifiers; 45 //class Heap;44 class Heap; 46 45 class IdentifierTable; 47 46 class JSGlobalObject; … … 57 56 struct JSGlobalData : Noncopyable { 58 57 static JSGlobalData& threadInstance(); 58 static JSGlobalData& sharedInstance(); 59 59 60 //Heap* heap;60 Heap* heap; 61 61 62 62 const HashTable* arrayTable; -
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r34607 r34659 90 90 } 91 91 92 JSGlobalObject* JSGlobalObject::s_head = 0;93 94 92 JSGlobalObject::~JSGlobalObject() 95 93 { 96 ASSERT(JSLock::currentThreadIsHoldingLock());97 98 94 if (d()->debugger) 99 95 d()->debugger->detach(this); … … 101 97 d()->next->d()->prev = d()->prev; 102 98 d()->prev->d()->next = d()->next; 103 s_head = d()->next; 104 if (s_head == this) 105 s_head = 0; 99 JSGlobalObject*& headObject = head(); 100 if (headObject == this) 101 headObject = d()->next; 102 if (headObject == this) 103 headObject = 0; 106 104 107 105 HashSet<ProgramCodeBlock*>::const_iterator end = codeBlocks().end(); … … 116 114 ASSERT(JSLock::currentThreadIsHoldingLock()); 117 115 118 if ( s_head) {119 d()->prev = s_head;120 d()->next = s_head->d()->next;121 s_head->d()->next->d()->prev = this;122 s_head->d()->next = this;116 if (JSGlobalObject*& headObject = head()) { 117 d()->prev = headObject; 118 d()->next = headObject->d()->next; 119 headObject->d()->next->d()->prev = this; 120 headObject->d()->next = this; 123 121 } else 124 s_head= d()->next = d()->prev = this;122 headObject = d()->next = d()->prev = this; 125 123 126 124 resetTimeoutCheck(); … … 142 140 void JSGlobalObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value) 143 141 { 142 ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 143 144 144 if (symbolTablePut(propertyName, value)) 145 145 return; … … 235 235 236 236 // Prototypes 237 d()->functionPrototype = new FunctionPrototype(exec);238 d()->objectPrototype = new ObjectPrototype(exec, d()->functionPrototype);237 d()->functionPrototype = new (exec) FunctionPrototype(exec); 238 d()->objectPrototype = new (exec) ObjectPrototype(exec, d()->functionPrototype); 239 239 d()->functionPrototype->setPrototype(d()->objectPrototype); 240 240 241 d()->arrayPrototype = new ArrayPrototype(exec, d()->objectPrototype);242 d()->stringPrototype = new StringPrototype(exec, d()->objectPrototype);243 d()->booleanPrototype = new BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype);244 d()->numberPrototype = new NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype);245 d()->datePrototype = new DatePrototype(exec, d()->objectPrototype);246 d()->regExpPrototype = new RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype);247 d()->errorPrototype = new ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype);248 249 d()->evalErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError");250 d()->rangeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError");251 d()->referenceErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError");252 d()->syntaxErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError");253 d()->typeErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError");254 d()->URIErrorPrototype = new NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError");241 d()->arrayPrototype = new (exec) ArrayPrototype(exec, d()->objectPrototype); 242 d()->stringPrototype = new (exec) StringPrototype(exec, d()->objectPrototype); 243 d()->booleanPrototype = new (exec) BooleanPrototype(exec, d()->objectPrototype, d()->functionPrototype); 244 d()->numberPrototype = new (exec) NumberPrototype(exec, d()->objectPrototype, d()->functionPrototype); 245 d()->datePrototype = new (exec) DatePrototype(exec, d()->objectPrototype); 246 d()->regExpPrototype = new (exec) RegExpPrototype(exec, d()->objectPrototype, d()->functionPrototype); 247 d()->errorPrototype = new (exec) ErrorPrototype(exec, d()->objectPrototype, d()->functionPrototype); 248 249 d()->evalErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "EvalError", "EvalError"); 250 d()->rangeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "RangeError", "RangeError"); 251 d()->referenceErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "ReferenceError", "ReferenceError"); 252 d()->syntaxErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "SyntaxError", "SyntaxError"); 253 d()->typeErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "TypeError", "TypeError"); 254 d()->URIErrorPrototype = new (exec) NativeErrorPrototype(exec, d()->errorPrototype, "URIError", "URIError"); 255 255 256 256 // Constructors 257 d()->objectConstructor = new ObjectConstructor(exec, d()->objectPrototype, d()->functionPrototype);258 d()->functionConstructor = new FunctionConstructor(exec, d()->functionPrototype);259 d()->arrayConstructor = new ArrayConstructor(exec, d()->functionPrototype, d()->arrayPrototype);260 d()->stringConstructor = new StringConstructor(exec, d()->functionPrototype, d()->stringPrototype);261 d()->booleanConstructor = new BooleanConstructor(exec, d()->functionPrototype, d()->booleanPrototype);262 d()->numberConstructor = new NumberConstructor(exec, d()->functionPrototype, d()->numberPrototype);263 d()->dateConstructor = new DateConstructor(exec, d()->functionPrototype, d()->datePrototype);264 d()->regExpConstructor = new RegExpConstructor(exec, d()->functionPrototype, d()->regExpPrototype);265 d()->errorConstructor = new ErrorConstructor(exec, d()->functionPrototype, d()->errorPrototype);266 267 d()->evalErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->evalErrorPrototype);268 d()->rangeErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->rangeErrorPrototype);269 d()->referenceErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->referenceErrorPrototype);270 d()->syntaxErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->syntaxErrorPrototype);271 d()->typeErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->typeErrorPrototype);272 d()->URIErrorConstructor = new NativeErrorConstructor(exec, d()->functionPrototype, d()->URIErrorPrototype);257 d()->objectConstructor = new (exec) ObjectConstructor(exec, d()->objectPrototype, d()->functionPrototype); 258 d()->functionConstructor = new (exec) FunctionConstructor(exec, d()->functionPrototype); 259 d()->arrayConstructor = new (exec) ArrayConstructor(exec, d()->functionPrototype, d()->arrayPrototype); 260 d()->stringConstructor = new (exec) StringConstructor(exec, d()->functionPrototype, d()->stringPrototype); 261 d()->booleanConstructor = new (exec) BooleanConstructor(exec, d()->functionPrototype, d()->booleanPrototype); 262 d()->numberConstructor = new (exec) NumberConstructor(exec, d()->functionPrototype, d()->numberPrototype); 263 d()->dateConstructor = new (exec) DateConstructor(exec, d()->functionPrototype, d()->datePrototype); 264 d()->regExpConstructor = new (exec) RegExpConstructor(exec, d()->functionPrototype, d()->regExpPrototype); 265 d()->errorConstructor = new (exec) ErrorConstructor(exec, d()->functionPrototype, d()->errorPrototype); 266 267 d()->evalErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->evalErrorPrototype); 268 d()->rangeErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->rangeErrorPrototype); 269 d()->referenceErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->referenceErrorPrototype); 270 d()->syntaxErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->syntaxErrorPrototype); 271 d()->typeErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->typeErrorPrototype); 272 d()->URIErrorConstructor = new (exec) NativeErrorConstructor(exec, d()->functionPrototype, d()->URIErrorPrototype); 273 273 274 274 d()->functionPrototype->putDirect(exec->propertyNames().constructor, d()->functionConstructor, DontEnum); … … 312 312 // Set global values. 313 313 GlobalPropertyInfo staticGlobals[] = { 314 GlobalPropertyInfo(Identifier(exec, "Math"), new MathObject(exec, d()->objectPrototype), DontEnum | DontDelete),315 GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN( ), DontEnum | DontDelete),316 GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber( Inf), DontEnum | DontDelete),314 GlobalPropertyInfo(Identifier(exec, "Math"), new (exec) MathObject(exec, d()->objectPrototype), DontEnum | DontDelete), 315 GlobalPropertyInfo(Identifier(exec, "NaN"), jsNaN(exec), DontEnum | DontDelete), 316 GlobalPropertyInfo(Identifier(exec, "Infinity"), jsNumber(exec, Inf), DontEnum | DontDelete), 317 317 GlobalPropertyInfo(Identifier(exec, "undefined"), jsUndefined(), DontEnum | DontDelete) 318 318 }; … … 322 322 // Set global functions. 323 323 324 d()->evalFunction = new PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this);324 d()->evalFunction = new (exec) PrototypeReflexiveFunction(exec, d()->functionPrototype, 1, exec->propertyNames().eval, globalFuncEval, this); 325 325 putDirectFunction(d()->evalFunction, DontEnum); 326 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);327 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);328 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);329 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);330 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);331 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);332 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);333 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);334 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);335 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);326 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum); 327 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum); 328 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum); 329 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum); 330 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum); 331 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum); 332 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum); 333 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum); 334 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum); 335 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum); 336 336 #ifndef NDEBUG 337 putDirectFunction(new PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);337 putDirectFunction(new (exec) PrototypeFunction(exec, d()->functionPrototype, 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum); 338 338 #endif 339 339 … … 412 412 (*it)->mark(); 413 413 414 registerFileStack().mark( );414 registerFileStack().mark(globalData()->heap); 415 415 416 416 markIfNeeded(d()->globalExec->exception()); … … 466 466 } 467 467 468 void* JSGlobalObject::operator new(size_t size) 469 { 470 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 471 return JSGlobalData::threadInstance().heap->inlineAllocate(size); 472 #else 473 return JSGlobalData::threadInstance().heap->allocate(size); 474 #endif 475 } 476 477 void* JSGlobalObject::operator new(size_t size, SharedTag) 478 { 479 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 480 return JSGlobalData::sharedInstance().heap->inlineAllocate(size); 481 #else 482 return JSGlobalData::sharedInstance().heap->allocate(size); 483 #endif 484 } 468 485 469 486 } // namespace KJS -
trunk/JavaScriptCore/kjs/JSGlobalObject.h
r34580 r34659 171 171 virtual void putWithAttributes(ExecState*, const Identifier& propertyName, JSValue* value, unsigned attributes); 172 172 173 174 173 virtual void defineGetter(ExecState*, const Identifier& propertyName, JSObject* getterFunc); 175 174 virtual void defineSetter(ExecState*, const Identifier& propertyName, JSObject* setterFunc); … … 261 260 JSGlobalData* globalData() { return d()->globalData; } 262 261 262 enum SharedTag { Shared }; 263 void* operator new(size_t); 264 void* operator new(size_t, SharedTag); 265 263 266 void init(JSObject* thisValue); 264 267 … … 283 286 bool checkTimeout(); 284 287 void resetTimeoutCheck(); 285 286 static JSGlobalObject* s_head;287 288 }; 288 289 -
trunk/JavaScriptCore/kjs/JSImmediate.cpp
r34587 r34659 34 34 ASSERT(isImmediate(v)); 35 35 if (v == jsNull()) 36 return new JSNotAnObject(throwError(exec, TypeError, "Null value"));36 return new (exec) JSNotAnObject(throwError(exec, TypeError, "Null value")); 37 37 else if (v == jsUndefined()) 38 return new JSNotAnObject(throwError(exec, TypeError, "Undefined value"));38 return new (exec) JSNotAnObject(throwError(exec, TypeError, "Undefined value")); 39 39 else if (isBoolean(v)) { 40 40 ArgList args; -
trunk/JavaScriptCore/kjs/JSImmediate.h
r34265 r34659 353 353 } 354 354 355 ALWAYS_INLINE JSValue* jsUndefined() 356 { 357 return JSImmediate::undefinedImmediate(); 358 } 359 360 inline JSValue* jsNull() 361 { 362 return JSImmediate::nullImmediate(); 363 } 364 365 inline JSValue* jsBoolean(bool b) 366 { 367 return b ? JSImmediate::trueImmediate() : JSImmediate::falseImmediate(); 368 } 369 355 370 } // namespace KJS 356 371 -
trunk/JavaScriptCore/kjs/JSLock.cpp
r33038 r34659 83 83 void JSLock::registerThread() 84 84 { 85 Collector::registerThread();85 Heap::registerThread(); 86 86 } 87 87 -
trunk/JavaScriptCore/kjs/JSObject.cpp
r34607 r34659 97 97 { 98 98 ASSERT(value); 99 ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(this)); 99 100 100 101 if (propertyName == exec->propertyNames().underscoreProto) { … … 294 295 } 295 296 296 void JSObject::defineGetter(ExecState* , const Identifier& propertyName, JSObject* getterFunc)297 void JSObject::defineGetter(ExecState* exec, const Identifier& propertyName, JSObject* getterFunc) 297 298 { 298 299 JSValue *o = getDirect(propertyName); … … 302 303 gs = static_cast<GetterSetter *>(o); 303 304 } else { 304 gs = new GetterSetter;305 gs = new (exec) GetterSetter; 305 306 putDirect(propertyName, gs, IsGetterSetter); 306 307 } … … 310 311 } 311 312 312 void JSObject::defineSetter(ExecState* , const Identifier& propertyName, JSObject* setterFunc)313 void JSObject::defineSetter(ExecState* exec, const Identifier& propertyName, JSObject* setterFunc) 313 314 { 314 315 JSValue *o = getDirect(propertyName); … … 318 319 gs = static_cast<GetterSetter *>(o); 319 320 } else { 320 gs = new GetterSetter;321 gs = new (exec) GetterSetter; 321 322 putDirect(propertyName, gs, IsGetterSetter); 322 323 } … … 557 558 ArgList args; 558 559 if (message.isEmpty()) 559 args.append(jsString( name));560 args.append(jsString(exec, name)); 560 561 else 561 args.append(jsString( message));562 args.append(jsString(exec, message)); 562 563 JSObject *err = static_cast<JSObject *>(cons->construct(exec,args)); 563 564 564 565 if (lineno != -1) 565 err->put(exec, Identifier(exec, "line"), jsNumber( lineno));566 err->put(exec, Identifier(exec, "line"), jsNumber(exec, lineno)); 566 567 if (sourceId != -1) 567 err->put(exec, Identifier(exec, "sourceId"), jsNumber( sourceId));568 err->put(exec, Identifier(exec, "sourceId"), jsNumber(exec, sourceId)); 568 569 569 570 if(!sourceURL.isNull()) 570 err->put(exec, Identifier(exec, "sourceURL"), jsString( sourceURL));571 err->put(exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL)); 571 572 572 573 return err; -
trunk/JavaScriptCore/kjs/JSObject.h
r34587 r34659 421 421 { return _prop.getLocation(propertyName, isWriteable); } 422 422 void putDirect(const Identifier &propertyName, JSValue *value, int attr = 0); 423 void putDirect( const Identifier &propertyName, int value, int attr = 0);423 void putDirect(ExecState*, const Identifier& propertyName, int value, int attr = 0); 424 424 void removeDirect(const Identifier &propertyName); 425 425 … … 487 487 { 488 488 ASSERT(proto); 489 ASSERT(Heap::heap(this) == Heap::heap(proto)); 489 490 } 490 491 … … 630 631 } 631 632 632 inline void JSObject::putDirect( const Identifier &propertyName, int value, int attr)633 { 634 _prop.put(propertyName, jsNumber( value), attr);633 inline void JSObject::putDirect(ExecState* exec, const Identifier &propertyName, int value, int attr) 634 { 635 _prop.put(propertyName, jsNumber(exec, value), attr); 635 636 } 636 637 -
trunk/JavaScriptCore/kjs/JSString.h
r34582 r34659 32 32 class JSString : public JSCell { 33 33 public: 34 JSString(const UString& value) : m_value(value) { Collector::reportExtraMemoryCost(value.cost()); }34 JSString(const UString& value) : m_value(value) { Heap::heap(this)->reportExtraMemoryCost(value.cost()); } 35 35 enum HasOtherOwnerType { HasOtherOwner }; 36 36 JSString(const UString& value, HasOtherOwnerType) : m_value(value) { } -
trunk/JavaScriptCore/kjs/JSValue.cpp
r34581 r34659 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 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 86 return exec->heap()->inlineAllocate(size); 87 #else 88 return exec->heap()->allocate(size); 89 #endif 86 90 } 87 91 … … 257 261 } 258 262 259 JSCell* jsString( const char* s)260 { 261 return new JSString(s ? s : "");262 } 263 264 JSCell* jsString( const UString& s)265 { 266 return s.isNull() ? new JSString("") : newJSString(s);267 } 268 269 JSCell* jsOwnedString( const UString& s)270 { 271 return s.isNull() ? new JSString("", JSString::HasOtherOwner) : newJSString(s, JSString::HasOtherOwner);263 JSCell* jsString(ExecState* exec, const char* s) 264 { 265 return new (exec) JSString(s ? s : ""); 266 } 267 268 JSCell* jsString(ExecState* exec, const UString& s) 269 { 270 return s.isNull() ? new (exec) JSString("") : new (exec) JSString(s); 271 } 272 273 JSCell* jsOwnedString(ExecState* exec, const UString& s) 274 { 275 return s.isNull() ? new (exec) JSString("", JSString::HasOtherOwner) : new (exec) JSString(s, JSString::HasOtherOwner); 272 276 } 273 277 -
trunk/JavaScriptCore/kjs/JSValue.h
r34582 r34659 26 26 #include "CallData.h" 27 27 #include "ConstructData.h" 28 #include "ExecState.h" 28 29 #include "JSImmediate.h" 29 30 #include "collector.h" … … 52 53 class JSValue : Noncopyable { 53 54 friend class JSCell; // so it can derive from this class 54 friend class Collector; // so it can call asCell()55 friend class Heap; // so it can call asCell() 55 56 private: 56 57 JSValue(); … … 142 143 143 144 class JSCell : public JSValue { 144 friend class Collector;145 friend class Heap; 145 146 friend class GetterSetter; 146 147 friend class JSObject; … … 186 187 187 188 // Garbage collection. 188 void* operator new(size_t );189 void* operator new(size_t, ExecState*); 189 190 virtual void mark(); 190 191 bool marked() const; … … 202 203 203 204 class JSNumberCell : public JSCell { 204 friend JSValue* jsNumberCell( double);205 friend JSValue* jsNumberCell(ExecState*, double); 205 206 public: 206 207 double value() const { return val; } … … 216 217 virtual JSObject* toThisObject(ExecState*) const; 217 218 218 void* operator new(size_t size )219 void* operator new(size_t size, ExecState* exec) 219 220 { 220 221 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 221 return Collector::inlineAllocateNumber(size);222 return exec->heap()->inlineAllocateNumber(size); 222 223 #else 223 return Collector::allocateNumber(size);224 return exec->heap()->allocateNumber(size); 224 225 #endif 225 226 } … … 238 239 }; 239 240 240 JSCell* jsString( const UString&); // returns empty string if passed null string241 JSCell* jsString( const char* = ""); // returns empty string if passed 0241 JSCell* jsString(ExecState*, const UString&); // returns empty string if passed null string 242 JSCell* jsString(ExecState*, const char* = ""); // returns empty string if passed 0 242 243 243 244 // should be used for strings that are owned by an object that will 244 245 // likely outlive the JSValue this makes, such as the parse tree or a 245 246 // DOM object that contains a UString 246 JSCell* jsOwnedString( const UString&);247 JSCell* jsOwnedString(ExecState*, const UString&); 247 248 248 249 extern const double NaN; … … 251 252 // Beware marking this function ALWAYS_INLINE: It takes a PIC branch, so 252 253 // inlining it may not always be a win. 253 inline JSValue* jsNumberCell(double d) 254 { 255 return new JSNumberCell(d); 256 } 257 258 ALWAYS_INLINE JSValue* jsUndefined() 259 { 260 return JSImmediate::undefinedImmediate(); 261 } 262 263 inline JSValue* jsNull() 264 { 265 return JSImmediate::nullImmediate(); 266 } 267 268 inline JSValue* jsNaN() 269 { 270 return jsNumberCell(NaN); 271 } 272 273 inline JSValue* jsBoolean(bool b) 274 { 275 return b ? JSImmediate::trueImmediate() : JSImmediate::falseImmediate(); 276 } 277 278 ALWAYS_INLINE JSValue* jsNumber(double d) 254 inline JSValue* jsNumberCell(ExecState* exec, double d) 255 { 256 return new (exec) JSNumberCell(d); 257 } 258 259 inline JSValue* jsNaN(ExecState* exec) 260 { 261 return jsNumberCell(exec, NaN); 262 } 263 264 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, double d) 279 265 { 280 266 JSValue* v = JSImmediate::from(d); 281 return v ? v : jsNumberCell( d);282 } 283 284 ALWAYS_INLINE JSValue* jsNumber( int i)267 return v ? v : jsNumberCell(exec, d); 268 } 269 270 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, int i) 285 271 { 286 272 JSValue* v = JSImmediate::from(i); 287 return v ? v : jsNumberCell( i);288 } 289 290 ALWAYS_INLINE JSValue* jsNumber( unsigned i)273 return v ? v : jsNumberCell(exec, i); 274 } 275 276 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned i) 291 277 { 292 278 JSValue* v = JSImmediate::from(i); 293 return v ? v : jsNumberCell( i);294 } 295 296 ALWAYS_INLINE JSValue* jsNumber( long i)279 return v ? v : jsNumberCell(exec, i); 280 } 281 282 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long i) 297 283 { 298 284 JSValue* v = JSImmediate::from(i); 299 return v ? v : jsNumberCell( i);300 } 301 302 ALWAYS_INLINE JSValue* jsNumber( unsigned long i)285 return v ? v : jsNumberCell(exec, i); 286 } 287 288 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long i) 303 289 { 304 290 JSValue* v = JSImmediate::from(i); 305 return v ? v : jsNumberCell( i);306 } 307 308 ALWAYS_INLINE JSValue* jsNumber( long long i)291 return v ? v : jsNumberCell(exec, i); 292 } 293 294 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, long long i) 309 295 { 310 296 JSValue* v = JSImmediate::from(i); 311 return v ? v : jsNumberCell( static_cast<double>(i));312 } 313 314 ALWAYS_INLINE JSValue* jsNumber( unsigned long long i)297 return v ? v : jsNumberCell(exec, static_cast<double>(i)); 298 } 299 300 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned long long i) 315 301 { 316 302 JSValue* v = JSImmediate::from(i); 317 return v ? v : jsNumberCell(static_cast<double>(i)); 318 } 319 320 ALWAYS_INLINE JSValue* jsNumberFromAnd(ExecState *exec, JSValue* v1, JSValue* v2) 321 { 322 if (JSImmediate::areBothImmediateNumbers(v1, v2)) 323 return JSImmediate::andImmediateNumbers(v1, v2); 324 return jsNumber(v1->toInt32(exec) & v2->toInt32(exec)); 303 return v ? v : jsNumberCell(exec, static_cast<double>(i)); 325 304 } 326 305 … … 358 337 inline bool JSCell::marked() const 359 338 { 360 return Collector::isCellMarked(this);339 return Heap::isCellMarked(this); 361 340 } 362 341 363 342 inline void JSCell::mark() 364 343 { 365 return Collector::markCell(this);344 return Heap::markCell(this); 366 345 } 367 346 … … 536 515 ALWAYS_INLINE JSValue* JSValue::toJSNumber(ExecState* exec) const 537 516 { 538 return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber( this->toNumber(exec));517 return JSImmediate::isNumber(this) ? const_cast<JSValue*>(this) : jsNumber(exec, this->toNumber(exec)); 539 518 } 540 519 -
trunk/JavaScriptCore/kjs/MathObject.cpp
r34587 r34659 77 77 } 78 78 79 JSValue* MathObject::getValueProperty(ExecState* , int token) const79 JSValue* MathObject::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 ArgList& 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 ArgList& 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 ArgList& 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 ArgList& 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 ArgList& 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 ArgList& 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 ArgList& 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 jsNaN( );203 return jsNaN(exec); 204 204 if (isinf(arg2) && fabs(arg) == 1) 205 return jsNaN( );206 return jsNumber( pow(arg, arg2));207 } 208 209 JSValue* mathProtoFuncRandom(ExecState* , JSObject*, const ArgList&)205 return jsNaN(exec); 206 return jsNumber(exec, pow(arg, arg2)); 207 } 208 209 JSValue* mathProtoFuncRandom(ExecState* exec, JSObject*, const ArgList&) 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 ArgList& 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 ArgList& 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 ArgList& 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/NumberObject.cpp
r34607 r34659 56 56 : NumberObject(objectPrototype) 57 57 { 58 setInternalValue(jsNumber( 0));58 setInternalValue(jsNumber(exec, 0)); 59 59 60 60 // The constructor will be added later, after NumberConstructor 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<NumberObject*>(thisObj)->internalValue()->toString(exec));216 return jsString(exec, static_cast<NumberObject*>(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* NumberConstructor::getValueProperty(ExecState* , int token) const479 JSValue* NumberConstructor::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 NumberObject* obj = new NumberObject(proto);507 NumberObject* obj = new (exec) NumberObject(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/PropertyMap.h
r34582 r34659 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 { … … 111 90 { 112 91 } 113 114 inline SavedProperty::SavedProperty()115 #ifndef NDEBUG116 : m_name(0)117 , m_value(0)118 , m_attributes(0)119 #endif120 {121 }122 123 inline void SavedProperty::init(UString::Rep* name, JSValue* value, unsigned attributes)124 {125 ASSERT(name);126 ASSERT(value);127 128 ASSERT(!m_name);129 ASSERT(!m_value);130 ASSERT(!m_attributes);131 132 m_name = name;133 m_value = value;134 m_attributes = attributes;135 name->ref();136 gcProtect(value);137 }138 139 inline SavedProperty::~SavedProperty()140 {141 ASSERT(m_name);142 ASSERT(m_value);143 144 m_name->deref();145 gcUnprotect(m_value);146 }147 148 inline UString::Rep* SavedProperty::name() const149 {150 ASSERT(m_name);151 ASSERT(m_value);152 153 return m_name;154 }155 156 inline JSValue* SavedProperty::value() const157 {158 ASSERT(m_name);159 ASSERT(m_value);160 161 return m_value;162 }163 164 inline unsigned SavedProperty::attributes() const165 {166 ASSERT(m_name);167 ASSERT(m_value);168 169 return m_attributes;170 }171 172 92 } // namespace 173 93 -
trunk/JavaScriptCore/kjs/RegExpObject.cpp
r34615 r34659 51 51 : JSObject(objectPrototype) 52 52 { 53 putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum);54 putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum);55 putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum);56 putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum);53 putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().compile, regExpProtoFuncCompile), DontEnum); 54 putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().exec, regExpProtoFuncExec), DontEnum); 55 putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().test, regExpProtoFuncTest), DontEnum); 56 putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, regExpProtoFuncToString), DontEnum); 57 57 } 58 58 … … 106 106 if (!thisObj->inherits(&RegExpObject::info)) { 107 107 if (thisObj->inherits(&RegExpPrototype::info)) 108 return jsString( "//");108 return jsString(exec, "//"); 109 109 return throwError(exec, TypeError); 110 110 } … … 117 117 if (thisObj->get(exec, exec->propertyNames().multiline)->toBoolean(exec)) 118 118 result += "m"; 119 return jsString( result);119 return jsString(exec, result); 120 120 } 121 121 … … 150 150 } 151 151 152 JSValue* RegExpObject::getValueProperty(ExecState* , int token) const152 JSValue* RegExpObject::getValueProperty(ExecState* exec, int token) const 153 153 { 154 154 switch (token) { … … 160 160 return jsBoolean(m_regExp->multiline()); 161 161 case Source: 162 return jsString( m_regExp->pattern());162 return jsString(exec, m_regExp->pattern()); 163 163 case LastIndex: 164 return jsNumber( m_lastIndex);164 return jsNumber(exec, m_lastIndex); 165 165 } 166 166 … … 287 287 288 288 // no. of arguments for constructor 289 putDirect(exec->propertyNames().length, jsNumber( 2), ReadOnly | DontDelete | DontEnum);289 putDirect(exec->propertyNames().length, jsNumber(exec, 2), ReadOnly | DontDelete | DontEnum); 290 290 } 291 291 … … 361 361 int start = d->lastOvector[2 * i]; 362 362 if (start >= 0) 363 JSArray::put(exec, i, jsString( d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start)));364 } 365 JSArray::put(exec, exec->propertyNames().index, jsNumber( d->lastOvector[0]));366 JSArray::put(exec, exec->propertyNames().input, jsString( d->lastInput));363 JSArray::put(exec, i, jsString(exec, d->lastInput.substr(start, d->lastOvector[2 * i + 1] - start))); 364 } 365 JSArray::put(exec, exec->propertyNames().index, jsNumber(exec, d->lastOvector[0])); 366 JSArray::put(exec, exec->propertyNames().input, jsString(exec, d->lastInput)); 367 367 368 368 delete d; … … 372 372 JSObject* RegExpConstructor::arrayOfMatches(ExecState* exec) const 373 373 { 374 return new RegExpMatchesArray(exec, d.get());375 } 376 377 JSValue* RegExpConstructor::getBackref( unsigned i) const374 return new (exec) RegExpMatchesArray(exec, d.get()); 375 } 376 377 JSValue* RegExpConstructor::getBackref(ExecState* exec, unsigned i) const 378 378 { 379 379 if (d->lastOvector && i <= d->lastNumSubPatterns) 380 return jsString( d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));381 return jsString( "");382 } 383 384 JSValue* RegExpConstructor::getLastParen( ) const380 return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i])); 381 return jsString(exec, ""); 382 } 383 384 JSValue* RegExpConstructor::getLastParen(ExecState* exec) const 385 385 { 386 386 unsigned i = d->lastNumSubPatterns; 387 387 if (i > 0) { 388 388 ASSERT(d->lastOvector); 389 return jsString( d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i]));389 return jsString(exec, d->lastInput.substr(d->lastOvector[2 * i], d->lastOvector[2 * i + 1] - d->lastOvector[2 * i])); 390 390 } 391 return jsString( "");392 } 393 394 JSValue *RegExpConstructor::getLeftContext() const391 return jsString(exec, ""); 392 } 393 394 JSValue* RegExpConstructor::getLeftContext(ExecState* exec) const 395 395 { 396 396 if (d->lastOvector) 397 return jsString( d->lastInput.substr(0, d->lastOvector[0]));398 return jsString( "");399 } 400 401 JSValue *RegExpConstructor::getRightContext() const397 return jsString(exec, d->lastInput.substr(0, d->lastOvector[0])); 398 return jsString(exec, ""); 399 } 400 401 JSValue* RegExpConstructor::getRightContext(ExecState* exec) const 402 402 { 403 403 if (d->lastOvector) { 404 404 UString s = d->lastInput; 405 return jsString( s.substr(d->lastOvector[1], s.size() - d->lastOvector[1]));405 return jsString(exec, s.substr(d->lastOvector[1], s.size() - d->lastOvector[1])); 406 406 } 407 return jsString( "");407 return jsString(exec, ""); 408 408 } 409 409 … … 413 413 } 414 414 415 JSValue *RegExpConstructor::getValueProperty(ExecState* , int token) const415 JSValue *RegExpConstructor::getValueProperty(ExecState* exec, int token) const 416 416 { 417 417 switch (token) { 418 418 case Dollar1: 419 return getBackref( 1);419 return getBackref(exec, 1); 420 420 case Dollar2: 421 return getBackref( 2);421 return getBackref(exec, 2); 422 422 case Dollar3: 423 return getBackref( 3);423 return getBackref(exec, 3); 424 424 case Dollar4: 425 return getBackref( 4);425 return getBackref(exec, 4); 426 426 case Dollar5: 427 return getBackref( 5);427 return getBackref(exec, 5); 428 428 case Dollar6: 429 return getBackref( 6);429 return getBackref(exec, 6); 430 430 case Dollar7: 431 return getBackref( 7);431 return getBackref(exec, 7); 432 432 case Dollar8: 433 return getBackref( 8);433 return getBackref(exec, 8); 434 434 case Dollar9: 435 return getBackref( 9);435 return getBackref(exec, 9); 436 436 case Input: 437 return jsString( d->lastInput);437 return jsString(exec, d->lastInput); 438 438 case Multiline: 439 439 return jsBoolean(d->multiline); 440 440 case LastMatch: 441 return getBackref( 0);441 return getBackref(exec, 0); 442 442 case LastParen: 443 return getLastParen( );443 return getLastParen(exec); 444 444 case LeftContext: 445 return getLeftContext( );445 return getLeftContext(exec); 446 446 case RightContext: 447 return getRightContext( );447 return getRightContext(exec); 448 448 default: 449 ASSERT (0);449 ASSERT_NOT_REACHED(); 450 450 } 451 451 452 return jsString( "");452 return jsString(exec, ""); 453 453 } 454 454 … … 494 494 RefPtr<RegExp> regExp = RegExp::create(pattern, flags); 495 495 return regExp->isValid() 496 ? new RegExpObject(exec->lexicalGlobalObject()->regExpPrototype(), regExp.release())496 ? new (exec) RegExpObject(exec->lexicalGlobalObject()->regExpPrototype(), regExp.release()) 497 497 : throwError(exec, SyntaxError, UString("Invalid regular expression: ").append(regExp->errorMessage())); 498 498 } -
trunk/JavaScriptCore/kjs/RegExpObject.h
r34587 r34659 95 95 96 96 private: 97 JSValue* getBackref( unsigned) const;98 JSValue* getLastParen( ) const;99 JSValue* getLeftContext( ) const;100 JSValue* getRightContext( ) const;97 JSValue* getBackref(ExecState*, unsigned) const; 98 JSValue* getLastParen(ExecState*) const; 99 JSValue* getLeftContext(ExecState*) const; 100 JSValue* getRightContext(ExecState*) const; 101 101 102 102 OwnPtr<RegExpConstructorPrivate> d; -
trunk/JavaScriptCore/kjs/Shell.cpp
r34607 r34659 29 29 #include "ArrayPrototype.h" 30 30 #include "collector.h" 31 #include "completion.h" 31 32 #include "JSFunction.h" 32 33 #include "InitializeThreading.h" … … 164 165 GlobalObject::GlobalObject(Vector<UString>& arguments) 165 166 { 166 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug));167 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint));168 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit));169 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC));170 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion));171 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun));172 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad));173 putDirectFunction(new PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline));167 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "debug"), functionDebug)); 168 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "print"), functionPrint)); 169 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "quit"), functionQuit)); 170 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "gc"), functionGC)); 171 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "version"), functionVersion)); 172 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "run"), functionRun)); 173 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 1, Identifier(globalExec(), "load"), functionLoad)); 174 putDirectFunction(new (globalExec()) PrototypeFunction(globalExec(), functionPrototype(), 0, Identifier(globalExec(), "readline"), functionReadline)); 174 175 175 176 JSObject* array = arrayConstructor()->construct(globalExec(), globalExec()->emptyList()); 176 177 for (size_t i = 0; i < arguments.size(); ++i) 177 array->put(globalExec(), i, jsString( arguments[i]));178 array->put(globalExec(), i, jsString(globalExec(), arguments[i])); 178 179 putDirect(Identifier(globalExec(), "arguments"), array); 179 180 … … 201 202 } 202 203 203 JSValue* functionGC(ExecState* , JSObject*, const ArgList&)204 JSValue* functionGC(ExecState* exec, JSObject*, const ArgList&) 204 205 { 205 206 JSLock lock; 206 Collector::collect();207 exec->heap()->collect(); 207 208 return jsUndefined(); 208 209 } … … 229 230 stopWatch.stop(); 230 231 231 return jsNumber( stopWatch.getElapsedMS());232 return jsNumber(globalObject->globalExec(), stopWatch.getElapsedMS()); 232 233 } 233 234 … … 245 246 } 246 247 247 JSValue* functionReadline(ExecState* , JSObject*, const ArgList&)248 JSValue* functionReadline(ExecState* exec, JSObject*, const ArgList&) 248 249 { 249 250 Vector<char, 256> line; … … 256 257 } 257 258 line.append('\0'); 258 return jsString( line.data());259 return jsString(exec, line.data()); 259 260 } 260 261 … … 452 453 453 454 #ifndef NDEBUG 454 Collector::collect();455 JSGlobalData::threadInstance().heap->collect(); 455 456 #endif 456 457 -
trunk/JavaScriptCore/kjs/collector.cpp
r34597 r34659 1 1 /* 2 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.2 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2007 Eric Seidel <[email protected]> 4 4 * … … 36 36 #if USE(MULTIPLE_THREADS) 37 37 #include <pthread.h> 38 #include <wtf/Threading.h> 38 39 #endif 39 40 … … 80 81 81 82 const size_t SPARE_EMPTY_BLOCKS = 2; 82 const size_t MIN_ARRAY_SIZE = 14;83 83 const size_t GROWTH_FACTOR = 2; 84 84 const size_t LOW_WATER_FACTOR = 4; 85 85 const size_t ALLOCATIONS_PER_COLLECTION = 4000; 86 87 static CollectorHeap primaryHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation }; 88 static CollectorHeap numberHeap = { 0, 0, 0, 0, 0, 0, 0, NoOperation }; 89 90 size_t Collector::mainThreadOnlyObjectCount = 0; 91 HashSet<ArgList*>* Collector::m_markListSet; 92 93 static CollectorBlock* allocateBlock() 86 // This value has to be a macro to be used in max() without introducing 87 // a PIC branch in Mach-O binaries, see <rdar://problem/5971391>. 88 #define MIN_ARRAY_SIZE 14UL 89 90 Heap::Heap() 91 : m_pagesize(getpagesize()) 92 , mainThreadOnlyObjectCount(0) 93 , m_markListSet(0) 94 { 95 memset(&primaryHeap, 0, sizeof(CollectorHeap)); 96 memset(&numberHeap, 0, sizeof(CollectorHeap)); 97 } 98 99 static NEVER_INLINE CollectorBlock* allocateBlock() 94 100 { 95 101 #if PLATFORM(DARWIN) … … 104 110 memset(address, 0, BLOCK_SIZE); 105 111 #else 106 static size_t pagesize = getpagesize();107 112 108 113 size_t extra = 0; 109 if (BLOCK_SIZE > pagesize)110 extra = BLOCK_SIZE - pagesize;114 if (BLOCK_SIZE > m_pagesize) 115 extra = BLOCK_SIZE - m_pagesize; 111 116 112 117 void* mmapResult = mmap(NULL, BLOCK_SIZE + extra, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); … … 139 144 free(block); 140 145 #else 141 munmap(reinterpret_cast<char 142 #endif 143 } 144 145 void Collector::recordExtraCost(size_t cost)146 munmap(reinterpret_cast<char*>(block), BLOCK_SIZE); 147 #endif 148 } 149 150 void Heap::recordExtraCost(size_t cost) 146 151 { 147 152 // Our frequency of garbage collection tries to balance memory use against speed … … 160 165 } 161 166 162 template < Collector::HeapType heapType> struct HeapConstants;163 164 template <> struct HeapConstants< Collector::PrimaryHeap> {167 template <Heap::HeapType heapType> struct HeapConstants; 168 169 template <> struct HeapConstants<Heap::PrimaryHeap> { 165 170 static const size_t cellSize = CELL_SIZE; 166 171 static const size_t cellsPerBlock = CELLS_PER_BLOCK; … … 170 175 }; 171 176 172 template <> struct HeapConstants< Collector::NumberHeap> {177 template <> struct HeapConstants<Heap::NumberHeap> { 173 178 static const size_t cellSize = SMALL_CELL_SIZE; 174 179 static const size_t cellsPerBlock = SMALL_CELLS_PER_BLOCK; … … 178 183 }; 179 184 180 template < Collector::HeapType heapType> ALWAYS_INLINE void* Collector::heapAllocate(size_t s)185 template <Heap::HeapType heapType> ALWAYS_INLINE void* Heap::heapAllocate(size_t s) 181 186 { 182 187 typedef typename HeapConstants<heapType>::Block Block; … … 268 273 targetBlock = (Block*)allocateBlock(); 269 274 targetBlock->freeList = targetBlock->cells; 275 targetBlock->heap = this; 270 276 targetBlockUsedCells = 0; 271 277 heap.blocks[usedBlocks] = (CollectorBlock*)targetBlock; … … 291 297 } 292 298 293 #ifndef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 294 void* Collector::allocate(size_t s) 299 void* Heap::allocate(size_t s) 295 300 { 296 301 return heapAllocate<PrimaryHeap>(s); 297 302 } 298 #endif 299 300 void* Collector::allocateNumber(size_t s) 303 304 void* Heap::allocateNumber(size_t s) 301 305 { 302 306 return heapAllocate<NumberHeap>(s); … … 363 367 #endif 364 368 365 void Collector::registerAsMainThread()369 void Heap::registerAsMainThread() 366 370 { 367 371 #if USE(MULTIPLE_THREADS) … … 405 409 } 406 410 407 class Collector::Thread {411 class Heap::Thread { 408 412 public: 409 413 Thread(pthread_t pthread, const PlatformThread& platThread, void* base) … … 422 426 pthread_key_t registeredThreadKey; 423 427 pthread_once_t registeredThreadKeyOnce = PTHREAD_ONCE_INIT; 424 Collector::Thread* registeredThreads;428 Heap::Thread* registeredThreads; 425 429 426 430 static void destroyRegisteredThread(void* data) 427 431 { 428 Collector::Thread* thread = (Collector::Thread*)data;432 Heap::Thread* thread = (Heap::Thread*)data; 429 433 430 434 // Can't use JSLock convenience object here because we don't want to re-register … … 435 439 registeredThreads = registeredThreads->next; 436 440 } else { 437 Collector::Thread* last = registeredThreads;438 Collector::Thread* t;441 Heap::Thread* last = registeredThreads; 442 Heap::Thread* t; 439 443 for (t = registeredThreads->next; t != NULL; t = t->next) { 440 444 if (t == thread) { … … 457 461 } 458 462 459 void Collector::registerThread()463 void Heap::registerThread() 460 464 { 461 465 ASSERT(JSLock::lockCount() > 0); … … 465 469 466 470 if (!pthread_getspecific(registeredThreadKey)) { 467 #if PLATFORM(DARWIN) 468 if (onMainThread()) 469 CollectorHeapIntrospector::init(&primaryHeap, &numberHeap); 470 #endif 471 472 Collector::Thread* thread = new Collector::Thread(pthread_self(), getCurrentPlatformThread(), currentThreadStackBase()); 471 Heap::Thread* thread = new Heap::Thread(pthread_self(), getCurrentPlatformThread(), currentThreadStackBase()); 473 472 474 473 thread->next = registeredThreads; … … 478 477 } 479 478 479 void Heap::initializeHeapIntrospector() 480 { 481 ASSERT(pthread_main_np()); 482 CollectorHeapIntrospector::init(&primaryHeap, &numberHeap); 483 } 484 480 485 #endif 481 486 … … 485 490 #define IS_HALF_CELL_ALIGNED(p) (((intptr_t)(p) & (CELL_MASK >> 1)) == 0) 486 491 487 void Collector::markStackObjectsConservatively(void* start, void* end)492 void Heap::markStackObjectsConservatively(void* start, void* end) 488 493 { 489 494 if (start > end) { … … 517 522 for (size_t block = 0; block < usedNumberBlocks; block++) { 518 523 if ((numberBlocks[block] == blockAddr) & (offset <= lastCellOffset)) { 519 Collector::markCell(reinterpret_cast<JSCell*>(xAsBits));524 Heap::markCell(reinterpret_cast<JSCell*>(xAsBits)); 520 525 goto endMarkLoop; 521 526 } … … 539 544 } 540 545 541 void NEVER_INLINE Collector::markCurrentThreadConservativelyInternal()546 void NEVER_INLINE Heap::markCurrentThreadConservativelyInternal() 542 547 { 543 548 void* dummy; … … 547 552 } 548 553 549 void Collector::markCurrentThreadConservatively()554 void Heap::markCurrentThreadConservatively() 550 555 { 551 556 // setjmp forces volatile registers onto the stack … … 692 697 } 693 698 694 void Collector::markOtherThreadConservatively(Thread* thread) 695 { 699 void Heap::markOtherThreadConservatively(Thread* thread) 700 { 701 ASSERT(this == JSGlobalData::sharedInstance().heap); 702 696 703 suspendThread(thread->platformThread); 697 704 … … 710 717 #endif 711 718 712 void Collector::markStackObjectsConservatively()719 void Heap::markStackObjectsConservatively() 713 720 { 714 721 markCurrentThreadConservatively(); 715 722 716 723 #if USE(MULTIPLE_THREADS) 717 for (Thread* thread = registeredThreads; thread != NULL; thread = thread->next) { 718 if (!pthread_equal(thread->posixThread, pthread_self())) { 719 markOtherThreadConservatively(thread); 724 725 if (this == JSGlobalData::sharedInstance().heap) { 726 727 #ifndef NDEBUG 728 // Forbid malloc during the mark phase. Marking a thread suspends it, so 729 // a malloc inside mark() would risk a deadlock with a thread that had been 730 // suspended while holding the malloc lock. 731 fastMallocForbid(); 732 #endif 733 for (Thread* thread = registeredThreads; thread != NULL; thread = thread->next) { 734 if (!pthread_equal(thread->posixThread, pthread_self())) 735 markOtherThreadConservatively(thread); 720 736 } 721 } 722 #endif 723 } 724 725 typedef HashCountedSet<JSCell*> ProtectCountSet; 726 727 static ProtectCountSet& protectedValues() 728 { 729 static ProtectCountSet staticProtectCountSet; 730 return staticProtectCountSet; 731 } 732 733 void Collector::protect(JSValue* k) 737 #ifndef NDEBUG 738 fastMallocAllow(); 739 #endif 740 } 741 #endif 742 } 743 744 void Heap::protect(JSValue* k) 734 745 { 735 746 ASSERT(k); … … 740 751 return; 741 752 742 protectedValues ().add(k->asCell());743 } 744 745 void Collector::unprotect(JSValue* k)753 protectedValues.add(k->asCell()); 754 } 755 756 void Heap::unprotect(JSValue* k) 746 757 { 747 758 ASSERT(k); … … 752 763 return; 753 764 754 protectedValues ().remove(k->asCell());755 } 756 757 void Collector::collectOnMainThreadOnly(JSValue* value)765 protectedValues.remove(k->asCell()); 766 } 767 768 void Heap::collectOnMainThreadOnly(JSValue* value) 758 769 { 759 770 ASSERT(value); … … 769 780 } 770 781 771 void Collector::markProtectedObjects() 772 { 773 ProtectCountSet& protectedValues = KJS::protectedValues(); 782 Heap* Heap::heap(const JSValue* v) 783 { 784 if (JSImmediate::isImmediate(v)) 785 return 0; 786 return Heap::cellBlock(v->asCell())->heap; 787 } 788 789 void Heap::markProtectedObjects() 790 { 774 791 ProtectCountSet::iterator end = protectedValues.end(); 775 792 for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) { … … 780 797 } 781 798 782 void Collector::markMainThreadOnlyObjects()799 void Heap::markMainThreadOnlyObjects() 783 800 { 784 801 #if USE(MULTIPLE_THREADS) … … 822 839 } 823 840 824 template < Collector::HeapType heapType> size_t Collector::sweep(bool currentThreadIsMainThread)841 template <Heap::HeapType heapType> size_t Heap::sweep(bool currentThreadIsMainThread) 825 842 { 826 843 typedef typename HeapConstants<heapType>::Block Block; … … 829 846 UNUSED_PARAM(currentThreadIsMainThread); // currentThreadIsMainThread is only used in ASSERTs 830 847 // SWEEP: delete everything with a zero refcount (garbage) and unmark everything else 831 CollectorHeap& heap = heapType == Collector::PrimaryHeap ? primaryHeap : numberHeap;848 CollectorHeap& heap = heapType == Heap::PrimaryHeap ? primaryHeap : numberHeap; 832 849 833 850 size_t emptyBlocks = 0; … … 846 863 Cell* cell = curBlock->cells + i; 847 864 848 if (heapType != Collector::NumberHeap) {865 if (heapType != Heap::NumberHeap) { 849 866 JSCell* imp = reinterpret_cast<JSCell*>(cell); 850 867 // special case for allocated but uninitialized object … … 857 874 if (curBlock->collectOnMainThreadOnly.get(i)) { 858 875 curBlock->collectOnMainThreadOnly.clear(i); 859 -- Collector::mainThreadOnlyObjectCount;876 --mainThreadOnlyObjectCount; 860 877 } 861 878 imp->~JSCell(); … … 879 896 } else { 880 897 if (!curBlock->marked.get(i >> HeapConstants<heapType>::bitmapShift)) { 881 if (heapType != Collector::NumberHeap) {898 if (heapType != Heap::NumberHeap) { 882 899 JSCell* imp = reinterpret_cast<JSCell*>(cell); 883 900 ASSERT(currentThreadIsMainThread || !curBlock->collectOnMainThreadOnly.get(i)); 884 901 if (curBlock->collectOnMainThreadOnly.get(i)) { 885 902 curBlock->collectOnMainThreadOnly.clear(i); 886 -- Collector::mainThreadOnlyObjectCount;903 --mainThreadOnlyObjectCount; 887 904 } 888 905 imp->~JSCell(); … … 932 949 } 933 950 934 bool Collector::collect() 935 { 936 ASSERT(JSLock::lockCount() > 0); 937 ASSERT(JSLock::currentThreadIsHoldingLock()); 951 bool Heap::collect() 952 { 953 #ifndef NDEBUG 954 if (JSGlobalData::sharedInstance().heap == this) { 955 ASSERT(JSLock::lockCount() > 0); 956 ASSERT(JSLock::currentThreadIsHoldingLock()); 957 } 958 #endif 938 959 939 960 ASSERT((primaryHeap.operationInProgress == NoOperation) | (numberHeap.operationInProgress == NoOperation)); … … 947 968 948 969 // MARK: first mark all referenced objects recursively starting out from the set of root objects 949 950 #ifndef NDEBUG951 // Forbid malloc during the mark phase. Marking a thread suspends it, so952 // a malloc inside mark() would risk a deadlock with a thread that had been953 // suspended while holding the malloc lock.954 fastMallocForbid();955 #endif956 970 957 971 markStackObjectsConservatively(); … … 964 978 #endif 965 979 966 #ifndef NDEBUG967 fastMallocAllow();968 #endif969 970 980 size_t originalLiveObjects = primaryHeap.numLiveObjects + numberHeap.numLiveObjects; 971 981 size_t numLiveObjects = sweep<PrimaryHeap>(currentThreadIsMainThread); … … 978 988 } 979 989 980 size_t Collector::size()990 size_t Heap::size() 981 991 { 982 992 return primaryHeap.numLiveObjects + numberHeap.numLiveObjects; 983 993 } 984 994 985 size_t Collector::globalObjectCount()995 size_t Heap::globalObjectCount() 986 996 { 987 997 size_t count = 0; … … 996 1006 } 997 1007 998 size_t Collector::protectedGlobalObjectCount()1008 size_t Heap::protectedGlobalObjectCount() 999 1009 { 1000 1010 size_t count = 0; … … 1002 1012 JSGlobalObject* o = JSGlobalObject::head(); 1003 1013 do { 1004 if (protectedValues ().contains(o))1014 if (protectedValues.contains(o)) 1005 1015 ++count; 1006 1016 o = o->next(); … … 1010 1020 } 1011 1021 1012 size_t Collector::protectedObjectCount()1013 { 1014 return protectedValues ().size();1022 size_t Heap::protectedObjectCount() 1023 { 1024 return protectedValues.size(); 1015 1025 } 1016 1026 … … 1048 1058 } 1049 1059 1050 HashCountedSet<const char*>* Collector::protectedObjectTypeCounts()1060 HashCountedSet<const char*>* Heap::protectedObjectTypeCounts() 1051 1061 { 1052 1062 HashCountedSet<const char*>* counts = new HashCountedSet<const char*>; 1053 1063 1054 ProtectCountSet& protectedValues = KJS::protectedValues();1055 1064 ProtectCountSet::iterator end = protectedValues.end(); 1056 1065 for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) … … 1060 1069 } 1061 1070 1062 bool Collector::isBusy()1071 bool Heap::isBusy() 1063 1072 { 1064 1073 return (primaryHeap.operationInProgress != NoOperation) | (numberHeap.operationInProgress != NoOperation); -
trunk/JavaScriptCore/kjs/collector.h
r34587 r34659 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2004, 2005, 2006, 2007 Apple Inc. All rights reserved.4 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 5 5 * 6 6 * This library is free software; you can redistribute it and/or … … 26 26 #include <wtf/HashCountedSet.h> 27 27 #include <wtf/HashSet.h> 28 #include <wtf/Noncopyable.h> 28 29 29 30 namespace KJS { … … 34 35 class ArgList; 35 36 36 class Collector { 37 enum OperationInProgress { NoOperation, Allocation, Collection }; 38 39 struct CollectorHeap { 40 CollectorBlock** blocks; 41 size_t numBlocks; 42 size_t usedBlocks; 43 size_t firstBlockWithPossibleSpace; 44 45 size_t numLiveObjects; 46 size_t numLiveObjectsAtLastCollect; 47 size_t extraCost; 48 49 OperationInProgress operationInProgress; 50 }; 51 52 class Heap : Noncopyable { 37 53 public: 38 54 class Thread; … … 44 60 // However, allocateNumber is used via jsNumberCell outside JavaScriptCore. 45 61 // Thus allocateNumber needs to provide a non-inline version too. 46 static void* allocate(size_t s) { return heapAllocate<PrimaryHeap>(s); } 47 static void* inlineAllocateNumber(size_t s) { return heapAllocate<NumberHeap>(s); } 48 #else 49 static void* allocate(size_t); 62 void* inlineAllocateNumber(size_t s) { return heapAllocate<NumberHeap>(s); } 63 void* inlineAllocate(size_t s) { return heapAllocate<PrimaryHeap>(s); } 50 64 #endif 51 static void* allocateNumber(size_t s); 52 53 static bool collect(); 54 static bool isBusy(); // true if an allocation or collection is in progress 65 void* allocateNumber(size_t); 66 void* allocate(size_t); 67 68 bool collect(); 69 bool isBusy(); // true if an allocation or collection is in progress 55 70 56 71 static const size_t minExtraCostSize = 256; 57 72 58 staticvoid reportExtraMemoryCost(size_t cost);59 60 s tatic size_t size();61 62 staticvoid protect(JSValue*);63 staticvoid unprotect(JSValue*);64 65 staticvoid collectOnMainThreadOnly(JSValue*);66 67 static size_t globalObjectCount();68 static size_t protectedObjectCount(); 69 s tatic size_t protectedGlobalObjectCount();70 s tatic HashCountedSet<const char*>* protectedObjectTypeCounts();71 72 static void registerThread();73 73 void reportExtraMemoryCost(size_t cost); 74 75 size_t size(); 76 77 void protect(JSValue*); 78 void unprotect(JSValue*); 79 80 void collectOnMainThreadOnly(JSValue*); 81 82 static Heap* heap(const JSValue*); // 0 for immediate values 83 84 size_t globalObjectCount(); 85 size_t protectedObjectCount(); 86 size_t protectedGlobalObjectCount(); 87 HashCountedSet<const char*>* protectedObjectTypeCounts(); 88 74 89 static void registerAsMainThread(); 90 static void registerThread(); // Should only be called by clients that can use the same heap from multiple threads. 91 92 #if PLATFORM(DARWIN) 93 void initializeHeapIntrospector(); 94 #endif 75 95 76 96 static bool isCellMarked(const JSCell*); 77 97 static void markCell(JSCell*); 78 98 79 staticvoid markStackObjectsConservatively(void* start, void* end);80 81 staticHashSet<ArgList*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<ArgList*>; return *m_markListSet; }99 void markStackObjectsConservatively(void* start, void* end); 100 101 HashSet<ArgList*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<ArgList*>; return *m_markListSet; } 82 102 83 103 private: 84 template < Collector::HeapType heapType> static void* heapAllocate(size_t s);85 template < Collector::HeapType heapType> staticsize_t sweep(bool);104 template <Heap::HeapType heapType> void* heapAllocate(size_t); 105 template <Heap::HeapType heapType> size_t sweep(bool); 86 106 static const CollectorBlock* cellBlock(const JSCell*); 87 107 static CollectorBlock* cellBlock(JSCell*); 88 108 static size_t cellOffset(const JSCell*); 89 109 90 Collector(); 91 92 static void recordExtraCost(size_t); 93 static void markProtectedObjects(); 94 static void markMainThreadOnlyObjects(); 95 static void markCurrentThreadConservatively(); 96 static void markCurrentThreadConservativelyInternal(); 97 static void markOtherThreadConservatively(Thread*); 98 static void markStackObjectsConservatively(); 99 100 static size_t mainThreadOnlyObjectCount; 101 static bool memoryFull; 102 103 static HashSet<ArgList*>* m_markListSet; 110 Heap(); 111 friend class JSGlobalData; 112 113 void recordExtraCost(size_t); 114 void markProtectedObjects(); 115 void markMainThreadOnlyObjects(); 116 void markCurrentThreadConservatively(); 117 void markCurrentThreadConservativelyInternal(); 118 void markOtherThreadConservatively(Thread*); 119 void markStackObjectsConservatively(); 120 121 typedef HashCountedSet<JSCell*> ProtectCountSet; 122 123 const size_t m_pagesize; 124 125 size_t mainThreadOnlyObjectCount; 126 CollectorHeap primaryHeap; 127 CollectorHeap numberHeap; 128 ProtectCountSet protectedValues; 129 HashSet<ArgList*>* m_markListSet; 104 130 }; 105 131 … … 161 187 CollectorBitmap marked; 162 188 CollectorBitmap collectOnMainThreadOnly; 189 Heap* heap; 163 190 }; 164 191 … … 170 197 CollectorBitmap marked; 171 198 CollectorBitmap collectOnMainThreadOnly; 172 }; 173 174 enum OperationInProgress { NoOperation, Allocation, Collection }; 175 176 struct CollectorHeap { 177 CollectorBlock** blocks; 178 size_t numBlocks; 179 size_t usedBlocks; 180 size_t firstBlockWithPossibleSpace; 181 182 size_t numLiveObjects; 183 size_t numLiveObjectsAtLastCollect; 184 size_t extraCost; 185 186 OperationInProgress operationInProgress; 187 }; 188 189 inline const CollectorBlock* Collector::cellBlock(const JSCell* cell) 199 Heap* heap; 200 }; 201 202 inline const CollectorBlock* Heap::cellBlock(const JSCell* cell) 190 203 { 191 204 return reinterpret_cast<const CollectorBlock*>(reinterpret_cast<uintptr_t>(cell) & BLOCK_MASK); 192 205 } 193 206 194 inline CollectorBlock* Collector::cellBlock(JSCell* cell)207 inline CollectorBlock* Heap::cellBlock(JSCell* cell) 195 208 { 196 209 return const_cast<CollectorBlock*>(cellBlock(const_cast<const JSCell*>(cell))); 197 210 } 198 211 199 inline size_t Collector::cellOffset(const JSCell* cell)212 inline size_t Heap::cellOffset(const JSCell* cell) 200 213 { 201 214 return (reinterpret_cast<uintptr_t>(cell) & BLOCK_OFFSET_MASK) / CELL_SIZE; 202 215 } 203 216 204 inline bool Collector::isCellMarked(const JSCell* cell)217 inline bool Heap::isCellMarked(const JSCell* cell) 205 218 { 206 219 return cellBlock(cell)->marked.get(cellOffset(cell)); 207 220 } 208 221 209 inline void Collector::markCell(JSCell* cell)222 inline void Heap::markCell(JSCell* cell) 210 223 { 211 224 cellBlock(cell)->marked.set(cellOffset(cell)); 212 225 } 213 226 214 inline void Collector::reportExtraMemoryCost(size_t cost)227 inline void Heap::reportExtraMemoryCost(size_t cost) 215 228 { 216 229 if (cost > minExtraCostSize) -
trunk/JavaScriptCore/kjs/date_object.cpp
r34607 r34659 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)473 : DateInstance(objectProto)474 { 475 setInternalValue(jsNaN( ));472 DatePrototype::DatePrototype(ExecState* exec, ObjectPrototype* objectProto) 473 : DateInstance(objectProto) 474 { 475 setInternalValue(jsNaN(exec)); 476 476 // The constructor will be added later, after DateConstructor has been built. 477 477 } … … 490 490 { 491 491 putDirect(exec->propertyNames().prototype, dateProto, DontEnum|DontDelete|ReadOnly); 492 putDirectFunction(new DateFunction(exec, funcProto, DateFunction::Parse, 1, exec->propertyNames().parse), DontEnum);493 putDirectFunction(new DateFunction(exec, funcProto, DateFunction::UTC, 7, exec->propertyNames().UTC), DontEnum);494 putDirectFunction(new DateFunction(exec, funcProto, DateFunction::Now, 0, exec->propertyNames().now), DontEnum);495 putDirect(exec ->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum);492 putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::Parse, 1, exec->propertyNames().parse), DontEnum); 493 putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::UTC, 7, exec->propertyNames().UTC), DontEnum); 494 putDirectFunction(new (exec) DateFunction(exec, funcProto, DateFunction::Now, 0, exec->propertyNames().now), DontEnum); 495 putDirect(exec, exec->propertyNames().length, 7, ReadOnly|DontDelete|DontEnum); 496 496 } 497 497 … … 544 544 } 545 545 546 DateInstance *ret = newDateInstance(exec->lexicalGlobalObject()->datePrototype());547 ret->setInternalValue(jsNumber( timeClip(value)));546 DateInstance* ret = new (exec) DateInstance(exec->lexicalGlobalObject()->datePrototype()); 547 ret->setInternalValue(jsNumber(exec, timeClip(value))); 548 548 return ret; 549 549 } 550 550 551 551 // ECMA 15.9.2 552 JSValue *DateConstructor::callAsFunction(ExecState * /*exec*/, JSObject * /*thisObj*/, const ArgList &/*args*/)552 JSValue* DateConstructor::callAsFunction(ExecState* exec, JSObject * /*thisObj*/, const ArgList &/*args*/) 553 553 { 554 554 time_t localTime = time(0); … … 556 556 getLocalTime(&localTime, &localTM); 557 557 GregorianDateTime ts(localTM); 558 return jsString( formatDate(ts) + " " + formatTime(ts, false));558 return jsString(exec, formatDate(ts) + " " + formatTime(ts, false)); 559 559 } 560 560 … … 564 564 : InternalFunction(funcProto, name), id(i) 565 565 { 566 putDirect(exec ->propertyNames().length, len, DontDelete|ReadOnly|DontEnum);566 putDirect(exec, exec->propertyNames().length, len, DontDelete|ReadOnly|DontEnum); 567 567 } 568 568 … … 571 571 { 572 572 if (id == Parse) 573 return jsNumber( parseDate(args[0]->toString(exec)));573 return jsNumber(exec, parseDate(args[0]->toString(exec))); 574 574 else if (id == Now) 575 return jsNumber( getCurrentUTCTime());575 return jsNumber(exec, getCurrentUTCTime()); 576 576 else { // UTC 577 577 int n = args.size(); … … 583 583 || (n >= 6 && isnan(args[5]->toNumber(exec))) 584 584 || (n >= 7 && isnan(args[6]->toNumber(exec)))) { 585 return jsNaN( );585 return jsNaN(exec); 586 586 } 587 587 … … 595 595 t.second = args[5]->toInt32(exec); 596 596 double ms = (n >= 7) ? args[6]->toNumber(exec) : 0; 597 return jsNumber( gregorianDateTimeToMS(t, ms, true));597 return jsNumber(exec, gregorianDateTimeToMS(t, ms, true)); 598 598 } 599 599 } … … 990 990 double milli = v->toNumber(exec); 991 991 if (isnan(milli)) 992 return jsString( "Invalid Date");993 994 GregorianDateTime t; 995 thisDateObj->msToGregorianDateTime(milli, utc, t); 996 return jsString( formatDate(t) + " " + formatTime(t, utc));992 return jsString(exec, "Invalid Date"); 993 994 GregorianDateTime t; 995 thisDateObj->msToGregorianDateTime(milli, utc, t); 996 return jsString(exec, formatDate(t) + " " + formatTime(t, utc)); 997 997 } 998 998 … … 1008 1008 double milli = v->toNumber(exec); 1009 1009 if (isnan(milli)) 1010 return jsString( "Invalid Date");1011 1012 GregorianDateTime t; 1013 thisDateObj->msToGregorianDateTime(milli, utc, t); 1014 return jsString( formatDateUTCVariant(t) + " " + formatTime(t, utc));1010 return jsString(exec, "Invalid Date"); 1011 1012 GregorianDateTime t; 1013 thisDateObj->msToGregorianDateTime(milli, utc, t); 1014 return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc)); 1015 1015 } 1016 1016 … … 1026 1026 double milli = v->toNumber(exec); 1027 1027 if (isnan(milli)) 1028 return jsString( "Invalid Date");1029 1030 GregorianDateTime t; 1031 thisDateObj->msToGregorianDateTime(milli, utc, t); 1032 return jsString( formatDate(t));1028 return jsString(exec, "Invalid Date"); 1029 1030 GregorianDateTime t; 1031 thisDateObj->msToGregorianDateTime(milli, utc, t); 1032 return jsString(exec, formatDate(t)); 1033 1033 } 1034 1034 … … 1044 1044 double milli = v->toNumber(exec); 1045 1045 if (isnan(milli)) 1046 return jsString( "Invalid Date");1047 1048 GregorianDateTime t; 1049 thisDateObj->msToGregorianDateTime(milli, utc, t); 1050 return jsString( formatTime(t, utc));1046 return jsString(exec, "Invalid Date"); 1047 1048 GregorianDateTime t; 1049 thisDateObj->msToGregorianDateTime(milli, utc, t); 1050 return jsString(exec, formatTime(t, utc)); 1051 1051 } 1052 1052 … … 1060 1060 double milli = v->toNumber(exec); 1061 1061 if (isnan(milli)) 1062 return jsString( "Invalid Date");1062 return jsString(exec, "Invalid Date"); 1063 1063 1064 1064 #if PLATFORM(MAC) 1065 1065 double secs = floor(milli / msPerSecond); 1066 return jsString( formatLocaleDate(exec, secs, true, true, args));1066 return jsString(exec, formatLocaleDate(exec, secs, true, true, args)); 1067 1067 #else 1068 1068 UNUSED_PARAM(args); … … 1072 1072 GregorianDateTime t; 1073 1073 thisDateObj->msToGregorianDateTime(milli, utc, t); 1074 return formatLocaleDate( t, LocaleDateAndTime);1074 return formatLocaleDate(exec, t, LocaleDateAndTime); 1075 1075 #endif 1076 1076 } … … 1085 1085 double milli = v->toNumber(exec); 1086 1086 if (isnan(milli)) 1087 return jsString( "Invalid Date");1087 return jsString(exec, "Invalid Date"); 1088 1088 1089 1089 #if PLATFORM(MAC) 1090 1090 double secs = floor(milli / msPerSecond); 1091 return jsString( formatLocaleDate(exec, secs, true, false, args));1091 return jsString(exec, formatLocaleDate(exec, secs, true, false, args)); 1092 1092 #else 1093 1093 UNUSED_PARAM(args); … … 1097 1097 GregorianDateTime t; 1098 1098 thisDateObj->msToGregorianDateTime(milli, utc, t); 1099 return formatLocaleDate( t, LocaleDate);1099 return formatLocaleDate(exec, t, LocaleDate); 1100 1100 #endif 1101 1101 } … … 1110 1110 double milli = v->toNumber(exec); 1111 1111 if (isnan(milli)) 1112 return jsString( "Invalid Date");1112 return jsString(exec, "Invalid Date"); 1113 1113 1114 1114 #if PLATFORM(MAC) 1115 1115 double secs = floor(milli / msPerSecond); 1116 return jsString( formatLocaleDate(exec, secs, false, true, args));1116 return jsString(exec, formatLocaleDate(exec, secs, false, true, args)); 1117 1117 #else 1118 1118 UNUSED_PARAM(args); … … 1122 1122 GregorianDateTime t; 1123 1123 thisDateObj->msToGregorianDateTime(milli, utc, t); 1124 return formatLocaleDate( t, LocaleTime);1124 return formatLocaleDate(exec, t, LocaleTime); 1125 1125 #endif 1126 1126 } … … 1135 1135 double milli = v->toNumber(exec); 1136 1136 if (isnan(milli)) 1137 return jsNaN( );1138 1139 return jsNumber( milli);1137 return jsNaN(exec); 1138 1139 return jsNumber(exec, milli); 1140 1140 } 1141 1141 … … 1149 1149 double milli = v->toNumber(exec); 1150 1150 if (isnan(milli)) 1151 return jsNaN( );1152 1153 return jsNumber( milli);1151 return jsNaN(exec); 1152 1153 return jsNumber(exec, milli); 1154 1154 } 1155 1155 … … 1165 1165 double milli = v->toNumber(exec); 1166 1166 if (isnan(milli)) 1167 return jsNaN( );1168 1169 GregorianDateTime t; 1170 thisDateObj->msToGregorianDateTime(milli, utc, t); 1171 return jsNumber( 1900 + t.year);1167 return jsNaN(exec); 1168 1169 GregorianDateTime t; 1170 thisDateObj->msToGregorianDateTime(milli, utc, t); 1171 return jsNumber(exec, 1900 + t.year); 1172 1172 } 1173 1173 … … 1183 1183 double milli = v->toNumber(exec); 1184 1184 if (isnan(milli)) 1185 return jsNaN( );1186 1187 GregorianDateTime t; 1188 thisDateObj->msToGregorianDateTime(milli, utc, t); 1189 return jsNumber( 1900 + t.year);1185 return jsNaN(exec); 1186 1187 GregorianDateTime t; 1188 thisDateObj->msToGregorianDateTime(milli, utc, t); 1189 return jsNumber(exec, 1900 + t.year); 1190 1190 } 1191 1191 … … 1201 1201 double milli = v->toNumber(exec); 1202 1202 if (isnan(milli)) 1203 return jsString( "Invalid Date");1204 1205 GregorianDateTime t; 1206 thisDateObj->msToGregorianDateTime(milli, utc, t); 1207 return jsString( formatDateUTCVariant(t) + " " + formatTime(t, utc));1203 return jsString(exec, "Invalid Date"); 1204 1205 GregorianDateTime t; 1206 thisDateObj->msToGregorianDateTime(milli, utc, t); 1207 return jsString(exec, formatDateUTCVariant(t) + " " + formatTime(t, utc)); 1208 1208 } 1209 1209 … … 1219 1219 double milli = v->toNumber(exec); 1220 1220 if (isnan(milli)) 1221 return jsNaN( );1222 1223 GregorianDateTime t; 1224 thisDateObj->msToGregorianDateTime(milli, utc, t); 1225 return jsNumber( t.month);1221 return jsNaN(exec); 1222 1223 GregorianDateTime t; 1224 thisDateObj->msToGregorianDateTime(milli, utc, t); 1225 return jsNumber(exec, t.month); 1226 1226 } 1227 1227 … … 1237 1237 double milli = v->toNumber(exec); 1238 1238 if (isnan(milli)) 1239 return jsNaN( );1240 1241 GregorianDateTime t; 1242 thisDateObj->msToGregorianDateTime(milli, utc, t); 1243 return jsNumber( t.month);1239 return jsNaN(exec); 1240 1241 GregorianDateTime t; 1242 thisDateObj->msToGregorianDateTime(milli, utc, t); 1243 return jsNumber(exec, t.month); 1244 1244 } 1245 1245 … … 1255 1255 double milli = v->toNumber(exec); 1256 1256 if (isnan(milli)) 1257 return jsNaN( );1258 1259 GregorianDateTime t; 1260 thisDateObj->msToGregorianDateTime(milli, utc, t); 1261 return jsNumber( t.monthDay);1257 return jsNaN(exec); 1258 1259 GregorianDateTime t; 1260 thisDateObj->msToGregorianDateTime(milli, utc, t); 1261 return jsNumber(exec, t.monthDay); 1262 1262 } 1263 1263 … … 1273 1273 double milli = v->toNumber(exec); 1274 1274 if (isnan(milli)) 1275 return jsNaN( );1276 1277 GregorianDateTime t; 1278 thisDateObj->msToGregorianDateTime(milli, utc, t); 1279 return jsNumber( t.monthDay);1275 return jsNaN(exec); 1276 1277 GregorianDateTime t; 1278 thisDateObj->msToGregorianDateTime(milli, utc, t); 1279 return jsNumber(exec, t.monthDay); 1280 1280 } 1281 1281 … … 1291 1291 double milli = v->toNumber(exec); 1292 1292 if (isnan(milli)) 1293 return jsNaN( );1294 1295 GregorianDateTime t; 1296 thisDateObj->msToGregorianDateTime(milli, utc, t); 1297 return jsNumber( t.weekDay);1293 return jsNaN(exec); 1294 1295 GregorianDateTime t; 1296 thisDateObj->msToGregorianDateTime(milli, utc, t); 1297 return jsNumber(exec, t.weekDay); 1298 1298 } 1299 1299 … … 1309 1309 double milli = v->toNumber(exec); 1310 1310 if (isnan(milli)) 1311 return jsNaN( );1312 1313 GregorianDateTime t; 1314 thisDateObj->msToGregorianDateTime(milli, utc, t); 1315 return jsNumber( t.weekDay);1311 return jsNaN(exec); 1312 1313 GregorianDateTime t; 1314 thisDateObj->msToGregorianDateTime(milli, utc, t); 1315 return jsNumber(exec, t.weekDay); 1316 1316 } 1317 1317 … … 1327 1327 double milli = v->toNumber(exec); 1328 1328 if (isnan(milli)) 1329 return jsNaN( );1330 1331 GregorianDateTime t; 1332 thisDateObj->msToGregorianDateTime(milli, utc, t); 1333 return jsNumber( t.hour);1329 return jsNaN(exec); 1330 1331 GregorianDateTime t; 1332 thisDateObj->msToGregorianDateTime(milli, utc, t); 1333 return jsNumber(exec, t.hour); 1334 1334 } 1335 1335 … … 1345 1345 double milli = v->toNumber(exec); 1346 1346 if (isnan(milli)) 1347 return jsNaN( );1348 1349 GregorianDateTime t; 1350 thisDateObj->msToGregorianDateTime(milli, utc, t); 1351 return jsNumber( t.hour);1347 return jsNaN(exec); 1348 1349 GregorianDateTime t; 1350 thisDateObj->msToGregorianDateTime(milli, utc, t); 1351 return jsNumber(exec, t.hour); 1352 1352 } 1353 1353 … … 1363 1363 double milli = v->toNumber(exec); 1364 1364 if (isnan(milli)) 1365 return jsNaN( );1366 1367 GregorianDateTime t; 1368 thisDateObj->msToGregorianDateTime(milli, utc, t); 1369 return jsNumber( t.minute);1365 return jsNaN(exec); 1366 1367 GregorianDateTime t; 1368 thisDateObj->msToGregorianDateTime(milli, utc, t); 1369 return jsNumber(exec, t.minute); 1370 1370 } 1371 1371 … … 1381 1381 double milli = v->toNumber(exec); 1382 1382 if (isnan(milli)) 1383 return jsNaN( );1384 1385 GregorianDateTime t; 1386 thisDateObj->msToGregorianDateTime(milli, utc, t); 1387 return jsNumber( t.minute);1383 return jsNaN(exec); 1384 1385 GregorianDateTime t; 1386 thisDateObj->msToGregorianDateTime(milli, utc, t); 1387 return jsNumber(exec, t.minute); 1388 1388 } 1389 1389 … … 1399 1399 double milli = v->toNumber(exec); 1400 1400 if (isnan(milli)) 1401 return jsNaN( );1402 1403 GregorianDateTime t; 1404 thisDateObj->msToGregorianDateTime(milli, utc, t); 1405 return jsNumber( t.second);1401 return jsNaN(exec); 1402 1403 GregorianDateTime t; 1404 thisDateObj->msToGregorianDateTime(milli, utc, t); 1405 return jsNumber(exec, t.second); 1406 1406 } 1407 1407 … … 1417 1417 double milli = v->toNumber(exec); 1418 1418 if (isnan(milli)) 1419 return jsNaN( );1420 1421 GregorianDateTime t; 1422 thisDateObj->msToGregorianDateTime(milli, utc, t); 1423 return jsNumber( t.second);1419 return jsNaN(exec); 1420 1421 GregorianDateTime t; 1422 thisDateObj->msToGregorianDateTime(milli, utc, t); 1423 return jsNumber(exec, t.second); 1424 1424 } 1425 1425 … … 1433 1433 double milli = v->toNumber(exec); 1434 1434 if (isnan(milli)) 1435 return jsNaN( );1435 return jsNaN(exec); 1436 1436 1437 1437 double secs = floor(milli / msPerSecond); 1438 1438 double ms = milli - secs * msPerSecond; 1439 return jsNumber( ms);1439 return jsNumber(exec, ms); 1440 1440 } 1441 1441 … … 1449 1449 double milli = v->toNumber(exec); 1450 1450 if (isnan(milli)) 1451 return jsNaN( );1451 return jsNaN(exec); 1452 1452 1453 1453 double secs = floor(milli / msPerSecond); 1454 1454 double ms = milli - secs * msPerSecond; 1455 return jsNumber( ms);1455 return jsNumber(exec, ms); 1456 1456 } 1457 1457 … … 1467 1467 double milli = v->toNumber(exec); 1468 1468 if (isnan(milli)) 1469 return jsNaN( );1470 1471 GregorianDateTime t; 1472 thisDateObj->msToGregorianDateTime(milli, utc, t); 1473 return jsNumber( -gmtoffset(t) / minutesPerHour);1469 return jsNaN(exec); 1470 1471 GregorianDateTime t; 1472 thisDateObj->msToGregorianDateTime(milli, utc, t); 1473 return jsNumber(exec, -gmtoffset(t) / minutesPerHour); 1474 1474 } 1475 1475 … … 1482 1482 1483 1483 double milli = timeClip(args[0]->toNumber(exec)); 1484 JSValue* result = jsNumber( milli);1484 JSValue* result = jsNumber(exec, milli); 1485 1485 thisDateObj->setInternalValue(result); 1486 1486 return result; … … 1497 1497 1498 1498 if (args.isEmpty() || isnan(milli)) { 1499 JSValue* result = jsNaN( );1499 JSValue* result = jsNaN(exec); 1500 1500 thisDateObj->setInternalValue(result); 1501 1501 return result; … … 1509 1509 1510 1510 if (!fillStructuresUsingTimeArgs(exec, args, numArgsToUse, &ms, &t)) { 1511 JSValue* result = jsNaN( );1511 JSValue* result = jsNaN(exec); 1512 1512 thisDateObj->setInternalValue(result); 1513 1513 return result; 1514 1514 } 1515 1515 1516 JSValue* result = jsNumber( gregorianDateTimeToMS(t, ms, inputIsUTC));1516 JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC)); 1517 1517 thisDateObj->setInternalValue(result); 1518 1518 return result; … … 1526 1526 DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 1527 1527 if (args.isEmpty()) { 1528 JSValue* result = jsNaN( );1528 JSValue* result = jsNaN(exec); 1529 1529 thisDateObj->setInternalValue(result); 1530 1530 return result; … … 1547 1547 1548 1548 if (!fillStructuresUsingDateArgs(exec, args, numArgsToUse, &ms, &t)) { 1549 JSValue* result = jsNaN( );1549 JSValue* result = jsNaN(exec); 1550 1550 thisDateObj->setInternalValue(result); 1551 1551 return result; 1552 1552 } 1553 1553 1554 JSValue* result = jsNumber( gregorianDateTimeToMS(t, ms, inputIsUTC));1554 JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, inputIsUTC)); 1555 1555 thisDateObj->setInternalValue(result); 1556 1556 return result; … … 1650 1650 DateInstance* thisDateObj = static_cast<DateInstance*>(thisObj); 1651 1651 if (args.isEmpty()) { 1652 JSValue* result = jsNaN( );1652 JSValue* result = jsNaN(exec); 1653 1653 thisDateObj->setInternalValue(result); 1654 1654 return result; … … 1673 1673 int32_t year = args[0]->toInt32(exec, ok); 1674 1674 if (!ok) { 1675 JSValue* result = jsNaN( );1675 JSValue* result = jsNaN(exec); 1676 1676 thisDateObj->setInternalValue(result); 1677 1677 return result; … … 1679 1679 1680 1680 t.year = (year > 99 || year < 0) ? year - 1900 : year; 1681 JSValue* result = jsNumber( gregorianDateTimeToMS(t, ms, utc));1681 JSValue* result = jsNumber(exec, gregorianDateTimeToMS(t, ms, utc)); 1682 1682 thisDateObj->setInternalValue(result); 1683 1683 return result; … … 1695 1695 double milli = v->toNumber(exec); 1696 1696 if (isnan(milli)) 1697 return jsNaN( );1697 return jsNaN(exec); 1698 1698 1699 1699 GregorianDateTime t; … … 1701 1701 1702 1702 // NOTE: IE returns the full year even in getYear. 1703 return jsNumber( t.year);1703 return jsNumber(exec, t.year); 1704 1704 } 1705 1705 -
trunk/JavaScriptCore/kjs/error_object.cpp
r34615 r34659 46 46 // The constructor will be added later in ErrorConstructor's constructor 47 47 48 putDirect(exec->propertyNames().name, jsString( "Error"), DontEnum);49 putDirect(exec->propertyNames().message, jsString( "Unknown error"), DontEnum);48 putDirect(exec->propertyNames().name, jsString(exec, "Error"), DontEnum); 49 putDirect(exec->propertyNames().message, jsString(exec, "Unknown error"), DontEnum); 50 50 51 putDirectFunction(new PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum);51 putDirectFunction(new (exec) PrototypeFunction(exec, functionPrototype, 0, exec->propertyNames().toString, errorProtoFuncToString), DontEnum); 52 52 } 53 53 … … 65 65 s += ": " + v->toString(exec); 66 66 67 return jsString( s);67 return jsString(exec, s); 68 68 } 69 69 … … 75 75 // ECMA 15.11.3.1 Error.prototype 76 76 putDirect(exec->propertyNames().prototype, errorProto, DontEnum|DontDelete|ReadOnly); 77 putDirect(exec->propertyNames().length, jsNumber( 1), DontDelete|ReadOnly|DontEnum);77 putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); 78 78 } 79 79 … … 87 87 { 88 88 JSObject* proto = static_cast<JSObject*>(exec->lexicalGlobalObject()->errorPrototype()); 89 JSObject* imp = new ErrorInstance(proto);89 JSObject* imp = new (exec) ErrorInstance(proto); 90 90 JSObject* obj(imp); 91 91 92 92 if (!args[0]->isUndefined()) 93 imp->putDirect(exec->propertyNames().message, jsString( args[0]->toString(exec)));93 imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec))); 94 94 95 95 return obj; … … 108 108 : JSObject(errorProto) 109 109 { 110 putDirect(exec->propertyNames().name, jsString( name), 0);111 putDirect(exec->propertyNames().message, jsString( message), 0);110 putDirect(exec->propertyNames().name, jsString(exec, name), 0); 111 putDirect(exec->propertyNames().message, jsString(exec, message), 0); 112 112 } 113 113 … … 120 120 , proto(prot) 121 121 { 122 putDirect(exec->propertyNames().length, jsNumber( 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5122 putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); // ECMA 15.11.7.5 123 123 putDirect(exec->propertyNames().prototype, proto, DontDelete|ReadOnly|DontEnum); 124 124 } … … 131 131 JSObject* NativeErrorConstructor::construct(ExecState* exec, const ArgList& args) 132 132 { 133 JSObject* imp = new ErrorInstance(proto);133 JSObject* imp = new (exec) ErrorInstance(proto); 134 134 JSObject* obj(imp); 135 135 if (!args[0]->isUndefined()) 136 imp->putDirect(exec->propertyNames().message, jsString( args[0]->toString(exec)));136 imp->putDirect(exec->propertyNames().message, jsString(exec, args[0]->toString(exec))); 137 137 return obj; 138 138 } -
trunk/JavaScriptCore/kjs/identifier.h
r34607 r34659 26 26 27 27 namespace KJS { 28 29 class ExecState; 28 30 29 31 class Identifier { -
trunk/JavaScriptCore/kjs/internal.cpp
r34607 r34659 81 81 inline StringObject* StringObject::create(ExecState* exec, JSString* string) 82 82 { 83 return new StringObject(exec->lexicalGlobalObject()->stringPrototype(), string);83 return new (exec) StringObject(exec->lexicalGlobalObject()->stringPrototype(), string); 84 84 } 85 85 … … 94 94 } 95 95 96 JSValue* JSString::lengthGetter(ExecState* , const Identifier&, const PropertySlot& slot)97 { 98 return jsNumber( static_cast<JSString*>(slot.slotBase())->value().size());99 } 100 101 JSValue* JSString::indexGetter(ExecState* , const Identifier&, const PropertySlot& slot)102 { 103 return jsString( static_cast<JSString*>(slot.slotBase())->value().substr(slot.index(), 1));104 } 105 106 JSValue* JSString::indexNumericPropertyGetter(ExecState* , unsigned index, const PropertySlot& slot)107 { 108 return jsString( static_cast<JSString*>(slot.slotBase())->value().substr(index, 1));96 JSValue* JSString::lengthGetter(ExecState* exec, const Identifier&, const PropertySlot& slot) 97 { 98 return jsNumber(exec, static_cast<JSString*>(slot.slotBase())->value().size()); 99 } 100 101 JSValue* JSString::indexGetter(ExecState* exec, const Identifier&, const PropertySlot& slot) 102 { 103 return jsString(exec, static_cast<JSString*>(slot.slotBase())->value().substr(slot.index(), 1)); 104 } 105 106 JSValue* JSString::indexNumericPropertyGetter(ExecState* exec, unsigned index, const PropertySlot& slot) 107 { 108 return jsString(exec, static_cast<JSString*>(slot.slotBase())->value().substr(index, 1)); 109 109 } 110 110 -
trunk/JavaScriptCore/kjs/interpreter.cpp
r34412 r34659 28 28 #include "Machine.h" 29 29 #include "Parser.h" 30 #include "completion.h" 30 31 #include "debugger.h" 31 32 #include <profiler/Profiler.h> -
trunk/JavaScriptCore/kjs/list.cpp
r34587 r34659 21 21 #include "config.h" 22 22 #include "list.h" 23 24 #include "JSValue.h" 23 25 24 26 using std::min; … … 61 63 // We can only register for explicit marking once we know which heap 62 64 // is the current one, i.e., when a non-immediate value is appended. 63 if ( !JSImmediate::isImmediate(v)) { // Will be: if (Heap* heap = Heap::heap(v))64 ListSet& markSet = Collector::markListSet();65 if (Heap* heap = Heap::heap(v)) { 66 ListSet& markSet = heap->markListSet(); 65 67 markSet.add(this); 66 68 m_markSet = &markSet; -
trunk/JavaScriptCore/kjs/list.h
r34587 r34659 1 1 /* 2 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 * Copyright (C) 2003, 2007 Apple Computer, Inc.3 * Copyright (C) 2003, 2007, 2008 Apple Computer, Inc. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 23 23 #define KJS_LIST_H 24 24 25 #include <kjs/JSValue.h>25 #include "JSImmediate.h" 26 26 #include <wtf/HashSet.h> 27 27 #include <wtf/Noncopyable.h> … … 121 121 122 122 JSValue** buffer() const { return *m_bufferSlot + m_offset; } 123 123 124 124 JSValue*** m_bufferSlot; 125 125 size_t m_offset; -
trunk/JavaScriptCore/kjs/lookup.h
r34607 r34659 110 110 111 111 const HashEntry* entry = slot.staticEntry(); 112 JSValue* val = new PrototypeFunction(exec, entry->length, propertyName, entry->functionValue);112 JSValue* val = new (exec) PrototypeFunction(exec, entry->length, propertyName, entry->functionValue); 113 113 thisObj->putDirect(propertyName, val, entry->attributes); 114 114 return val; … … 250 250 return static_cast<JSObject* >(obj); 251 251 } 252 JSObject* newObject = new ClassCtor(exec);252 JSObject* newObject = new (exec) ClassCtor(exec); 253 253 globalObject->putDirect(propertyName, newObject, DontEnum); 254 254 return newObject; -
trunk/JavaScriptCore/kjs/nodes.cpp
r34620 r34659 196 196 RegisterID* Node::emitThrowError(CodeGenerator& generator, ErrorType e, const char* msg) 197 197 { 198 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString( msg));198 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), msg)); 199 199 generator.emitThrow(exception); 200 200 return exception; … … 205 205 UString message = msg; 206 206 substitute(message, label.ustring()); 207 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString( message));207 RegisterID* exception = generator.emitNewError(generator.newTemporary(), e, jsString(generator.globalExec(), message)); 208 208 generator.emitThrow(exception); 209 209 return exception; … … 273 273 { 274 274 // FIXME: should we try to atomize constant strings? 275 return generator.emitLoad(generator.finalDestination(dst), jsOwnedString( m_value));275 return generator.emitLoad(generator.finalDestination(dst), jsOwnedString(generator.globalExec(), m_value)); 276 276 } 277 277 … … 322 322 } 323 323 324 value = generator.emitLoad(generator.newTemporary(), jsNumber( m_elision + length));324 value = generator.emitLoad(generator.newTemporary(), jsNumber(generator.globalExec(), m_elision + length)); 325 325 generator.emitPutById(newArray.get(), generator.propertyNames().length, value); 326 326 … … 1693 1693 JSFunction* FuncDeclNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain) 1694 1694 { 1695 JSFunction* func = new JSFunction(exec, m_ident, m_body.get(), scopeChain);1695 JSFunction* func = new (exec) JSFunction(exec, m_ident, m_body.get(), scopeChain); 1696 1696 1697 1697 JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList()); 1698 1698 proto->putDirect(exec->propertyNames().constructor, func, DontEnum); 1699 1699 func->putDirect(exec->propertyNames().prototype, proto, DontDelete); 1700 func->putDirect(exec->propertyNames().length, jsNumber( m_body->parameters().size()), ReadOnly | DontDelete | DontEnum);1700 func->putDirect(exec->propertyNames().length, jsNumber(exec, m_body->parameters().size()), ReadOnly | DontDelete | DontEnum); 1701 1701 return func; 1702 1702 } … … 1716 1716 JSFunction* FuncExprNode::makeFunction(ExecState* exec, ScopeChainNode* scopeChain) 1717 1717 { 1718 JSFunction* func = new JSFunction(exec, m_ident, m_body.get(), scopeChain);1718 JSFunction* func = new (exec) JSFunction(exec, m_ident, m_body.get(), scopeChain); 1719 1719 JSObject* proto = exec->lexicalGlobalObject()->objectConstructor()->construct(exec, exec->emptyList()); 1720 1720 proto->putDirect(exec->propertyNames().constructor, func, DontEnum); … … 1730 1730 1731 1731 if (!m_ident.isNull()) { 1732 JSObject* functionScopeObject = new JSObject;1732 JSObject* functionScopeObject = new (exec) JSObject; 1733 1733 functionScopeObject->putDirect(m_ident, func, ReadOnly | DontDelete); 1734 1734 func->scope().push(functionScopeObject); -
trunk/JavaScriptCore/kjs/nodes.h
r34593 r34659 28 28 29 29 #include "JSString.h" 30 #include "LabelStack.h" 30 31 #include "Opcode.h" 31 32 #include "regexp.h" -
trunk/JavaScriptCore/kjs/object_object.cpp
r34607 r34659 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 ArgList&) 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 ArgList&)130 JSValue* objectProtoFuncToString(ExecState* exec, JSObject* thisObj, const ArgList&) 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 … … 162 162 case NullType: 163 163 case UndefinedType: 164 return new JSObject(exec->lexicalGlobalObject()->objectPrototype());164 return new (exec) JSObject(exec->lexicalGlobalObject()->objectPrototype()); 165 165 default: 166 166 ASSERT_NOT_REACHED(); -
trunk/JavaScriptCore/kjs/protect.h
r34581 r34659 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/string_object.cpp
r34607 r34659 41 41 const ClassInfo StringObject::info = { "String", 0, 0, 0 }; 42 42 43 StringObject::StringObject( JSObject *proto)43 StringObject::StringObject(ExecState* exec, JSObject* proto) 44 44 : JSWrapperObject(proto) 45 45 { 46 setInternalValue(jsString( ""));47 } 48 49 StringObject::StringObject(JSObject *proto, JSString* string)46 setInternalValue(jsString(exec, "")); 47 } 48 49 StringObject::StringObject(JSObject* proto, JSString* string) 50 50 : JSWrapperObject(proto) 51 51 { … … 53 53 } 54 54 55 StringObject::StringObject( JSObject *proto, const UString &string)55 StringObject::StringObject(ExecState* exec, JSObject* proto, const UString& string) 56 56 : JSWrapperObject(proto) 57 57 { 58 setInternalValue(jsString( string));58 setInternalValue(jsString(exec, string)); 59 59 } 60 60 … … 136 136 // ECMA 15.5.4 137 137 StringPrototype::StringPrototype(ExecState* exec, ObjectPrototype* objProto) 138 : StringObject( objProto)138 : StringObject(exec, objProto) 139 139 { 140 140 // The constructor will be added later, after StringConstructor has been built 141 putDirect(exec->propertyNames().length, jsNumber( 0), DontDelete | ReadOnly | DontEnum);141 putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum); 142 142 } 143 143 … … 315 315 args.append(jsUndefined()); 316 316 else 317 args.append(jsString( source.substr(matchStart, matchLen)));317 args.append(jsString(exec, source.substr(matchStart, matchLen))); 318 318 } 319 319 320 args.append(jsNumber( completeMatchStart));320 args.append(jsNumber(exec, completeMatchStart)); 321 321 args.append(sourceVal); 322 322 … … 352 352 return sourceVal; 353 353 354 return jsString( result);354 return jsString(exec, result); 355 355 } 356 356 … … 366 366 ArgList args; 367 367 368 args.append(jsString( source.substr(matchPos, matchLen)));369 args.append(jsNumber( matchPos));368 args.append(jsString(exec, source.substr(matchPos, matchLen))); 369 args.append(jsNumber(exec, matchPos)); 370 370 args.append(sourceVal); 371 371 … … 373 373 } 374 374 375 return jsString( source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen));375 return jsString(exec, source.substr(0, matchPos) + replacementString + source.substr(matchPos + matchLen)); 376 376 } 377 377 … … 405 405 else 406 406 u = ""; 407 return jsString( u);407 return jsString(exec, u); 408 408 } 409 409 … … 419 419 double dpos = a0->toInteger(exec); 420 420 if (dpos >= 0 && dpos < len) 421 result = jsNumber( s[static_cast<int>(dpos)]);421 result = jsNumber(exec, s[static_cast<int>(dpos)]); 422 422 else 423 result = jsNaN( );423 result = jsNaN(exec); 424 424 return result; 425 425 } … … 434 434 s += (*it)->toString(exec); 435 435 } 436 return jsString( s);436 return jsString(exec, s); 437 437 } 438 438 … … 451 451 else if (dpos > len) 452 452 dpos = len; 453 return jsNumber( s.find(u2, static_cast<int>(dpos)));453 return jsNumber(exec, s.find(u2, static_cast<int>(dpos))); 454 454 } 455 455 … … 469 469 else if (!(dpos <= len)) // true for NaN 470 470 dpos = len; 471 return jsNumber( s.rfind(u2, static_cast<int>(dpos)));471 return jsNumber(exec, s.rfind(u2, static_cast<int>(dpos))); 472 472 } 473 473 … … 508 508 int lastIndex = 0; 509 509 while (pos >= 0) { 510 list.append(jsString( u.substr(pos, matchLength)));510 list.append(jsString(exec, u.substr(pos, matchLength))); 511 511 lastIndex = pos; 512 512 pos += matchLength == 0 ? 1 : matchLength; … … 550 550 int matchLength; 551 551 regExpObj->performMatch(reg.get(), u, 0, pos, matchLength); 552 return jsNumber( pos);552 return jsNumber(exec, pos); 553 553 } 554 554 … … 560 560 JSString* sVal = thisObj->inherits(&StringObject::info) ? 561 561 static_cast<StringObject*>(thisObj)->internalValue() : 562 static_cast<JSString*>(jsString( s));562 static_cast<JSString*>(jsString(exec, s)); 563 563 564 564 JSValue* a0 = args[0]; … … 587 587 if (to > len) 588 588 to = len; 589 return jsString( s.substr(static_cast<int>(from), static_cast<int>(to - from)));590 } 591 592 return jsString( "");589 return jsString(exec, s.substr(static_cast<int>(from), static_cast<int>(to - from))); 590 } 591 592 return jsString(exec, ""); 593 593 } 594 594 … … 613 613 if (u.isEmpty() && reg->match(u, 0) >= 0) { 614 614 // empty string matched by regexp -> empty array 615 res->put(exec, exec->propertyNames().length, jsNumber( 0));615 res->put(exec, exec->propertyNames().length, jsNumber(exec, 0)); 616 616 return result; 617 617 } … … 625 625 pos = mpos + (mlen == 0 ? 1 : mlen); 626 626 if (mpos != p0 || mlen) { 627 res->put(exec,i, jsString( u.substr(p0, mpos-p0)));627 res->put(exec,i, jsString(exec, u.substr(p0, mpos-p0))); 628 628 p0 = mpos + mlen; 629 629 i++; … … 634 634 res->put(exec, i++, jsUndefined()); 635 635 else 636 res->put(exec, i++, jsString( u.substr(spos, ovector[si * 2 + 1] - spos)));636 res->put(exec, i++, jsString(exec, u.substr(spos, ovector[si * 2 + 1] - spos))); 637 637 } 638 638 } … … 642 642 if (u.isEmpty()) { 643 643 // empty separator matches empty string -> empty array 644 res->put(exec, exec->propertyNames().length, jsNumber( 0));644 res->put(exec, exec->propertyNames().length, jsNumber(exec, 0)); 645 645 return result; 646 646 } else { 647 647 while (static_cast<uint32_t>(i) != limit && i < u.size()-1) 648 res->put(exec, i++, jsString( u.substr(p0++, 1)));648 res->put(exec, i++, jsString(exec, u.substr(p0++, 1))); 649 649 } 650 650 } else { 651 651 while (static_cast<uint32_t>(i) != limit && (pos = u.find(u2, p0)) >= 0) { 652 res->put(exec, i, jsString( u.substr(p0, pos-p0)));652 res->put(exec, i, jsString(exec, u.substr(p0, pos - p0))); 653 653 p0 = pos + u2.size(); 654 654 i++; … … 658 658 // add remaining string, if any 659 659 if (static_cast<uint32_t>(i) != limit) 660 res->put(exec, i++, jsString( u.substr(p0)));661 res->put(exec, exec->propertyNames().length, jsNumber( i));660 res->put(exec, i++, jsString(exec, u.substr(p0))); 661 res->put(exec, exec->propertyNames().length, jsNumber(exec, i)); 662 662 return result; 663 663 } … … 675 675 double length = a1->isUndefined() ? len : a1->toInteger(exec); 676 676 if (start >= len) 677 return jsString( "");677 return jsString(exec, ""); 678 678 if (length < 0) 679 return jsString( "");679 return jsString(exec, ""); 680 680 if (start < 0) { 681 681 start += len; … … 685 685 if (length > len) 686 686 length = len; 687 return jsString( s.substr(static_cast<int>(start), static_cast<int>(length)));687 return jsString(exec, s.substr(static_cast<int>(start), static_cast<int>(length))); 688 688 } 689 689 … … 718 718 start = temp; 719 719 } 720 return jsString( s.substr((int)start, (int)end-(int)start));720 return jsString(exec, s.substr((int)start, (int)end-(int)start)); 721 721 } 722 722 … … 728 728 JSString* sVal = thisObj->inherits(&StringObject::info) 729 729 ? static_cast<StringObject*>(thisObj)->internalValue() 730 : static_cast<JSString*>(jsString( s));730 : static_cast<JSString*>(jsString(exec, s)); 731 731 int ssize = s.size(); 732 732 if (!ssize) … … 743 743 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 744 744 return sVal; 745 return jsString( UString(buffer.releaseBuffer(), length, false));745 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 746 746 } 747 747 … … 753 753 JSString* sVal = thisObj->inherits(&StringObject::info) 754 754 ? static_cast<StringObject*>(thisObj)->internalValue() 755 : static_cast<JSString*>(jsString( s));755 : static_cast<JSString*>(jsString(exec, s)); 756 756 int ssize = s.size(); 757 757 if (!ssize) … … 768 768 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 769 769 return sVal; 770 return jsString( UString(buffer.releaseBuffer(), length, false));770 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 771 771 } 772 772 … … 779 779 JSString* sVal = thisObj->inherits(&StringObject::info) 780 780 ? static_cast<StringObject*>(thisObj)->internalValue() 781 : static_cast<JSString*>(jsString( s));781 : static_cast<JSString*>(jsString(exec, s)); 782 782 int ssize = s.size(); 783 783 if (!ssize) … … 794 794 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 795 795 return sVal; 796 return jsString( UString(buffer.releaseBuffer(), length, false));796 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 797 797 } 798 798 … … 804 804 JSString* sVal = thisObj->inherits(&StringObject::info) 805 805 ? static_cast<StringObject*>(thisObj)->internalValue() 806 : static_cast<JSString*>(jsString( s));806 : static_cast<JSString*>(jsString(exec, s)); 807 807 int ssize = s.size(); 808 808 if (!ssize) … … 819 819 if (length == ssize && memcmp(buffer.data(), s.data(), length * sizeof(UChar)) == 0) 820 820 return sVal; 821 return jsString( UString(buffer.releaseBuffer(), length, false));821 return jsString(exec, UString(buffer.releaseBuffer(), length, false)); 822 822 } 823 823 … … 825 825 { 826 826 if (args.size() < 1) 827 return jsNumber( 0);828 829 // This optimizes the common case that thisObj is a StringObject 830 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 831 JSValue* a0 = args[0]; 832 return jsNumber( localeCompare(s, a0->toString(exec)));827 return jsNumber(exec, 0); 828 829 // This optimizes the common case that thisObj is a StringObject 830 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 831 JSValue* a0 = args[0]; 832 return jsNumber(exec, localeCompare(s, a0->toString(exec))); 833 833 } 834 834 … … 837 837 // This optimizes the common case that thisObj is a StringObject 838 838 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 839 return jsString( "<big>" + s + "</big>");839 return jsString(exec, "<big>" + s + "</big>"); 840 840 } 841 841 … … 844 844 // This optimizes the common case that thisObj is a StringObject 845 845 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 846 return jsString( "<small>" + s + "</small>");846 return jsString(exec, "<small>" + s + "</small>"); 847 847 } 848 848 … … 851 851 // This optimizes the common case that thisObj is a StringObject 852 852 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 853 return jsString( "<blink>" + s + "</blink>");853 return jsString(exec, "<blink>" + s + "</blink>"); 854 854 } 855 855 … … 858 858 // This optimizes the common case that thisObj is a StringObject 859 859 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 860 return jsString( "<b>" + s + "</b>");860 return jsString(exec, "<b>" + s + "</b>"); 861 861 } 862 862 … … 865 865 // This optimizes the common case that thisObj is a StringObject 866 866 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 867 return jsString( "<tt>" + s + "</tt>");867 return jsString(exec, "<tt>" + s + "</tt>"); 868 868 } 869 869 … … 872 872 // This optimizes the common case that thisObj is a StringObject 873 873 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 874 return jsString( "<i>" + s + "</i>");874 return jsString(exec, "<i>" + s + "</i>"); 875 875 } 876 876 … … 879 879 // This optimizes the common case that thisObj is a StringObject 880 880 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 881 return jsString( "<strike>" + s + "</strike>");881 return jsString(exec, "<strike>" + s + "</strike>"); 882 882 } 883 883 … … 886 886 // This optimizes the common case that thisObj is a StringObject 887 887 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 888 return jsString( "<sub>" + s + "</sub>");888 return jsString(exec, "<sub>" + s + "</sub>"); 889 889 } 890 890 … … 893 893 // This optimizes the common case that thisObj is a StringObject 894 894 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 895 return jsString( "<sup>" + s + "</sup>");895 return jsString(exec, "<sup>" + s + "</sup>"); 896 896 } 897 897 … … 901 901 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 902 902 JSValue* a0 = args[0]; 903 return jsString( "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>");903 return jsString(exec, "<font color=\"" + a0->toString(exec) + "\">" + s + "</font>"); 904 904 } 905 905 … … 909 909 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 910 910 JSValue* a0 = args[0]; 911 return jsString( "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>");911 return jsString(exec, "<font size=\"" + a0->toString(exec) + "\">" + s + "</font>"); 912 912 } 913 913 … … 917 917 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 918 918 JSValue* a0 = args[0]; 919 return jsString( "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>");919 return jsString(exec, "<a name=\"" + a0->toString(exec) + "\">" + s + "</a>"); 920 920 } 921 921 … … 925 925 UString s = thisObj->inherits(&StringObject::info) ? static_cast<StringObject*>(thisObj)->internalValue()->value() : thisObj->toString(exec); 926 926 JSValue* a0 = args[0]; 927 return jsString( "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>");927 return jsString(exec, "<a href=\"" + a0->toString(exec) + "\">" + s + "</a>"); 928 928 } 929 929 … … 936 936 putDirect(exec->propertyNames().prototype, stringProto, DontEnum|DontDelete|ReadOnly); 937 937 938 putDirectFunction(new StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum);938 putDirectFunction(new (exec) StringConstructorFunction(exec, funcProto, exec->propertyNames().fromCharCode), DontEnum); 939 939 940 940 // no. of arguments for constructor 941 putDirect(exec->propertyNames().length, jsNumber( 1), ReadOnly|DontDelete|DontEnum);941 putDirect(exec->propertyNames().length, jsNumber(exec, 1), ReadOnly|DontDelete|DontEnum); 942 942 } 943 943 … … 949 949 950 950 // ECMA 15.5.2 951 JSObject *StringConstructor::construct(ExecState *exec, const ArgList &args)952 { 953 JSObject *proto = exec->lexicalGlobalObject()->stringPrototype();954 if ( args.size() == 0)955 return new StringObject(proto);956 return new StringObject(proto, args[0]->toString(exec));951 JSObject* StringConstructor::construct(ExecState* exec, const ArgList& args) 952 { 953 JSObject* proto = exec->lexicalGlobalObject()->stringPrototype(); 954 if (!args.size()) 955 return new (exec) StringObject(exec, proto); 956 return new (exec) StringObject(exec, proto, args[0]->toString(exec)); 957 957 } 958 958 … … 961 961 { 962 962 if (args.isEmpty()) 963 return jsString( "");963 return jsString(exec, ""); 964 964 else { 965 965 JSValue *v = args[0]; 966 return jsString( v->toString(exec));966 return jsString(exec, v->toString(exec)); 967 967 } 968 968 } … … 974 974 : InternalFunction(funcProto, name) 975 975 { 976 putDirect(exec->propertyNames().length, jsNumber( 1), DontDelete|ReadOnly|DontEnum);976 putDirect(exec->propertyNames().length, jsNumber(exec, 1), DontDelete|ReadOnly|DontEnum); 977 977 } 978 978 … … 992 992 s = ""; 993 993 994 return jsString( s);994 return jsString(exec, s); 995 995 } 996 996 -
trunk/JavaScriptCore/kjs/string_object.h
r34587 r34659 32 32 class StringObject : public JSWrapperObject { 33 33 public: 34 StringObject( JSObject* prototype);35 StringObject( JSObject* prototype, const UString&);34 StringObject(ExecState*, JSObject* prototype); 35 StringObject(ExecState*, JSObject* prototype, const UString&); 36 36 37 37 static StringObject* create(ExecState*, JSString*); … … 56 56 class StringObjectThatMasqueradesAsUndefined : public StringObject { 57 57 public: 58 StringObjectThatMasqueradesAsUndefined( JSObject* proto, const UString& string)59 : StringObject( proto, string) { }58 StringObjectThatMasqueradesAsUndefined(ExecState* exec, JSObject* proto, const UString& string) 59 : StringObject(exec, proto, string) { } 60 60 virtual bool masqueradeAsUndefined() const { return true; } 61 61 virtual bool toBoolean(ExecState*) const { return false; } -
trunk/JavaScriptCore/kjs/ustring.h
r34361 r34659 405 405 // FIXME: this should be size_t but that would cause warnings until we 406 406 // fix UString sizes to be size_t instead of int 407 static const int minShareSize = Collector::minExtraCostSize / sizeof(UChar);407 static const int minShareSize = Heap::minExtraCostSize / sizeof(UChar); 408 408 409 409 inline size_t UString::cost() const
Note:
See TracChangeset
for help on using the changeset viewer.