Try to clean up the FastStack issues.
This commit is contained in:
@@ -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
|
||||
|
14
ASTree.cpp
14
ASTree.cpp
@@ -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());
|
||||
}
|
||||
|
32
FastStack.h
32
FastStack.h
@@ -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
|
||||
{
|
||||
|
18
object.h
18
object.h
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user