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

Reply via email to