Author: Stephan <[email protected]>
Branch: 
Changeset: r86:41173b2794c7
Date: 2011-05-19 17:52 +0200
http://bitbucket.org/pypy/lang-js/changeset/41173b2794c7/

Log:    replaces implementation of Stack()

diff --git a/js/jscode.py b/js/jscode.py
--- a/js/jscode.py
+++ b/js/jscode.py
@@ -16,28 +16,40 @@
     pass
 
 class Stack(object):
-    def __init__(self):
-        self.content = []
+    def __init__(self, size):
+        self.content = [None] * size
+        self.pointer = 0
 
     def pop(self):
-        return self.content.pop()
+        e = self.top()
+        i = self.pointer - 1
+        assert i >= 0
+        self.content[i] = None
+        self.pointer = i
+        return e
 
     def top(self):
-        return self.content[-1]
+        i = self.pointer - 1
+        if i < 0:
+            raise IndexError
+        return self.content[i]
 
     def append(self, element):
         assert isinstance(element, W_Root)
-        self.content.append(element)
+        i = self.pointer
+        assert i >= 0
+        self.content[i] = element
+        self.pointer = i + 1
 
     def pop_n(self, n):
-        to_cut = len(self.content) - n
-        assert to_cut >= 0
-        list = self.content[to_cut:]
-        del self.content[to_cut:]
+        list = []
+        for i in xrange(0, n):
+            list.append(self.pop())
+        list.reverse()
         return list
 
     def check(self):
-        assert len(self.content) == 1
+        assert self.pointer == 1
 
 class JsCode(object):
     """ That object stands for code of a single javascript function
@@ -167,7 +179,7 @@
         self.opcodes = make_sure_not_resized(code)
 
     def run(self, ctx, check_stack=True):
-        stack = Stack()
+        stack = Stack(len(self.opcodes) * 2)
         try:
             return self.run_bytecode(ctx, stack, check_stack)
         except ReturnException, e:
diff --git a/js/test/test_stack.py b/js/test/test_stack.py
new file mode 100644
--- /dev/null
+++ b/js/test/test_stack.py
@@ -0,0 +1,75 @@
+import py
+
+from js import interpreter
+from js.jscode import Stack
+from js.jsobj import W_IntNumber
+
+jsint = interpreter.Interpreter()
+ctx   = jsint.w_Global
+one   = W_IntNumber(1)
+two   = W_IntNumber(2)
+three = W_IntNumber(3)
+
+def test_stack_push():
+    s = Stack(99)
+    assert len(s.content) == 99
+    assert s.content == [None] * 99
+
+    s = Stack(99)
+    s.append(one)
+    assert s.content[0] == one
+    assert s.pointer == 1
+
+    s = Stack(99)
+    s.append(one)
+    s.append(two)
+    s.append(three)
+    assert s.content[0] == one
+    assert s.content[1] == two
+    assert s.content[2] == three
+    assert s.pointer == 3
+
+def test_stack_pop():
+    s = Stack(99)
+    s.append(one)
+    s.append(two)
+    s.append(three)
+    assert s.pop() == three
+    assert s.pointer == 2
+    assert s.content[2] == None
+
+    s = Stack(99)
+    s.append(one)
+    s.append(two)
+    s.append(three)
+    assert s.pop() == three
+    assert s.pop() == two
+    assert s.pop() == one
+
+def test_stack_last():
+    s = Stack(99)
+    s.append(one)
+    assert s.top() == one
+
+    s = Stack(99)
+    s.append(one)
+    s.append(two)
+    s.append(three)
+    assert s.top() == three
+
+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.pointer == 1
+    assert s.content[1] == None
+    assert s.content[2] == None
+
+def test_stack_max():
+    s = Stack(2)
+    s.append(one)
+    s.append(one)
+    py.test.raises(IndexError, s.append,one)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to