Changeset 52956 in webkit for trunk/JavaScriptCore/runtime
- Timestamp:
- Jan 7, 2010, 4:15:05 PM (15 years ago)
- Location:
- trunk/JavaScriptCore/runtime
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/InitializeThreading.cpp
r52791 r52956 50 50 WTF::initializeThreading(); 51 51 initializeUString(); 52 JSGlobalData::storeVPtrs(); 52 53 #if ENABLE(JSC_MULTIPLE_THREADS) 53 54 s_dtoaP5Mutex = new Mutex; -
trunk/JavaScriptCore/runtime/JSArray.cpp
r52082 r52956 186 186 JSArray::~JSArray() 187 187 { 188 ASSERT(vptr() == JSGlobalData::jsArrayVPtr); 188 189 checkConsistency(DestructorConsistencyCheck); 189 190 -
trunk/JavaScriptCore/runtime/JSByteArray.cpp
r49721 r52956 43 43 putDirect(exec->globalData().propertyNames->length, jsNumber(exec, m_storage->length()), ReadOnly | DontDelete); 44 44 } 45 45 46 #if !ASSERT_DISABLED 47 JSByteArray::~JSByteArray() 48 { 49 ASSERT(vptr() == JSGlobalData::jsByteArrayVPtr); 50 } 51 #endif 52 53 46 54 PassRefPtr<Structure> JSByteArray::createStructure(JSValue prototype) 47 55 { -
trunk/JavaScriptCore/runtime/JSByteArray.h
r49721 r52956 34 34 35 35 class JSByteArray : public JSObject { 36 friend struct VPtrSet;36 friend class JSGlobalData; 37 37 public: 38 38 bool canAccessIndex(unsigned i) { return i < m_storage->length(); } … … 92 92 WTF::ByteArray* storage() const { return m_storage.get(); } 93 93 94 #if !ASSERT_DISABLED 95 virtual ~JSByteArray(); 96 #endif 97 94 98 protected: 95 99 static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesGetPropertyNames | JSObject::StructureFlags; -
trunk/JavaScriptCore/runtime/JSCell.h
r52178 r52956 44 44 friend class JSAPIValueWrapper; 45 45 friend class JSZombie; 46 friend struct VPtrSet;46 friend class JSGlobalData; 47 47 48 48 private: … … 112 112 virtual JSValue getJSNumber(); 113 113 void* vptr() { return *reinterpret_cast<void**>(this); } 114 void setVPtr(void* vptr) { *reinterpret_cast<void**>(this) = vptr; } 114 115 115 116 private: -
trunk/JavaScriptCore/runtime/JSFunction.cpp
r48836 r52956 82 82 JSFunction::~JSFunction() 83 83 { 84 ASSERT(vptr() == JSGlobalData::jsFunctionVPtr); 85 84 86 // JIT code for other functions may have had calls linked directly to the code for this function; these links 85 87 // are based on a check for the this pointer value for this JSFunction - which will no longer be valid once -
trunk/JavaScriptCore/runtime/JSFunction.h
r50232 r52956 37 37 class JSFunction : public InternalFunction { 38 38 friend class JIT; 39 friend struct VPtrSet;39 friend class JSGlobalData; 40 40 41 41 typedef InternalFunction Base; -
trunk/JavaScriptCore/runtime/JSGlobalData.cpp
r52856 r52956 72 72 extern JSC_CONST_HASHTABLE HashTable stringTable; 73 73 74 struct VPtrSet { 75 VPtrSet(); 76 77 void* jsArrayVPtr; 78 void* jsByteArrayVPtr; 79 void* jsStringVPtr; 80 void* jsFunctionVPtr; 81 }; 82 83 VPtrSet::VPtrSet() 74 void* JSGlobalData::jsArrayVPtr; 75 void* JSGlobalData::jsByteArrayVPtr; 76 void* JSGlobalData::jsStringVPtr; 77 void* JSGlobalData::jsFunctionVPtr; 78 79 void JSGlobalData::storeVPtrs() 84 80 { 85 81 CollectorCell cell; … … 88 84 COMPILE_ASSERT(sizeof(JSArray) <= sizeof(CollectorCell), sizeof_JSArray_must_be_less_than_CollectorCell); 89 85 JSCell* jsArray = new (storage) JSArray(JSArray::createStructure(jsNull())); 90 jsArrayVPtr = jsArray->vptr();86 JSGlobalData::jsArrayVPtr = jsArray->vptr(); 91 87 jsArray->~JSCell(); 92 88 93 89 COMPILE_ASSERT(sizeof(JSByteArray) <= sizeof(CollectorCell), sizeof_JSByteArray_must_be_less_than_CollectorCell); 94 90 JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack); 95 jsByteArrayVPtr = jsByteArray->vptr();91 JSGlobalData::jsByteArrayVPtr = jsByteArray->vptr(); 96 92 jsByteArray->~JSCell(); 97 93 98 94 COMPILE_ASSERT(sizeof(JSString) <= sizeof(CollectorCell), sizeof_JSString_must_be_less_than_CollectorCell); 99 95 JSCell* jsString = new (storage) JSString(JSString::VPtrStealingHack); 100 jsStringVPtr = jsString->vptr();96 JSGlobalData::jsStringVPtr = jsString->vptr(); 101 97 jsString->~JSCell(); 102 98 103 99 COMPILE_ASSERT(sizeof(JSFunction) <= sizeof(CollectorCell), sizeof_JSFunction_must_be_less_than_CollectorCell); 104 100 JSCell* jsFunction = new (storage) JSFunction(JSFunction::createStructure(jsNull())); 105 jsFunctionVPtr = jsFunction->vptr();101 JSGlobalData::jsFunctionVPtr = jsFunction->vptr(); 106 102 jsFunction->~JSCell(); 107 103 } 108 104 109 JSGlobalData::JSGlobalData(bool isShared , const VPtrSet& vptrSet)105 JSGlobalData::JSGlobalData(bool isShared) 110 106 : isSharedInstance(isShared) 111 107 , clientData(0) … … 131 127 , numberStructure(JSNumberCell::createStructure(jsNull())) 132 128 #endif 133 , jsArrayVPtr(vptrSet.jsArrayVPtr)134 , jsByteArrayVPtr(vptrSet.jsByteArrayVPtr)135 , jsStringVPtr(vptrSet.jsStringVPtr)136 , jsFunctionVPtr(vptrSet.jsFunctionVPtr)137 129 , identifierTable(createIdentifierTable()) 138 130 , propertyNames(new CommonIdentifiers(this)) … … 150 142 , functionCodeBlockBeingReparsed(0) 151 143 , firstStringifierToMark(0) 152 , markStack( vptrSet.jsArrayVPtr)144 , markStack(jsArrayVPtr) 153 145 , cachedUTCOffset(NaN) 154 146 , weakRandom(static_cast<int>(currentTime())) … … 205 197 PassRefPtr<JSGlobalData> JSGlobalData::createNonDefault() 206 198 { 207 return adoptRef(new JSGlobalData(false , VPtrSet()));199 return adoptRef(new JSGlobalData(false)); 208 200 } 209 201 210 202 PassRefPtr<JSGlobalData> JSGlobalData::create() 211 203 { 212 JSGlobalData* globalData = new JSGlobalData(false , VPtrSet());204 JSGlobalData* globalData = new JSGlobalData(false); 213 205 setDefaultIdentifierTable(globalData->identifierTable); 214 206 setCurrentIdentifierTable(globalData->identifierTable); … … 233 225 JSGlobalData*& instance = sharedInstanceInternal(); 234 226 if (!instance) { 235 instance = new JSGlobalData(true , VPtrSet());227 instance = new JSGlobalData(true); 236 228 #if ENABLE(JSC_MULTIPLE_THREADS) 237 229 instance->makeUsableFromMultipleThreads(); -
trunk/JavaScriptCore/runtime/JSGlobalData.h
r52856 r52956 63 63 struct HashTable; 64 64 struct Instruction; 65 struct VPtrSet;66 65 67 66 struct DSTOffsetCache { … … 131 130 #endif 132 131 133 void* jsArrayVPtr; 134 void* jsByteArrayVPtr; 135 void* jsStringVPtr; 136 void* jsFunctionVPtr; 132 static void storeVPtrs(); 133 static JS_EXPORTDATA void* jsArrayVPtr; 134 static JS_EXPORTDATA void* jsByteArrayVPtr; 135 static JS_EXPORTDATA void* jsStringVPtr; 136 static JS_EXPORTDATA void* jsFunctionVPtr; 137 137 138 138 IdentifierTable* identifierTable; … … 195 195 void dumpSampleData(ExecState* exec); 196 196 private: 197 JSGlobalData(bool isShared , const VPtrSet&);197 JSGlobalData(bool isShared); 198 198 static JSGlobalData*& sharedInstanceInternal(); 199 199 void createNativeThunk(); -
trunk/JavaScriptCore/runtime/JSString.h
r52346 r52956 60 60 JSString* jsOwnedString(ExecState*, const UString&); 61 61 62 class JS String : public JSCell {62 class JS_EXPORTCLASS JSString : public JSCell { 63 63 public: 64 64 friend class JIT; 65 friend struct VPtrSet;65 friend class JSGlobalData; 66 66 67 67 // A Rope is a string composed of a set of substrings. … … 248 248 ~JSString() 249 249 { 250 ASSERT(vptr() == JSGlobalData::jsStringVPtr); 250 251 for (unsigned i = 0; i < m_ropeLength; ++i) 251 252 m_fibers[i].deref(); … … 351 352 JSString* asString(JSValue); 352 353 354 // When an object is created from a different DLL, MSVC changes vptr to a "local" one right after invoking a constructor, 355 // see <http://groups.google.com/group/microsoft.public.vc.language/msg/55cdcefeaf770212>. 356 // This breaks isJSString(), and we don't need that hack anyway, so we change vptr back to primary one. 357 // The below function must be called by any inline function that invokes a JSString constructor. 358 #if COMPILER(MSVC) && !defined(BUILDING_JavaScriptCore) 359 inline JSString* fixupVPtr(JSGlobalData* globalData, JSString* string) { string->setVPtr(globalData->jsStringVPtr); return string; } 360 #else 361 inline JSString* fixupVPtr(JSGlobalData*, JSString* string) { return string; } 362 #endif 363 353 364 inline JSString* asString(JSValue value) 354 365 { … … 366 377 if (c <= 0xFF) 367 378 return globalData->smallStrings.singleCharacterString(globalData, c); 368 return new (globalData) JSString(globalData, UString(&c, 1));379 return fixupVPtr(globalData, new (globalData) JSString(globalData, UString(&c, 1))); 369 380 } 370 381 … … 375 386 if (c <= 0xFF) 376 387 return globalData->smallStrings.singleCharacterString(globalData, c); 377 return new (globalData) JSString(globalData, UString(UString::Rep::create(s.rep(), offset, 1)));388 return fixupVPtr(globalData, new (globalData) JSString(globalData, UString(UString::Rep::create(s.rep(), offset, 1)))); 378 389 } 379 390 … … 383 394 ASSERT(s[0]); 384 395 ASSERT(s[1]); 385 return new (globalData) JSString(globalData, s);396 return fixupVPtr(globalData, new (globalData) JSString(globalData, s)); 386 397 } 387 398 … … 389 400 { 390 401 ASSERT(s.size() > 1); 391 return new (globalData) JSString(globalData, s);402 return fixupVPtr(globalData, new (globalData) JSString(globalData, s)); 392 403 } 393 404 … … 408 419 return globalData->smallStrings.singleCharacterString(globalData, c); 409 420 } 410 return new (globalData) JSString(globalData, s);421 return fixupVPtr(globalData, new (globalData) JSString(globalData, s)); 411 422 } 412 423 … … 423 434 return globalData->smallStrings.singleCharacterString(globalData, c); 424 435 } 425 return new (globalData) JSString(globalData, UString(UString::Rep::create(s.rep(), offset, length)), JSString::HasOtherOwner);436 return fixupVPtr(globalData, new (globalData) JSString(globalData, UString(UString::Rep::create(s.rep(), offset, length)), JSString::HasOtherOwner)); 426 437 } 427 438 … … 436 447 return globalData->smallStrings.singleCharacterString(globalData, c); 437 448 } 438 return new (globalData) JSString(globalData, s, JSString::HasOtherOwner);449 return fixupVPtr(globalData, new (globalData) JSString(globalData, s, JSString::HasOtherOwner)); 439 450 } 440 451
Note:
See TracChangeset
for help on using the changeset viewer.