Skip to content

Commit 05add64

Browse files
committed
stacklets added
1 parent 8ceea05 commit 05add64

8 files changed

Lines changed: 101 additions & 11 deletions

File tree

pixie/vm/code.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
py_object = object
12
import pixie.vm.object as object
23
from pixie.vm.primitives import nil, true, false
34
from rpython.rlib.rarithmetic import r_uint
@@ -157,7 +158,7 @@ def deref(self):
157158
return val
158159

159160

160-
class Namespace(__builtins__.object):
161+
class Namespace(py_object):
161162
def __init__(self, name):
162163
self._registry = {}
163164
self._name = name
@@ -173,7 +174,7 @@ def intern_or_make(self, name):
173174
def get(self, name, default):
174175
return self._registry.get(name, default)
175176

176-
class NamespaceRegistry(__builtins__.object):
177+
class NamespaceRegistry(py_object):
177178
def __init__(self):
178179
self._registry = {}
179180

pixie/vm/numbers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def type(self):
2626
return Integer._type
2727

2828
zero_int = Integer(0)
29-
one_int = Integer(0)
29+
one_int = Integer(1)
3030

3131
IMath = Protocol("IMath")
3232
_add = DoublePolymorphicFn("-add", IMath)

pixie/vm/protocols.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from pixie.vm.primitives import true, false, nil
55
from pixie.vm.numbers import Integer, zero_int, _add
66
import rpython.rlib.jit as jit
7-
7+
import rpython.rlib.rstacklet as rstacklet
88

99

1010
defprotocol("pixie.stdlib", "ISeq", ["-first", "-next"])
@@ -80,4 +80,6 @@ def conj(a, b):
8080
def nth(a, b):
8181
return rt._nth(a, b)
8282

83+
84+
8385
import pixie.vm.rt as rt

pixie/vm/reader.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
py_object = object
12
import pixie.vm.object as object
23
from pixie.vm.primitives import nil, true, false
34
import pixie.vm.numbers as numbers
@@ -64,7 +65,7 @@ def eat_whitespace(rdr):
6465
return
6566

6667

67-
class ReaderHandler(__builtins__.object):
68+
class ReaderHandler(py_object):
6869
def invoke(self, rdr, ch):
6970
pass
7071

pixie/vm/rt.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ def unwrap(fn):
44
return lambda *args: fn.invoke(list(args))
55

66
def init():
7+
if globals().has_key("__inited__"):
8+
return
9+
710
import pixie.vm.protocols as proto
811
from pixie.vm.code import BaseCode
912
for name, fn in proto.__dict__.iteritems():
@@ -16,5 +19,7 @@ def init():
1619
if isinstance(fn, BaseCode):
1720
globals()[name] = unwrap(fn)
1821

22+
globals()["__inited__"] = True
23+
1924

2025

pixie/vm/stacklet.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
py_object = object
2+
import pixie.vm.object as object
3+
from pixie.vm.primitives import nil, true, false
4+
from pixie.vm.code import BaseCode
5+
from pixie.vm.numbers import Integer
6+
import pixie.vm.protocols as proto
7+
from pixie.vm.code import extend, as_var
8+
from rpython.rlib.rarithmetic import r_uint as r_uint32, intmask, widen
9+
import rpython.rlib.jit as jit
10+
import pixie.vm.rt as rt
11+
import rpython.rlib.rstacklet as rstacklet
12+
13+
th = rstacklet.StackletThread(None)
14+
15+
class Box(py_object):
16+
def __init__(self):
17+
self._val = None
18+
19+
box = Box()
20+
21+
class WrappedHandler(BaseCode):
22+
_type = object.Type("Stacklet")
23+
def __init__(self, h, box):
24+
self._h = h
25+
self._box = box
26+
27+
def switch_to(self, val):
28+
self._box._val = val
29+
self._h = th.switch(self._h)
30+
return self._box._val
31+
32+
def _invoke(self, args):
33+
assert len(args) == 1
34+
return self.switch_to(args[0])
35+
36+
37+
38+
def new_stacklet(f, val):
39+
global box
40+
box = Box()
41+
self_box = box
42+
def default_handler(h, o):
43+
global box
44+
handler = WrappedHandler(h, box)
45+
box = None
46+
handler._h = th.switch(handler._h)
47+
retval = f.invoke([handler, val])
48+
return handler._h
49+
50+
h = th.new(default_handler)
51+
return WrappedHandler(h, self_box)

pixie/vm/test/test_compile.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,13 @@ def test_return_self():
5959

6060
def test_recursive():
6161
retval = eval_string("""((fn rf [x]
62-
(if (platform= x 100)
62+
(if (platform= x 10)
6363
x
6464
(recur (+ x 1))))
6565
0)""")
6666

6767
assert isinstance(retval, Integer)
68-
assert retval.int_val() == 100
68+
assert retval.int_val() == 10
6969

7070
def test_closures():
7171
retval = eval_string("""((fn [x] ((fn [] x))) 42)""")
@@ -92,21 +92,21 @@ def test_native():
9292

9393
def test_build_list():
9494
retval = eval_string("""((fn [i lst]
95-
(if (platform= i 100)
95+
(if (platform= i 10)
9696
(count lst)
9797
(recur (+ i 1) (cons i lst)))) 0 nil)
9898
""")
9999

100-
assert isinstance(retval, Integer) and retval.int_val() == 100
100+
assert isinstance(retval, Integer) and retval.int_val() == 10
101101

102102
def test_build_vector():
103103
retval = eval_string("""((fn [i lst]
104-
(if (platform= i 100)
104+
(if (platform= i 10)
105105
(count lst)
106106
(recur (+ i 1) (conj lst i)))) 0 [])
107107
""")
108108

109-
assert isinstance(retval, Integer) and retval.int_val() == 100
109+
assert isinstance(retval, Integer) and retval.int_val() == 10
110110
#
111111
# def test_handlers():
112112
# retval = eval_string("""(def x 42)

pixie/vm/test/test_stacklet.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import pixie.vm.stacklet as stacklet
2+
import pixie.vm.code as code
3+
import pixie.vm.rt as rt
4+
import pixie.vm.numbers as numbers
5+
from pixie.vm.primitives import nil
6+
7+
class YieldingFn(code.BaseCode):
8+
def _invoke(self, args):
9+
assert len(args) == 2
10+
hdler = args[0]
11+
arg = args[1]
12+
13+
hdler.invoke([numbers.zero_int])
14+
hdler.invoke([numbers.one_int])
15+
hdler.invoke([numbers.Integer(2)])
16+
17+
return
18+
19+
20+
21+
def test_stacklets():
22+
st = stacklet.new_stacklet(YieldingFn(), nil)
23+
result = st.invoke([nil])
24+
assert isinstance(result, numbers.Integer) and result.int_val() == 0
25+
result = st.invoke([nil])
26+
assert isinstance(result, numbers.Integer) and result.int_val() == 1
27+
result = st.invoke([nil])
28+
assert isinstance(result, numbers.Integer) and result.int_val() == 2
29+
30+
pass

0 commit comments

Comments
 (0)