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