Author: Stephan <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit