Skip to content

Commit

Permalink
Try to clean up the FastStack issues.
Browse files Browse the repository at this point in the history
  • Loading branch information
dpogue committed Dec 31, 2010
1 parent bc0b93c commit b25baea
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 26 deletions.
2 changes: 1 addition & 1 deletion ASTNode.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class ASTNode {
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
Expand Down
14 changes: 11 additions & 3 deletions ASTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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>());
}
Expand Down Expand Up @@ -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;
Expand All @@ -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());
}
Expand Down
30 changes: 19 additions & 11 deletions FastStack.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,32 @@

class FastStack {
public:
FastStack(int size) : m_size(size), m_ptr(-1)
{ m_stack = new PycRef<ASTNode>[m_size]; }
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(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];
for (int i=0; i<m_size; i++)
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
{
Expand Down
18 changes: 7 additions & 11 deletions object.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down

0 comments on commit b25baea

Please sign in to comment.