Try to clean up the FastStack issues.

This commit is contained in:
Darryl Pogue
2010-12-30 16:48:59 -08:00
parent bc0b93c632
commit b25baeaf4f
4 changed files with 39 additions and 27 deletions

View File

@@ -12,7 +12,7 @@ public:
NODE_INVALID, NODE_NODELIST, NODE_OBJECT, NODE_UNARY, NODE_BINARY,
NODE_COMPARE, NODE_STORE, NODE_RETURN, NODE_NAME, NODE_DELETE,
NODE_FUNCTION, NODE_CLASS, NODE_CALL, NODE_IMPORT, NODE_TUPLE,
NODE_LIST, NODE_MAP, NODE_SUBSCR, NODE_PRINT, NODE_JUMP, NODE_BLOCK,
NODE_LIST, NODE_MAP, NODE_SUBSCR, NODE_PRINT, NODE_BLOCK,
// Empty nodes
NODE_PASS, NODE_LOCALS

View File

@@ -319,7 +319,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
break;
case Pyc::JUMP_FORWARD_A:
{
//stack = FastStack(stack_hist.top());
stack = FastStack(stack_hist.top());
stack_hist.pop();
PycRef<ASTBlock> prev = curblock;
@@ -330,7 +330,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
if (operand > 1 && (prev->blktype() == ASTBlock::BLK_IF
|| prev->blktype() == ASTBlock::BLK_ELIF))
{
stack_hist.push(stack);
//stack_hist.push(stack);
PycRef<ASTBlock> next = new ASTBlock(ASTBlock::BLK_ELSE, pos+operand);
blocks.push(next.cast<ASTBlock>());
}
@@ -562,7 +562,7 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
}
if (curblock->end() == pos) {
//stack = FastStack(stack_hist.top());
stack = FastStack(stack_hist.top());
stack_hist.pop();
PycRef<ASTBlock> prev = curblock;
@@ -572,6 +572,14 @@ PycRef<ASTNode> BuildFromCode(PycRef<PycCode> code, PycModule* mod)
}
}
if (stack_hist.size()) {
fprintf(stderr, "Warning: Stack history is not empty!\n");
while (stack_hist.size()) {
stack_hist.pop();
}
}
cleanBuild = true;
return new ASTNodeList(defblock->nodes());
}

View File

@@ -6,24 +6,32 @@
class FastStack {
public:
FastStack(int size) : m_size(size), m_ptr(-1)
{ m_stack = new PycRef<ASTNode>[m_size]; }
FastStack(const FastStack& copy) : m_size(copy.m_size), m_ptr(copy.m_ptr)
{
FastStack(int size) : m_size(size), m_ptr(-1) {
m_stack = new PycRef<ASTNode>[m_size];
for (int i=0; i<m_size; i++)
}
FastStack(const FastStack& copy) : m_size(copy.m_size), m_ptr(copy.m_ptr) {
long a = (long)&(*copy.m_stack[0]);
m_stack = new PycRef<ASTNode>[m_size];
if ((long)&(*copy.m_stack[0]) != a)
fprintf(stderr, "\nWe have a serious problem!\n\n");
for (int i = 0; i <= m_ptr; i++)
m_stack[i] = copy.m_stack[i];
}
~FastStack()
{ delete[] m_stack; }
~FastStack() {
delete[] m_stack;
}
void push(PycRef<ASTNode> node)
{ m_stack[++m_ptr] = node; }
void push(PycRef<ASTNode> node) {
m_stack[++m_ptr] = node;
}
void pop()
{ if (m_ptr > -1) m_stack[m_ptr--] = Node_NULL; }
void pop() {
if (m_ptr > -1)
m_stack[m_ptr--] = Node_NULL;
}
PycRef<ASTNode> top() const
{

View File

@@ -5,28 +5,24 @@ template <class _Obj>
class PycRef {
public:
PycRef() : m_obj(0) { }
PycRef(_Obj* obj) : m_obj(obj) { m_obj->addRef(); }
PycRef(_Obj* obj) : m_obj(obj) { if(m_obj) m_obj->addRef(); }
PycRef(const PycRef<_Obj>& obj) : m_obj(obj.m_obj) {
if (m_obj != (_Obj*)0) m_obj->addRef();
if(m_obj) m_obj->addRef();
}
~PycRef<_Obj>() { if (m_obj != (_Obj*)0) m_obj->delRef(); }
~PycRef<_Obj>() { if(m_obj) m_obj->delRef(); }
PycRef<_Obj>& operator=(_Obj* obj)
{
if (obj != (_Obj*)0)
obj->addRef();
if (m_obj != (_Obj*)0)
m_obj->delRef();
if (obj) obj->addRef();
if (m_obj) m_obj->delRef();
m_obj = obj;
return *this;
}
PycRef<_Obj>& operator=(const PycRef<_Obj>& obj)
{
if (obj.m_obj != (_Obj*)0)
obj.m_obj->addRef();
if (m_obj != (_Obj*)0)
m_obj->delRef();
if (obj.m_obj) obj.m_obj->addRef();
if (m_obj) m_obj->delRef();
m_obj = obj.m_obj;
return *this;
}