Changeset 43661 in webkit for trunk/JavaScriptCore/parser/ParserArena.h
- Timestamp:
- May 13, 2009, 2:53:59 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/ParserArena.h
r43642 r43661 27 27 #define ParserArena_h 28 28 29 #include "Identifier.h" 30 #include "SegmentedVector.h" 29 #include <wtf/PassRefPtr.h> 30 #include <wtf/RefPtr.h> 31 #include <wtf/Vector.h> 31 32 32 33 namespace JSC { … … 35 36 class ParserArenaRefCounted; 36 37 37 typedef SegmentedVector<Identifier, 64> IdentifierArena; 38 39 class ParserArena : Noncopyable { 38 class ParserArena { 40 39 public: 41 ParserArena();42 ~ParserArena();43 44 40 void swap(ParserArena& otherArena) 45 41 { 46 std::swap(m_freeableMemory, otherArena.m_freeableMemory);47 std::swap(m_freeablePoolEnd, otherArena.m_freeablePoolEnd);48 m_identifierArena.swap(otherArena.m_identifierArena);49 m_freeablePools.swap(otherArena.m_freeablePools);50 42 m_deletableObjects.swap(otherArena.m_deletableObjects); 51 43 m_refCountedObjects.swap(otherArena.m_refCountedObjects); 52 44 } 45 ~ParserArena(); 53 46 54 void* allocateFreeable(size_t size) 55 { 56 ASSERT(size); 57 ASSERT(size <= freeablePoolSize); 58 size_t alignedSize = alignSize(size); 59 ASSERT(alignedSize <= freeablePoolSize); 60 if (UNLIKELY(static_cast<size_t>(m_freeablePoolEnd - m_freeableMemory) < alignedSize)) 61 allocateFreeablePool(); 62 void* block = m_freeableMemory; 63 m_freeableMemory += alignedSize; 64 return block; 65 } 47 void deleteWithArena(ParserArenaDeletable* object) { m_deletableObjects.append(object); } 48 void derefWithArena(PassRefPtr<ParserArenaRefCounted> object) { m_refCountedObjects.append(object); } 66 49 67 void* allocateDeletable(size_t size)68 {69 ParserArenaDeletable* deletable = static_cast<ParserArenaDeletable*>(fastMalloc(size));70 m_deletableObjects.append(deletable);71 return deletable;72 }73 74 void derefWithArena(PassRefPtr<ParserArenaRefCounted> object) { m_refCountedObjects.append(object); }75 50 bool contains(ParserArenaRefCounted*) const; 76 51 ParserArenaRefCounted* last() const; 77 52 void removeLast(); 78 53 79 bool isEmpty() const ;54 bool isEmpty() const { return m_deletableObjects.isEmpty() && m_refCountedObjects.isEmpty(); } 80 55 void reset(); 81 56 82 const Identifier& makeIdentifier(JSGlobalData*, const UChar* character, size_t length);83 const Identifier& makeNumericIdentifier(JSGlobalData*, double number);84 85 IdentifierArena& identifierArena() { return *m_identifierArena; }86 87 57 private: 88 static const size_t freeablePoolSize = 8000;89 90 static size_t alignSize(size_t size)91 {92 return (size + sizeof(WTF::AllocAlignmentInteger) - 1) & ~(sizeof(WTF::AllocAlignmentInteger) - 1);93 }94 95 void* freeablePool();96 void allocateFreeablePool();97 void deallocateObjects();98 99 char* m_freeableMemory;100 char* m_freeablePoolEnd;101 102 OwnPtr<IdentifierArena> m_identifierArena;103 Vector<void*> m_freeablePools;104 58 Vector<ParserArenaDeletable*> m_deletableObjects; 105 59 Vector<RefPtr<ParserArenaRefCounted> > m_refCountedObjects; 106 60 }; 107 61 108 ALWAYS_INLINE const Identifier& makeIdentifier(IdentifierArena& arena, JSGlobalData* globalData, const UChar* characters, size_t length)109 {110 arena.append(Identifier(globalData, characters, length));111 return arena.last();112 }113 114 ALWAYS_INLINE const Identifier& ParserArena::makeIdentifier(JSGlobalData* globalData, const UChar* characters, size_t length)115 {116 return JSC::makeIdentifier(*m_identifierArena, globalData, characters, length);117 }118 119 62 } 120 63
Note:
See TracChangeset
for help on using the changeset viewer.