]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - parser/ParserArena.cpp
JavaScriptCore-1097.3.3.tar.gz
[apple/javascriptcore.git] / parser / ParserArena.cpp
index a8e81595384a2c882cee7b7aab9bd52b2b2c95de..c53f30753f2f712bf9b751c0684cd6dee5a240a1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009, 2010 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include "ParserArena.h"
 
 #include "Nodes.h"
+#include <wtf/PassOwnPtr.h>
 
 namespace JSC {
 
 ParserArena::ParserArena()
     : m_freeableMemory(0)
     , m_freeablePoolEnd(0)
-    , m_identifierArena(new IdentifierArena)
 {
 }
 
@@ -45,19 +45,16 @@ inline void* ParserArena::freeablePool()
 
 inline void ParserArena::deallocateObjects()
 {
+    size_t size = m_deletableObjects.size();
+    for (size_t i = 0; i < size; ++i)
+        m_deletableObjects[i]->~ParserArenaDeletable();
+
     if (m_freeablePoolEnd)
         fastFree(freeablePool());
 
-    size_t size = m_freeablePools.size();
+    size = m_freeablePools.size();
     for (size_t i = 0; i < size; ++i)
         fastFree(m_freeablePools[i]);
-
-    size = m_deletableObjects.size();
-    for (size_t i = 0; i < size; ++i) {
-        ParserArenaDeletable* object = m_deletableObjects[i];
-        object->~ParserArenaDeletable();
-        fastFree(object);
-    }
 }
 
 ParserArena::~ParserArena()
@@ -90,7 +87,8 @@ void ParserArena::reset()
 
     m_freeableMemory = 0;
     m_freeablePoolEnd = 0;
-    m_identifierArena->clear();
+    if (m_identifierArena)
+        m_identifierArena->clear();
     m_freeablePools.clear();
     m_deletableObjects.clear();
     m_refCountedObjects.clear();
@@ -110,7 +108,7 @@ void ParserArena::allocateFreeablePool()
 bool ParserArena::isEmpty() const
 {
     return !m_freeablePoolEnd
-        && m_identifierArena->isEmpty()
+        && (!m_identifierArena || m_identifierArena->isEmpty())
         && m_freeablePools.isEmpty()
         && m_deletableObjects.isEmpty()
         && m_refCountedObjects.isEmpty();