Author: Tim Felgentreff <timfelgentr...@gmail.com>
Branch: 
Changeset: r147:596d12afe439
Date: 2013-03-08 15:15 +0100
http://bitbucket.org/pypy/lang-smalltalk/changeset/596d12afe439/

Log:    (tfel, tpape) add FILE_OPEN, CLOSE, and WRITE primitives

diff --git a/spyvm/primitives.py b/spyvm/primitives.py
--- a/spyvm/primitives.py
+++ b/spyvm/primitives.py
@@ -1,3 +1,4 @@
+import os
 import inspect
 import math
 import operator
@@ -753,10 +754,35 @@
 DIRECTORY_LOOKUP = 162
 DIRECTORY_DELTE = 163
 
+@expose_primitive(FILE_CLOSE, unwrap_spec=[object, int])
+def func(interp, s_frame, w_rcvr, fd):
+    try:
+        os.close(fd)
+        return w_rcvr
+    except OSError:
+        raise PrimitiveFailedError()
+
+@expose_primitive(FILE_OPEN, unwrap_spec=[object, str, object])
+def func(interp, s_frame, w_rcvr, filename, w_writeable_flag):
+    try:
+        fd = os.open(
+            filename,
+            (os.O_RDWR | os.O_CREAT | os.O_TRUNC) if w_writeable_flag is 
interp.space.w_true else os.O_RDONLY
+        )
+        return interp.space.wrap_int(fd)
+    except OSError:
+        raise PrimitiveFailedError()
+
+@expose_primitive(FILE_WRITE, unwrap_spec=[object, int, str, int, int])
+def func(interp, s_frame, w_rcvr, fd, src, start, count):
+    try:
+        os.write(fd, src[start - 1:start + count - 1])
+        return w_rcvr
+    except OSError:
+        raise PrimitiveFailedError()
 
 @expose_primitive(DIRECTORY_DELIMITOR, unwrap_spec=[object])
 def func(interp, s_frame, _):
-    import os.path
     return interp.space.wrap_char(os.path.sep)
 
 
diff --git a/spyvm/test/test_primitives.py b/spyvm/test/test_primitives.py
--- a/spyvm/test/test_primitives.py
+++ b/spyvm/test/test_primitives.py
@@ -1,4 +1,5 @@
 import py
+import os
 import math
 from spyvm.primitives import prim_table, PrimitiveFailedError
 from spyvm import model, shadow, interpreter
@@ -440,12 +441,57 @@
     w_obj.atput0(space, 0, space.wrap_int(2))
     assert space.unwrap_int(w_v.at0(space, 0)) == 1
     
+def test_file_open_write(monkeypatch):
+    def open_write(filename, mode):
+        assert filename == "nonexistant"
+        assert mode == os.O_RDWR | os.O_CREAT | os.O_TRUNC
+        return 42
+    monkeypatch.setattr(os, "open", open_write)
+    try:
+        w_c = prim(primitives.FILE_OPEN, [1, space.wrap_string("nonexistant"), 
space.w_true])
+    finally:
+        monkeypatch.undo()
+    assert space.unwrap_int(w_c) == 42
+
+def test_file_open_read(monkeypatch):
+    def open_read(filename, mode):
+        assert filename == "file"
+        assert mode == os.O_RDONLY
+        return 42
+    monkeypatch.setattr(os, "open", open_read)
+    try:
+        w_c = prim(primitives.FILE_OPEN, [1, space.wrap_string("file"), 
space.w_false])
+    finally:
+        monkeypatch.undo()
+    assert space.unwrap_int(w_c) == 42
+
+def test_file_close(monkeypatch):
+    def close(fd):
+        assert fd == 42
+    monkeypatch.setattr(os, "close", close)
+    try:
+        w_c = prim(primitives.FILE_CLOSE, [1, space.wrap_int(42)])
+    finally:
+        monkeypatch.undo()
+
+def test_file_write(monkeypatch):
+    def write(fd, string):
+        assert fd == 42
+        assert string == "ell"
+    monkeypatch.setattr(os, "write", write)
+    try:
+        w_c = prim(
+            primitives.FILE_WRITE,
+            [1, space.wrap_int(42), space.wrap_string("hello"), 
space.wrap_int(2), space.wrap_int(3)]
+        )
+    finally:
+        monkeypatch.undo()
+
 def test_directory_delimitor():
     import os.path
     w_c = prim(primitives.DIRECTORY_DELIMITOR, [1])
     assert space.unwrap_char(w_c) == os.path.sep
 
-
 def test_primitive_closure_copyClosure():
     from test_interpreter import new_frame
     w_frame, s_frame = new_frame("<never called, but used for method 
generation>",
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to