Author: Stephan <step...@stzal.com> Branch: Changeset: r275:03801871d3fb Date: 2012-08-04 14:53 +0200 http://bitbucket.org/pypy/lang-js/changeset/03801871d3fb/
Log: replaced stack implementaton diff --git a/js/execution_context.py b/js/execution_context.py --- a/js/execution_context.py +++ b/js/execution_context.py @@ -1,20 +1,21 @@ from js.jsobj import w_Undefined +from js.utils import StackMixin -class ExecutionContext(object): +class ExecutionContext(StackMixin): def __init__(self): - self._stack_ = [] self._lexical_environment_ = None self._variable_environment_ = None self._this_binding_ = None + self._init_stack_() def stack_append(self, value): - self._stack_.append(value) + self._stack_append(value) def stack_pop(self): - return self._stack_.pop() + return self._stack_pop() def stack_top(self): - return self._stack_[-1] + return self._stack_top() def stack_pop_n(self, n): if n < 1: @@ -24,7 +25,7 @@ i = n while i > 0: i -= 1 - e = self.stack_pop() + e = self._stack_pop() r = [e] + r return r diff --git a/js/test/test_stack.py b/js/test/test_stack.py --- a/js/test/test_stack.py +++ b/js/test/test_stack.py @@ -1,77 +1,91 @@ import py from js.utils import StackMixin -from js.jsobj import W_IntNumber - -one = W_IntNumber(1) -two = W_IntNumber(2) -three = W_IntNumber(3) class Stack(StackMixin): - def __init__(self, size): - StackMixin.__init__(self) - self.stack = [None] * size + def __init__(self, size, resize = True): + self._init_stack_(size, resize) -def test_stack_push(): - s = Stack(99) - assert len(s.stack) == 99 - assert s.stack == [None] * 99 + def pop(self): + return self._stack_pop() - s = Stack(99) - s.append(one) - assert s.stack[0] == one - assert s.stack_pointer == 1 + def append(self, value): + self._stack_append(value) - s = Stack(99) - s.append(one) - s.append(two) - s.append(three) - assert s.stack[0] == one - assert s.stack[1] == two - assert s.stack[2] == three - assert s.stack_pointer == 3 + def top(self): + return self._stack_top() -def test_stack_pop(): - s = Stack(99) - s.append(one) - s.append(two) - s.append(three) - assert s.pop() == three - assert s.stack_pointer == 2 - assert s.stack[2] == None + def pop_n(self, n): + return self._stack_pop_n(n) - s = Stack(99) - s.append(one) - s.append(two) - s.append(three) - assert s.pop() == three - assert s.pop() == two - assert s.pop() == one +class TestStack(object): + def test_stack_push(self): + s = Stack(99) + assert len(s._stack_) == 99 + assert s._stack_ == [None] * 99 -def test_stack_last(): - s = Stack(99) - s.append(one) - assert s.top() == one + s = Stack(99) + s.append(1) + assert s._stack_[0] == 1 + assert s._stack_pointer_ == 1 - s = Stack(99) - s.append(one) - s.append(two) - s.append(three) - assert s.top() == three + s = Stack(99) + s.append(1) + s.append(2) + s.append(3) + assert s._stack_[0] == 1 + assert s._stack_[1] == 2 + assert s._stack_[2] == 3 + assert s._stack_pointer_ == 3 -def test_stack_popn(): - s = Stack(99) - s.append(one) - s.append(two) - s.append(three) - x = s.pop_n(2) - assert x == [two, three] - assert s.stack_pointer == 1 - assert s.stack[1] == None - assert s.stack[2] == None + def test_stack_pop(self): + s = Stack(99) + s.append(1) + s.append(2) + s.append(3) + assert s.pop() == 3 + assert s._stack_pointer_ == 2 + assert s._stack_[2] == None -def test_stack_max(): - s = Stack(2) - s.append(one) - s.append(one) - py.test.raises(IndexError, s.append,one) + s = Stack(99) + s.append(1) + s.append(2) + s.append(3) + assert s.pop() == 3 + assert s.pop() == 2 + assert s.pop() == 1 + + def test_stack_last(self): + s = Stack(99) + s.append(1) + assert s.top() == 1 + + s = Stack(99) + s.append(1) + s.append(2) + s.append(3) + assert s.top() == 3 + + def test_stack_popn(self): + s = Stack(99) + s.append(1) + s.append(2) + s.append(3) + x = s.pop_n(2) + assert x == [2, 3] + assert s._stack_pointer_ == 1 + assert s._stack_[1] == None + assert s._stack_[2] == None + + def test_stack_no_resize(self): + s = Stack(2, False) + s.append(1) + s.append(1) + py.test.raises(IndexError, s.append,1) + + def test_stack_resize(self): + s = Stack(0) + s.append(1) + s.append(2) + s.append(3) + assert len(s._stack_) == 3 diff --git a/js/utils.py b/js/utils.py --- a/js/utils.py +++ b/js/utils.py @@ -5,41 +5,40 @@ class StackMixin(object): _mixin_ = True def __init__(self): - self._init_stack() + self._init_stack_() - def _init_stack(self, size = 1): - self.stack = [None] * size - self.stack_pointer = 0 + def _init_stack_(self, size = 1, resize = True): + self._stack_ = [None] * size + self._stack_pointer_ = 0 + self._stack_resize_ = resize - def pop(self): - e = self.top() - i = self.stack_pointer - 1 + def _stack_pop(self): + e = self._stack_top() + i = self._stack_pointer_ - 1 assert i >= 0 - self.stack[i] = None - self.stack_pointer = i + self._stack_[i] = None + self._stack_pointer_ = i return e - def top(self): - i = self.stack_pointer - 1 + def _stack_top(self): + i = self._stack_pointer_ - 1 if i < 0: raise IndexError - return self.stack[i] + return self._stack_[i] - def append(self, element): - from js.jsobj import W_Root - assert isinstance(element, W_Root) - i = self.stack_pointer + def _stack_append(self, element): + i = self._stack_pointer_ assert i >= 0 - self.stack[i] = element - self.stack_pointer = i + 1 + if len(self._stack_) <= i and self._stack_resize_: + self._stack_ += [None] - @jit.unroll_safe - def pop_n(self, n): + self._stack_[i] = element + self._stack_pointer_ = i + 1 + + #@jit.unroll_safe + def _stack_pop_n(self, n): l = [None] * n for i in range(n-1, -1, -1): - l[i] = self.pop() - debug.make_sure_not_resized(l) + l[i] = self._stack_pop() + #debug.make_sure_not_resized(l) return l - - def check_stack(self): - assert self.stack_pointer == 1 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit