summaryrefslogtreecommitdiff
path: root/idlc
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2018-08-29 12:34:52 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2018-08-30 08:30:17 +0200
commitcb2c7428f68d2c07f5e97ae4b42fee7c43e709a8 (patch)
tree2a031e4245d05acfd22584f3024223efad082109 /idlc
parente040d8defb774255e083825863641493f4c7d9ff (diff)
use std::vector in AstStack
instead of a hand-coded equivalent. Note that I can't use std::unique_ptr, because the parsing code appears to just randomly leak AstScope Change-Id: Idc56dfe1f084db55c9d5a7558ac44ddab53b98e3 Reviewed-on: https://gerrit.libreoffice.org/59771 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'idlc')
-rw-r--r--idlc/inc/aststack.hxx7
-rw-r--r--idlc/source/aststack.cxx65
2 files changed, 17 insertions, 55 deletions
diff --git a/idlc/inc/aststack.hxx b/idlc/inc/aststack.hxx
index fa13d7affd92..b3f4cda695fd 100644
--- a/idlc/inc/aststack.hxx
+++ b/idlc/inc/aststack.hxx
@@ -20,6 +20,7 @@
#define INCLUDED_IDLC_INC_ASTSTACK_HXX
#include <sal/types.h>
+#include <vector>
class AstScope;
@@ -29,7 +30,7 @@ public:
AstStack();
~AstStack();
- sal_uInt32 depth() const { return m_top;}
+ sal_uInt32 depth() const { return m_stack.size();}
AstScope* top();
AstScope* bottom();
AstScope* nextToTop();
@@ -39,9 +40,7 @@ public:
void clear();
private:
- AstScope** m_stack;
- sal_uInt32 m_size;
- sal_uInt32 m_top;
+ std::vector<AstScope*> m_stack;
};
#endif // INCLUDED_IDLC_INC_ASTSTACK_HXX
diff --git a/idlc/source/aststack.cxx b/idlc/source/aststack.cxx
index 464879794d53..6e01cdabf089 100644
--- a/idlc/source/aststack.cxx
+++ b/idlc/source/aststack.cxx
@@ -21,102 +21,65 @@
#include <aststack.hxx>
#include <astscope.hxx>
-#define STACKSIZE_INCREMENT 64
-
AstStack::AstStack()
- : m_stack(static_cast<AstScope**>(rtl_allocateZeroMemory(sizeof(AstScope*) * STACKSIZE_INCREMENT)))
- , m_size(STACKSIZE_INCREMENT)
- , m_top(0)
{
}
AstStack::~AstStack()
{
- for(sal_uInt32 i=0; i < m_top; i++)
- {
- if (m_stack[i])
- delete m_stack[i];
- }
-
- std::free(m_stack);
+ for (AstScope* p : m_stack)
+ delete p;
}
AstScope* AstStack::top()
{
- if (m_top < 1)
+ if (m_stack.empty())
return nullptr;
- return m_stack[m_top - 1];
+ return m_stack.back();
}
AstScope* AstStack::bottom()
{
- if (m_top == 0)
+ if (m_stack.empty())
return nullptr;
- return m_stack[0];
+ return m_stack.front();
}
AstScope* AstStack::nextToTop()
{
- AstScope *tmp, *retval;
-
- if (depth() < 2)
+ if (m_stack.size() < 2)
return nullptr;
- tmp = top(); // Save top
- pop(); // Pop it
- retval = top(); // Get next one down
- (void) push(tmp); // Push top back
- return retval; // Return next one down
+ return m_stack[m_stack.size() - 2];
}
AstScope* AstStack::topNonNull()
{
- for (sal_uInt32 i = m_top; i > 0; i--)
+ for (sal_uInt32 i = m_stack.size(); i > 0; i--)
{
if ( m_stack[i - 1] )
return m_stack[i - 1];
- }
+ }
return nullptr;
}
AstStack* AstStack::push(AstScope* pScope)
{
- AstScope **tmp;
-// AstDeclaration *pDecl = ScopeAsDecl(pScope);
- sal_uInt32 newSize;
- sal_uInt32 i;
-
- // Make sure there's space for one more
- if (m_size == m_top)
- {
- newSize = m_size;
- newSize += STACKSIZE_INCREMENT;
- tmp = static_cast<AstScope**>(rtl_allocateZeroMemory(sizeof(AstScope*) * newSize));
-
- for(i=0; i < m_size; i++)
- tmp[i] = m_stack[i];
-
- std::free(m_stack);
- m_stack = tmp;
- }
-
- // Insert new scope
- m_stack[m_top++] = pScope;
-
+ m_stack.push_back(pScope);
return this;
}
void AstStack::pop()
{
- if (m_top < 1)
+ if (m_stack.empty())
return;
- --m_top;
+ m_stack.pop_back();
}
void AstStack::clear()
{
- m_top = 0;
+ m_stack.clear();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */