summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/parser/ParserArena.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/parser/ParserArena.h
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/parser/ParserArena.h')
-rw-r--r--Source/JavaScriptCore/parser/ParserArena.h33
1 files changed, 20 insertions, 13 deletions
diff --git a/Source/JavaScriptCore/parser/ParserArena.h b/Source/JavaScriptCore/parser/ParserArena.h
index 2a7d44de7..d8bc2cffa 100644
--- a/Source/JavaScriptCore/parser/ParserArena.h
+++ b/Source/JavaScriptCore/parser/ParserArena.h
@@ -34,6 +34,7 @@
namespace JSC {
class ParserArenaDeletable;
+ class ParserArenaRefCounted;
class IdentifierArena {
WTF_MAKE_FAST_ALLOCATED;
@@ -45,11 +46,12 @@ namespace JSC {
template <typename T>
ALWAYS_INLINE const Identifier& makeIdentifier(VM*, const T* characters, size_t length);
- ALWAYS_INLINE const Identifier& makeEmptyIdentifier(VM*);
ALWAYS_INLINE const Identifier& makeIdentifierLCharFromUChar(VM*, const UChar* characters, size_t length);
const Identifier& makeNumericIdentifier(VM*, double number);
+ bool isEmpty() const { return m_identifiers.isEmpty(); }
+
public:
static const int MaximumCachableCharacter = 128;
typedef SegmentedVector<Identifier, 64> IdentifierVector;
@@ -74,29 +76,24 @@ namespace JSC {
if (!length)
return vm->propertyNames->emptyIdentifier;
if (characters[0] >= MaximumCachableCharacter) {
- m_identifiers.append(Identifier::fromString(vm, characters, length));
+ m_identifiers.append(Identifier(vm, characters, length));
return m_identifiers.last();
}
if (length == 1) {
if (Identifier* ident = m_shortIdentifiers[characters[0]])
return *ident;
- m_identifiers.append(Identifier::fromString(vm, characters, length));
+ m_identifiers.append(Identifier(vm, characters, length));
m_shortIdentifiers[characters[0]] = &m_identifiers.last();
return m_identifiers.last();
}
Identifier* ident = m_recentIdentifiers[characters[0]];
if (ident && Identifier::equal(ident->impl(), characters, length))
return *ident;
- m_identifiers.append(Identifier::fromString(vm, characters, length));
+ m_identifiers.append(Identifier(vm, characters, length));
m_recentIdentifiers[characters[0]] = &m_identifiers.last();
return m_identifiers.last();
}
- ALWAYS_INLINE const Identifier& IdentifierArena::makeEmptyIdentifier(VM* vm)
- {
- return vm->propertyNames->emptyIdentifier;
- }
-
ALWAYS_INLINE const Identifier& IdentifierArena::makeIdentifierLCharFromUChar(VM* vm, const UChar* characters, size_t length)
{
if (!length)
@@ -108,7 +105,7 @@ namespace JSC {
if (length == 1) {
if (Identifier* ident = m_shortIdentifiers[characters[0]])
return *ident;
- m_identifiers.append(Identifier::fromString(vm, characters, length));
+ m_identifiers.append(Identifier(vm, characters, length));
m_shortIdentifiers[characters[0]] = &m_identifiers.last();
return m_identifiers.last();
}
@@ -122,7 +119,7 @@ namespace JSC {
inline const Identifier& IdentifierArena::makeNumericIdentifier(VM* vm, double number)
{
- m_identifiers.append(Identifier::fromString(vm, String::numberToStringECMAScript(number)));
+ m_identifiers.append(Identifier(vm, String::numberToStringECMAScript(number)));
return m_identifiers.last();
}
@@ -139,6 +136,7 @@ namespace JSC {
m_identifierArena.swap(otherArena.m_identifierArena);
m_freeablePools.swap(otherArena.m_freeablePools);
m_deletableObjects.swap(otherArena.m_deletableObjects);
+ m_refCountedObjects.swap(otherArena.m_refCountedObjects);
}
void* allocateFreeable(size_t size)
@@ -161,10 +159,18 @@ namespace JSC {
return deletable;
}
+ void derefWithArena(PassRefPtr<ParserArenaRefCounted>);
+ bool contains(ParserArenaRefCounted*) const;
+ ParserArenaRefCounted* last() const;
+ void removeLast();
+
+ bool isEmpty() const;
+ JS_EXPORT_PRIVATE void reset();
+
IdentifierArena& identifierArena()
{
if (UNLIKELY (!m_identifierArena))
- m_identifierArena = std::make_unique<IdentifierArena>();
+ m_identifierArena = adoptPtr(new IdentifierArena);
return *m_identifierArena;
}
@@ -183,9 +189,10 @@ namespace JSC {
char* m_freeableMemory;
char* m_freeablePoolEnd;
- std::unique_ptr<IdentifierArena> m_identifierArena;
+ OwnPtr<IdentifierArena> m_identifierArena;
Vector<void*> m_freeablePools;
Vector<ParserArenaDeletable*> m_deletableObjects;
+ Vector<RefPtr<ParserArenaRefCounted>> m_refCountedObjects;
};
}