Changeset 53371 in webkit for trunk/JavaScriptCore/runtime/JSString.h
- Timestamp:
- Jan 16, 2010, 11:18:38 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/JSString.h
r52956 r53371 60 60 JSString* jsOwnedString(ExecState*, const UString&); 61 61 62 typedef void (*JSStringFinalizerCallback)(JSString*, void* context); 63 JSString* jsStringWithFinalizer(ExecState*, const UString&, JSStringFinalizerCallback callback, void* context); 64 62 65 class JS_EXPORTCLASS JSString : public JSCell { 63 66 public: … … 72 75 class Fiber { 73 76 public: 74 Fiber() {}77 Fiber() : m_value(0) {} 75 78 Fiber(UString::Rep* string) : m_value(reinterpret_cast<intptr_t>(string)) {} 76 79 Fiber(Rope* rope) : m_value(reinterpret_cast<intptr_t>(rope) | 1) {} 80 81 Fiber(void* nonFiber) : m_value(reinterpret_cast<intptr_t>(nonFiber)) {} 77 82 78 83 void deref() … … 110 115 UString::Rep* string() { return reinterpret_cast<UString::Rep*>(m_value); } 111 116 117 void* nonFiber() { return reinterpret_cast<void*>(m_value); } 112 118 private: 113 119 intptr_t m_value; … … 246 252 } 247 253 254 JSString(JSGlobalData* globalData, const UString& value, JSStringFinalizerCallback finalizer, void* context) 255 : JSCell(globalData->stringStructure.get()) 256 , m_stringLength(value.size()) 257 , m_value(value) 258 , m_ropeLength(0) 259 { 260 // nasty hack because we can't union non-POD types 261 m_fibers[0] = reinterpret_cast<void*>(finalizer); 262 m_fibers[1] = context; 263 Heap::heap(this)->reportExtraMemoryCost(value.cost()); 264 } 265 248 266 ~JSString() 249 267 { … … 251 269 for (unsigned i = 0; i < m_ropeLength; ++i) 252 270 m_fibers[i].deref(); 271 272 if (!m_ropeLength && m_fibers[0].nonFiber()) { 273 JSStringFinalizerCallback finalizer = reinterpret_cast<JSStringFinalizerCallback>(m_fibers[0].nonFiber()); 274 finalizer(this, m_fibers[1].nonFiber()); 275 } 253 276 } 254 277 … … 348 371 friend JSValue jsString(ExecState* exec, Register* strings, unsigned count); 349 372 friend JSValue jsString(ExecState* exec, JSValue thisValue, const ArgList& args); 373 friend JSString* jsStringWithFinalizer(ExecState*, const UString&, JSStringFinalizerCallback callback, void* context); 350 374 }; 351 375 … … 420 444 } 421 445 return fixupVPtr(globalData, new (globalData) JSString(globalData, s)); 446 } 447 448 inline JSString* jsStringWithFinalizer(ExecState* exec, const UString& s, JSStringFinalizerCallback callback, void* context) 449 { 450 ASSERT(s.size() && (s.size() > 1 || s.data()[0] > 0xFF)); 451 JSGlobalData* globalData = &exec->globalData(); 452 return fixupVPtr(globalData, new (globalData) JSString(globalData, s, callback, context)); 422 453 } 423 454
Note:
See TracChangeset
for help on using the changeset viewer.