Changeset 34947 in webkit for trunk/JavaScriptCore/kjs
- Timestamp:
- Jul 2, 2008, 12:00:53 AM (17 years ago)
- Location:
- trunk/JavaScriptCore/kjs
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/CollectorHeapIntrospector.cpp
r34824 r34947 96 96 void CollectorHeapIntrospector::statistics(malloc_zone_t* zone, malloc_statistics_t* stats) 97 97 { 98 JSLock lock ;98 JSLock lock(false); 99 99 CollectorHeapIntrospector* introspector = reinterpret_cast<CollectorHeapIntrospector*>(zone); 100 100 CollectorHeap* primaryHeap = introspector->m_primaryHeap; -
trunk/JavaScriptCore/kjs/JSGlobalData.cpp
r34907 r34947 57 57 58 58 59 JSGlobalData::JSGlobalData( )59 JSGlobalData::JSGlobalData(bool isShared) 60 60 : machine(new Machine) 61 , heap(new Heap )61 , heap(new Heap(isShared)) 62 62 #if USE(MULTIPLE_THREADS) 63 63 , arrayTable(new HashTable(KJS::arrayTable)) … … 84 84 , parser(new Parser) 85 85 , head(0) 86 , isSharedInstance(isShared) 86 87 { 87 88 } … … 133 134 { 134 135 #if USE(MULTIPLE_THREADS) 135 AtomicallyInitializedStatic(JSGlobalData, sharedInstance); 136 #else 137 static JSGlobalData sharedInstance; 136 MutexLocker locker(*atomicallyInitializedStaticMutex); 138 137 #endif 139 return sharedInstance; 138 static JSGlobalData* sharedInstance; 139 if (!sharedInstance) 140 sharedInstance = new JSGlobalData(true); 141 return *sharedInstance; 140 142 } 141 143 -
trunk/JavaScriptCore/kjs/JSGlobalData.h
r34838 r34947 82 82 JSGlobalObject* head; 83 83 84 bool isSharedInstance; 85 84 86 private: 85 87 friend class WTF::ThreadSpecific<JSGlobalData>; 86 88 87 JSGlobalData( );89 JSGlobalData(bool isShared = false); 88 90 ~JSGlobalData(); 89 91 }; -
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r34946 r34947 102 102 ASSERT(JSLock::currentThreadIsHoldingLock()); 103 103 104 d()->globalData = (Heap::heap(this) == JSGlobalData::sharedInstance().heap) ? &JSGlobalData::sharedInstance() : &JSGlobalData::threadInstance();104 d()->globalData = Heap::heap(this)->isShared() ? &JSGlobalData::sharedInstance() : &JSGlobalData::threadInstance(); 105 105 106 106 if (JSGlobalObject*& headObject = head()) { -
trunk/JavaScriptCore/kjs/JSLock.cpp
r34659 r34947 25 25 26 26 #include "collector.h" 27 #include "ExecState.h" 28 27 29 #if USE(MULTIPLE_THREADS) 28 30 #include <pthread.h> … … 36 38 static pthread_mutex_t JSMutex = PTHREAD_MUTEX_INITIALIZER; 37 39 38 // Thread-specific key that tells whether a thread holds the JSMutex. 39 pthread_key_t didLockJSMutex; 40 // Thread-specific key that tells whether a thread holds the JSMutex, and how many times it was taken recursively. 41 pthread_key_t JSLockCount; 42 43 static void createJSLockCount() 44 { 45 pthread_key_create(&JSLockCount, 0); 46 } 47 48 pthread_once_t createJSLockCountOnce = PTHREAD_ONCE_INIT; 40 49 41 50 // Lock nesting count. 42 static int JSLockCount; 51 int JSLock::lockCount() 52 { 53 pthread_once(&createJSLockCountOnce, createJSLockCount); 43 54 44 static void createDidLockJSMutex() 55 return reinterpret_cast<int>(pthread_getspecific(JSLockCount)); 56 } 57 58 static void setLockCount(int count) 45 59 { 46 pthread_ key_create(&didLockJSMutex, 0);60 pthread_setspecific(JSLockCount, reinterpret_cast<void*>(count)); 47 61 } 48 pthread_once_t createDidLockJSMutexOnce = PTHREAD_ONCE_INIT;49 62 50 void JSLock::lock() 63 JSLock::JSLock(ExecState* exec) 64 : m_lockingForReal(exec->globalData().isSharedInstance) 51 65 { 52 pthread_once(&createDidLockJSMutexOnce, createDidLockJSMutex); 66 lock(m_lockingForReal); 67 if (m_lockingForReal) 68 registerThread(); 69 } 53 70 54 if (!pthread_getspecific(didLockJSMutex)) { 71 void JSLock::lock(bool lockForReal) 72 { 73 #ifdef NDEBUG 74 // For per-thread contexts, locking is a debug-only feature. 75 if (!lockForReal) 76 return; 77 #endif 78 79 pthread_once(&createJSLockCountOnce, createJSLockCount); 80 81 int currentLockCount = lockCount(); 82 if (!currentLockCount && lockForReal) { 55 83 int result; 56 84 result = pthread_mutex_lock(&JSMutex); 57 85 ASSERT(!result); 58 pthread_setspecific(didLockJSMutex, &didLockJSMutex);59 86 } 60 ++JSLockCount;87 setLockCount(currentLockCount + 1); 61 88 } 62 89 63 void JSLock::unlock( )90 void JSLock::unlock(bool lockForReal) 64 91 { 65 ASSERT(JSLockCount); 66 ASSERT(!!pthread_getspecific(didLockJSMutex)); 92 ASSERT(lockCount()); 67 93 68 --JSLockCount; 69 if (!JSLockCount) { 70 pthread_setspecific(didLockJSMutex, 0); 94 #ifdef NDEBUG 95 // For per-thread contexts, locking is a debug-only feature. 96 if (!lockForReal) 97 return; 98 #endif 99 100 int newLockCount = lockCount() - 1; 101 setLockCount(newLockCount); 102 if (!newLockCount && lockForReal) { 71 103 int result; 72 104 result = pthread_mutex_unlock(&JSMutex); … … 75 107 } 76 108 109 void JSLock::lock(ExecState* exec) 110 { 111 lock(exec->globalData().isSharedInstance); 112 } 113 114 void JSLock::unlock(ExecState* exec) 115 { 116 unlock(exec->globalData().isSharedInstance); 117 } 118 77 119 bool JSLock::currentThreadIsHoldingLock() 78 120 { 79 pthread_once(&create DidLockJSMutexOnce, createDidLockJSMutex);80 return !!pthread_getspecific( didLockJSMutex);121 pthread_once(&createJSLockCountOnce, createJSLockCount); 122 return !!pthread_getspecific(JSLockCount); 81 123 } 82 124 … … 86 128 } 87 129 88 JSLock::DropAllLocks::DropAllLocks( )89 : m_lock Count(0)130 JSLock::DropAllLocks::DropAllLocks(ExecState* exec) 131 : m_lockingForReal(exec->globalData().isSharedInstance) 90 132 { 91 pthread_once(&create DidLockJSMutexOnce, createDidLockJSMutex);133 pthread_once(&createJSLockCountOnce, createJSLockCount); 92 134 93 m_lockCount = !!pthread_getspecific(didLockJSMutex) ? JSLock::lockCount() : 0;135 m_lockCount = JSLock::lockCount(); 94 136 for (int i = 0; i < m_lockCount; i++) 95 JSLock::unlock(); 137 JSLock::unlock(m_lockingForReal); 138 } 139 140 JSLock::DropAllLocks::DropAllLocks(bool lockingForReal) 141 : m_lockingForReal(lockingForReal) 142 { 143 pthread_once(&createJSLockCountOnce, createJSLockCount); 144 145 // It is necessary to drop even "unreal" locks, because having a non-zero lock count 146 // will prevent a real lock from being taken. 147 148 m_lockCount = JSLock::lockCount(); 149 for (int i = 0; i < m_lockCount; i++) 150 JSLock::unlock(m_lockingForReal); 96 151 } 97 152 … … 99 154 { 100 155 for (int i = 0; i < m_lockCount; i++) 101 JSLock::lock(); 102 m_lockCount = 0; 156 JSLock::lock(m_lockingForReal); 103 157 } 104 158 … … 107 161 // If threading support is off, set the lock count to a constant value of 1 so assertions 108 162 // that the lock is held don't fail 109 const int JSLockCount = 1; 163 int JSLock::lockCount() 164 { 165 return 1; 166 } 110 167 111 168 bool JSLock::currentThreadIsHoldingLock() … … 136 193 #endif // USE(MULTIPLE_THREADS) 137 194 138 int JSLock::lockCount()139 {140 return JSLockCount;141 195 } 142 143 } -
trunk/JavaScriptCore/kjs/JSLock.h
r33038 r34947 47 47 // thread acquired it to begin with. 48 48 49 // For per-thread contexts, JSLock doesn't do any locking, but we 50 // still need to perform all the counting in order to keep debug 51 // assertions working, so that clients that use a shared context don't break. 52 53 class ExecState; 54 49 55 class JSLock : Noncopyable { 50 56 public: 51 JSLock() 57 JSLock(ExecState* exec); 58 59 JSLock(bool lockingForReal) 60 : m_lockingForReal(lockingForReal) 52 61 { 53 lock(); 54 registerThread(); 62 #ifdef NDEBUG 63 // For per-thread contexts, locking is a debug-only feature. 64 if (!lockingForReal) 65 return; 66 #endif 67 lock(lockingForReal); 68 if (lockingForReal) 69 registerThread(); 55 70 } 56 71 57 ~JSLock() 72 ~JSLock() 58 73 { 59 unlock(); 74 #ifdef NDEBUG 75 // For per-thread contexts, locking is a debug-only feature. 76 if (!m_lockingForReal) 77 return; 78 #endif 79 unlock(m_lockingForReal); 60 80 } 61 81 62 static void lock(); 63 static void unlock(); 82 static void lock(bool); 83 static void unlock(bool); 84 static void lock(ExecState*); 85 static void unlock(ExecState*); 86 64 87 static int lockCount(); 65 88 static bool currentThreadIsHoldingLock(); … … 67 90 static void registerThread(); 68 91 92 bool m_lockingForReal; 93 69 94 class DropAllLocks : Noncopyable { 70 95 public: 71 DropAllLocks(); 96 DropAllLocks(ExecState* exec); 97 DropAllLocks(bool); 72 98 ~DropAllLocks(); 73 99 74 100 private: 75 101 int m_lockCount; 102 bool m_lockingForReal; 76 103 }; 77 104 }; -
trunk/JavaScriptCore/kjs/PropertyNameArray.h
r34611 r34947 38 38 PropertyNameArray(ExecState* exec) : m_globalData(&exec->globalData()) {} 39 39 40 JSGlobalData* globalData() { return m_globalData; } 41 40 42 void add(const Identifier& identifier) { add(identifier.ustring().rep()); } 41 43 void add(UString::Rep*); -
trunk/JavaScriptCore/kjs/Shell.cpp
r34854 r34947 207 207 JSValue* functionGC(ExecState* exec, JSObject*, JSValue*, const ArgList&) 208 208 { 209 JSLock lock ;209 JSLock lock(false); 210 210 exec->heap()->collect(); 211 211 return jsUndefined(); … … 302 302 res = jscmain(argc, argv); 303 303 #ifndef NDEBUG 304 JSLock::lock( );304 JSLock::lock(false); 305 305 JSGlobalData::threadInstance().heap->collect(); 306 JSLock::unlock( );306 JSLock::unlock(false); 307 307 #endif 308 308 EXCEPT(res = 3) … … 448 448 int jscmain(int argc, char** argv) 449 449 { 450 initializeThreading();451 452 JSLock lock ;450 KJS::initializeThreading(); 451 452 JSLock lock(false); 453 453 454 454 Options options; -
trunk/JavaScriptCore/kjs/collector.cpp
r34907 r34947 24 24 #include "ExecState.h" 25 25 #include "JSGlobalObject.h" 26 #include "JSLock.h" 26 27 #include "JSString.h" 27 28 #include "JSValue.h" … … 91 92 static void freeHeap(CollectorHeap*); 92 93 93 Heap::Heap( )94 Heap::Heap(bool isShared) 94 95 : m_markListSet(0) 96 , m_isShared(isShared) 95 97 { 96 98 memset(&primaryHeap, 0, sizeof(CollectorHeap)); … … 100 102 Heap::~Heap() 101 103 { 102 JSLock lock ;104 JSLock lock(false); 103 105 104 106 delete m_markListSet; … … 439 441 // Can't use JSLock convenience object here because we don't want to re-register 440 442 // an exiting thread. 441 JSLock::lock(); 443 // JSLock is only used for code simplicity here, as we only need to protect registeredThreads 444 // list manipulation, not JS data structures. 445 JSLock::lock(true); 442 446 443 447 if (registeredThreads == thread) { … … 456 460 } 457 461 458 JSLock::unlock( );462 JSLock::unlock(true); 459 463 460 464 delete thread; … … 468 472 void Heap::registerThread() 469 473 { 474 // Since registerThread() is only called when using a shared heap, these locks will be real. 470 475 ASSERT(JSLock::lockCount() > 0); 471 476 ASSERT(JSLock::currentThreadIsHoldingLock()); … … 729 734 #if USE(MULTIPLE_THREADS) 730 735 731 if ( this == JSGlobalData::sharedInstance().heap) {736 if (m_isShared) { 732 737 733 738 #ifndef NDEBUG … … 737 742 fastMallocForbid(); 738 743 #endif 744 // It is safe to access the registeredThreads list, because we earlier asserted that locks are being held, 745 // and since this is a shared heap, they are real locks. 739 746 for (Thread* thread = registeredThreads; thread != NULL; thread = thread->next) { 740 747 if (!pthread_equal(thread->posixThread, pthread_self())) … … 748 755 } 749 756 757 void Heap::setGCProtectNeedsLocking() 758 { 759 // Most clients do not need to call this, with the notable exception of WebCore. 760 // Clients that use shared heap have JSLock protection, while others are not supposed 761 // to migrate JS objects between threads. WebCore violates this contract in Database code, 762 // which calls gcUnprotect from a secondary thread. 763 if (!m_protectedValuesMutex) 764 m_protectedValuesMutex.set(new Mutex); 765 } 766 750 767 void Heap::protect(JSValue* k) 751 768 { 752 769 ASSERT(k); 753 ASSERT(JSLock::lockCount() > 0); 754 ASSERT(JSLock::currentThreadIsHoldingLock()); 770 ASSERT(JSLock::currentThreadIsHoldingLock() || !m_isShared); 755 771 756 772 if (JSImmediate::isImmediate(k)) 757 773 return; 758 774 759 protectedValues.add(k->asCell()); 775 if (m_protectedValuesMutex) 776 m_protectedValuesMutex->lock(); 777 778 m_protectedValues.add(k->asCell()); 779 780 if (m_protectedValuesMutex) 781 m_protectedValuesMutex->unlock(); 760 782 } 761 783 … … 763 785 { 764 786 ASSERT(k); 765 ASSERT(JSLock::lockCount() > 0); 766 ASSERT(JSLock::currentThreadIsHoldingLock()); 787 ASSERT(JSLock::currentThreadIsHoldingLock() || !m_isShared); 767 788 768 789 if (JSImmediate::isImmediate(k)) 769 790 return; 770 791 771 protectedValues.remove(k->asCell()); 792 if (m_protectedValuesMutex) 793 m_protectedValuesMutex->lock(); 794 795 m_protectedValues.remove(k->asCell()); 796 797 if (m_protectedValuesMutex) 798 m_protectedValuesMutex->unlock(); 772 799 } 773 800 … … 781 808 void Heap::markProtectedObjects() 782 809 { 783 ProtectCountSet::iterator end = protectedValues.end(); 784 for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) { 810 if (m_protectedValuesMutex) 811 m_protectedValuesMutex->lock(); 812 813 ProtectCountSet::iterator end = m_protectedValues.end(); 814 for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) { 785 815 JSCell* val = it->first; 786 816 if (!val->marked()) 787 817 val->mark(); 788 818 } 819 820 if (m_protectedValuesMutex) 821 m_protectedValuesMutex->unlock(); 789 822 } 790 823 … … 941 974 size_t Heap::protectedGlobalObjectCount() 942 975 { 976 if (m_protectedValuesMutex) 977 m_protectedValuesMutex->lock(); 978 943 979 size_t count = 0; 944 980 if (JSGlobalObject* head = JSGlobalData::threadInstance().head) { 945 981 JSGlobalObject* o = head; 946 982 do { 947 if ( protectedValues.contains(o))983 if (m_protectedValues.contains(o)) 948 984 ++count; 949 985 o = o->next(); 950 986 } while (o != head); 951 987 } 988 989 if (m_protectedValuesMutex) 990 m_protectedValuesMutex->unlock(); 991 952 992 return count; 953 993 } … … 955 995 size_t Heap::protectedObjectCount() 956 996 { 957 return protectedValues.size(); 997 if (m_protectedValuesMutex) 998 m_protectedValuesMutex->lock(); 999 1000 size_t result = m_protectedValues.size(); 1001 1002 if (m_protectedValuesMutex) 1003 m_protectedValuesMutex->unlock(); 1004 1005 return result; 958 1006 } 959 1007 … … 995 1043 HashCountedSet<const char*>* counts = new HashCountedSet<const char*>; 996 1044 997 ProtectCountSet::iterator end = protectedValues.end(); 998 for (ProtectCountSet::iterator it = protectedValues.begin(); it != end; ++it) 1045 if (m_protectedValuesMutex) 1046 m_protectedValuesMutex->lock(); 1047 1048 ProtectCountSet::iterator end = m_protectedValues.end(); 1049 for (ProtectCountSet::iterator it = m_protectedValues.begin(); it != end; ++it) 999 1050 counts->add(typeName(it->first)); 1000 1051 1052 if (m_protectedValuesMutex) 1053 m_protectedValuesMutex->unlock(); 1054 1001 1055 return counts; 1002 1056 } -
trunk/JavaScriptCore/kjs/collector.h
r34907 r34947 27 27 #include <wtf/HashSet.h> 28 28 #include <wtf/Noncopyable.h> 29 #include <wtf/OwnPtr.h> 30 #include <wtf/Threading.h> 29 31 30 32 namespace KJS { … … 76 78 size_t size(); 77 79 80 void setGCProtectNeedsLocking(); 78 81 void protect(JSValue*); 79 82 void unprotect(JSValue*); … … 98 101 99 102 HashSet<ArgList*>& markListSet() { if (!m_markListSet) m_markListSet = new HashSet<ArgList*>; return *m_markListSet; } 103 104 bool isShared() const { return m_isShared; } 100 105 101 106 private: … … 106 111 static size_t cellOffset(const JSCell*); 107 112 108 friend class Machine;109 113 friend class JSGlobalData; 110 Heap( );114 Heap(bool isShared); 111 115 ~Heap(); 112 116 … … 122 126 CollectorHeap primaryHeap; 123 127 CollectorHeap numberHeap; 124 ProtectCountSet protectedValues; 128 129 OwnPtr<Mutex> m_protectedValuesMutex; // Only non-null if the client explicitly requested it via setGCPrtotectNeedsLocking(). 130 ProtectCountSet m_protectedValues; 131 125 132 HashSet<ArgList*>* m_markListSet; 133 134 bool m_isShared; 126 135 }; 127 136 -
trunk/JavaScriptCore/kjs/interpreter.cpp
r34842 r34947 46 46 Completion Interpreter::checkSyntax(ExecState* exec, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source) 47 47 { 48 JSLock lock ;48 JSLock lock(exec); 49 49 50 50 int errLine; … … 64 64 Completion Interpreter::evaluate(ExecState* exec, ScopeChain& scopeChain, const UString& sourceURL, int startingLineNumber, PassRefPtr<SourceProvider> source, JSValue* thisValue) 65 65 { 66 JSLock lock ;66 JSLock lock(exec); 67 67 68 68 // parse the source code -
trunk/JavaScriptCore/kjs/protect.h
r34659 r34947 27 27 #include "JSValue.h" 28 28 #include "collector.h" 29 #include "JSLock.h"30 29 31 30 namespace KJS { … … 63 62 ProtectedPtr() : m_ptr(NULL) { } 64 63 ProtectedPtr(T *ptr); 65 ProtectedPtr(const ProtectedPtr 64 ProtectedPtr(const ProtectedPtr&); 66 65 ~ProtectedPtr(); 67 66 68 template <class U> ProtectedPtr(const ProtectedPtr<U> 67 template <class U> ProtectedPtr(const ProtectedPtr<U>&); 69 68 70 69 T *get() const { return m_ptr; } … … 74 73 bool operator!() const { return m_ptr == NULL; } 75 74 76 ProtectedPtr &operator=(const ProtectedPtr&);77 ProtectedPtr &operator=(T*);75 ProtectedPtr& operator=(const ProtectedPtr&); 76 ProtectedPtr& operator=(T*); 78 77 79 78 private: … … 84 83 : m_ptr(ptr) 85 84 { 86 if (ptr) { 87 JSLock lock; 85 if (ptr) 88 86 gcProtect(ptr); 89 }90 87 } 91 88 92 template <class T> ProtectedPtr<T>::ProtectedPtr(const ProtectedPtr &o)89 template <class T> ProtectedPtr<T>::ProtectedPtr(const ProtectedPtr& o) 93 90 : m_ptr(o.get()) 94 91 { 95 if (T *ptr = m_ptr) { 96 JSLock lock; 92 if (T *ptr = m_ptr) 97 93 gcProtect(ptr); 98 }99 94 } 100 95 101 96 template <class T> ProtectedPtr<T>::~ProtectedPtr() 102 97 { 103 if (T *ptr = m_ptr) { 104 JSLock lock; 98 if (T *ptr = m_ptr) 105 99 gcUnprotect(ptr); 106 }107 100 } 108 101 109 template <class T> template <class U> ProtectedPtr<T>::ProtectedPtr(const ProtectedPtr<U> &o)102 template <class T> template <class U> ProtectedPtr<T>::ProtectedPtr(const ProtectedPtr<U>& o) 110 103 : m_ptr(o.get()) 111 104 { 112 if (T *ptr = m_ptr) { 113 JSLock lock; 105 if (T *ptr = m_ptr) 114 106 gcProtect(ptr); 115 }116 107 } 117 108 118 template <class T> ProtectedPtr<T> &ProtectedPtr<T>::operator=(const ProtectedPtr<T> &o)109 template <class T> ProtectedPtr<T>& ProtectedPtr<T>::operator=(const ProtectedPtr<T>& o) 119 110 { 120 JSLock lock;121 111 T *optr = o.m_ptr; 122 112 gcProtectNullTolerant(optr); … … 126 116 } 127 117 128 template <class T> inline ProtectedPtr<T> &ProtectedPtr<T>::operator=(T *optr)118 template <class T> inline ProtectedPtr<T>& ProtectedPtr<T>::operator=(T* optr) 129 119 { 130 JSLock lock;131 120 gcProtectNullTolerant(optr); 132 121 gcUnprotectNullTolerant(m_ptr); … … 135 124 } 136 125 137 template <class T> inline bool operator==(const ProtectedPtr<T> &a, const ProtectedPtr<T> &b) { return a.get() == b.get(); }138 template <class T> inline bool operator==(const ProtectedPtr<T> &a, const T *b) { return a.get() == b; }139 template <class T> inline bool operator==(const T *a, const ProtectedPtr<T> &b) { return a == b.get(); }126 template <class T> inline bool operator==(const ProtectedPtr<T>& a, const ProtectedPtr<T>& b) { return a.get() == b.get(); } 127 template <class T> inline bool operator==(const ProtectedPtr<T>& a, const T* b) { return a.get() == b; } 128 template <class T> inline bool operator==(const T* a, const ProtectedPtr<T>& b) { return a == b.get(); } 140 129 141 template <class T> inline bool operator!=(const ProtectedPtr<T> &a, const ProtectedPtr<T> &b) { return a.get() != b.get(); }142 template <class T> inline bool operator!=(const ProtectedPtr<T> &a, const T *b) { return a.get() != b; }143 template <class T> inline bool operator!=(const T *a, const ProtectedPtr<T> &b) { return a != b.get(); }130 template <class T> inline bool operator!=(const ProtectedPtr<T>& a, const ProtectedPtr<T>& b) { return a.get() != b.get(); } 131 template <class T> inline bool operator!=(const ProtectedPtr<T>& a, const T* b) { return a.get() != b; } 132 template <class T> inline bool operator!=(const T* a, const ProtectedPtr<T>& b) { return a != b.get(); } 144 133 145 134 } // namespace -
trunk/JavaScriptCore/kjs/ustring.cpp
r34821 r34947 25 25 #include "ustring.h" 26 26 27 #include "JSLock.h"28 27 #include "collector.h" 29 28 #include "dtoa.h" -
trunk/JavaScriptCore/kjs/ustring.h
r34821 r34947 24 24 #define _KJS_USTRING_H_ 25 25 26 #include "JSLock.h"27 26 #include "collector.h" 28 27 #include <stdint.h>
Note:
See TracChangeset
for help on using the changeset viewer.