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