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