@@ -58,14 +58,14 @@ fn buffered_io_base_init(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
58
58
Ok ( vm. get_none ( ) )
59
59
}
60
60
61
- fn buffered_io_base_read ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
61
+ fn buffered_reader_read ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
62
62
arg_check ! (
63
63
vm,
64
64
args,
65
65
required = [ ( buffered, None ) ]
66
66
) ;
67
- let buff_size = 8 ;
68
- let mut buffer = vm. ctx . new_bytes ( vec ! [ 0 ; buff_size] ) ;
67
+ let buff_size = 8 * 1024 ;
68
+ let buffer = vm. ctx . new_bytes ( vec ! [ 0 ; buff_size] ) ;
69
69
70
70
//buffer method
71
71
let mut result = vec ! [ ] ;
@@ -75,8 +75,12 @@ fn buffered_io_base_read(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult
75
75
76
76
while length == buff_size {
77
77
let raw_read = vm. get_method ( raw. clone ( ) , & "readinto" . to_string ( ) ) . unwrap ( ) ;
78
- vm. invoke ( raw_read, PyFuncArgs :: new ( vec ! [ buffer. clone( ) ] , vec ! [ ] ) ) ;
79
-
78
+ match vm. invoke ( raw_read, PyFuncArgs :: new ( vec ! [ buffer. clone( ) ] , vec ! [ ] ) ) {
79
+ Ok ( _) => { } ,
80
+ Err ( _) => {
81
+ return Err ( vm. new_value_error ( "IO Error" . to_string ( ) ) )
82
+ }
83
+ }
80
84
81
85
match buffer. borrow_mut ( ) . kind {
82
86
PyObjectKind :: Bytes { ref mut value } => {
@@ -140,7 +144,10 @@ fn file_io_read(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
140
144
141
145
let mut bytes = vec ! [ ] ;
142
146
if let Ok ( mut buff) = buffer {
143
- buff. read_to_end ( & mut bytes) ;
147
+ match buff. read_to_end ( & mut bytes) {
148
+ Ok ( _) => { } ,
149
+ Err ( _) => return Err ( vm. new_value_error ( "Error reading from Buffer" . to_string ( ) ) )
150
+ }
144
151
}
145
152
146
153
Ok ( vm. ctx . new_bytes ( bytes) )
@@ -172,7 +179,10 @@ fn file_io_readinto(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
172
179
match obj. borrow_mut ( ) . kind {
173
180
PyObjectKind :: Bytes { ref mut value } => {
174
181
value. clear ( ) ;
175
- f. read_to_end ( & mut * value) ;
182
+ match f. read_to_end ( & mut * value) {
183
+ Ok ( _) => { } ,
184
+ Err ( _) => return Err ( vm. new_value_error ( "Error reading from Take" . to_string ( ) ) )
185
+ }
176
186
177
187
} ,
178
188
_ => { }
@@ -203,31 +213,34 @@ fn file_io_write(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
203
213
match obj. borrow_mut ( ) . kind {
204
214
PyObjectKind :: Bytes { ref mut value } => {
205
215
match handle. write ( & value[ ..] ) {
206
- Ok ( k) => { println ! ( "{}" , k) ; } ,
216
+ Ok ( k) => { println ! ( "{}" , k) ; } , //set result to py_int and return
207
217
Err ( _) => { }
208
218
}
209
219
} ,
210
220
_ => { }
211
221
} ;
212
222
223
+ let new_handle = handle. into_raw_fd ( ) . to_bigint ( ) ;
224
+ vm. ctx . set_attr ( & file_io, "fileno" , vm. ctx . new_int ( new_handle. unwrap ( ) ) ) ;
225
+
213
226
let len_method = vm. get_method ( obj. clone ( ) , & "__len__" . to_string ( ) ) ;
214
227
vm. invoke ( len_method. unwrap ( ) , PyFuncArgs :: default ( ) )
215
228
216
- //TODO: reset fileno
217
-
218
229
}
219
230
220
- fn buffered_reader_init ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
231
+ fn buffered_writer_write ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
221
232
arg_check ! (
222
- vm,
223
- args,
224
- required = [ ( buffed_reader , None ) , ( raw , None ) ]
233
+ vm,
234
+ args,
235
+ required = [ ( buffered , None ) , ( obj , Some ( vm . ctx . bytes_type ( ) ) ) ]
225
236
) ;
226
237
238
+ let raw = vm. ctx . get_attr ( & buffered, "raw" ) . unwrap ( ) ;
239
+ let raw_write = vm. get_method ( raw. clone ( ) , & "write" . to_string ( ) ) . unwrap ( ) ;
240
+
241
+ //This should be replaced with a more appropriate chunking implementation
242
+ vm. invoke ( raw_write, PyFuncArgs :: new ( vec ! [ obj. clone( ) ] , vec ! [ ] ) )
227
243
228
- //simple calls read on the read class!
229
- // TODO
230
- Ok ( vm. get_none ( ) )
231
244
}
232
245
233
246
fn io_open ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
@@ -239,32 +252,31 @@ fn io_open(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
239
252
240
253
let module = mk_module ( & vm. ctx ) ;
241
254
242
- let rust_mode = objstr:: get_value ( mode) ;
243
- if rust_mode. contains ( "w" ) {
244
- vm. new_not_implemented_error ( "Writes are not yet implemented" . to_string ( ) ) ;
245
- }
246
-
255
+ //mode is optional: 'rt' is the default mode (open from reading text)
256
+ //To start we construct a FileIO (subclass of RawIOBase)
247
257
let file_io_class = vm. ctx . get_attr ( & module, "FileIO" ) . unwrap ( ) ;
248
- vm. invoke ( file_io_class, PyFuncArgs :: new ( vec ! [ file. clone( ) ] , vec ! [ ] ) )
249
-
250
-
251
-
252
- // vm.get_method(fi.clone(), &"__new__".to_string());
258
+ let buffered_writer_class = vm. ctx . get_attr ( & module, "BufferedWriter" ) . unwrap ( ) ;
259
+ let buffered_reader_class = vm. ctx . get_attr ( & module, "BufferedReader" ) . unwrap ( ) ;
253
260
254
- // let buffer = vm.ctx.new_bytearray(vec![]);
255
- // vm.invoke(new_file_io.unwrap(), PyFuncArgs {
256
- // args: vec![fi.clone(), file.clone()],
257
- // kwargs: vec![]
258
- // });
259
- // Ok(fi)
261
+ //instantiate raw fileio
262
+ let file_io = vm. invoke ( file_io_class, PyFuncArgs :: new ( vec ! [ file. clone( ) ] , vec ! [ ] ) ) . unwrap ( ) ;
260
263
261
- //mode is optional: 'rt' is the default mode (open from reading text)
262
- //To start we construct a FileIO (subclass of RawIOBase)
263
264
//This is subsequently consumed by a Buffered_class of type depending
264
265
//operation in the mode. i.e:
266
+ let rust_mode = objstr:: get_value ( mode) ;
267
+
265
268
// updating => PyBufferedRandom
266
269
// creating || writing || appending => BufferedWriter
270
+ let buffered = if rust_mode. contains ( "w" ) {
271
+ // vm.new_not_implemented_error("Writes are not yet implemented".to_string());
272
+ println ! ( "writer class" ) ;
273
+ vm. invoke ( buffered_writer_class, PyFuncArgs :: new ( vec ! [ file_io. clone( ) ] , vec ! [ ] ) )
267
274
// reading => BufferedReader
275
+ } else {
276
+ vm. invoke ( buffered_reader_class, PyFuncArgs :: new ( vec ! [ file_io. clone( ) ] , vec ! [ ] ) )
277
+ } ;
278
+
279
+ buffered
268
280
// If the mode is binary this Buffered class is returned directly at
269
281
// this point.
270
282
//For Buffered class construct "raw" IO class e.g. FileIO and pass this into corresponding field
@@ -288,7 +300,6 @@ pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
288
300
289
301
let buffered_io_base = ctx. new_class ( "BufferedIOBase" , io_base. clone ( ) ) ;
290
302
ctx. set_attr ( & buffered_io_base, "__init__" , ctx. new_rustfunc ( buffered_io_base_init) ) ;
291
- ctx. set_attr ( & buffered_io_base, "read" , ctx. new_rustfunc ( buffered_io_base_read) ) ;
292
303
ctx. set_attr ( & py_mod, "BufferedIOBase" , buffered_io_base. clone ( ) ) ;
293
304
294
305
let text_io_base = ctx. new_class ( "TextIOBase" , io_base. clone ( ) ) ;
@@ -305,10 +316,12 @@ pub fn mk_module(ctx: &PyContext) -> PyObjectRef {
305
316
306
317
// BufferedIOBase Subclasses
307
318
let buffered_reader = ctx. new_class ( "BufferedReader" , buffered_io_base. clone ( ) ) ;
319
+ ctx. set_attr ( & buffered_reader, "read" , ctx. new_rustfunc ( buffered_reader_read) ) ;
308
320
ctx. set_attr ( & py_mod, "BufferedReader" , buffered_reader. clone ( ) ) ;
309
321
310
- let buffered_reader = ctx. new_class ( "BufferedWriter" , buffered_io_base. clone ( ) ) ;
311
- ctx. set_attr ( & py_mod, "BufferedWriter" , buffered_reader. clone ( ) ) ;
322
+ let buffered_writer = ctx. new_class ( "BufferedWriter" , buffered_io_base. clone ( ) ) ;
323
+ ctx. set_attr ( & buffered_writer, "write" , ctx. new_rustfunc ( buffered_writer_write) ) ;
324
+ ctx. set_attr ( & py_mod, "BufferedWriter" , buffered_writer. clone ( ) ) ;
312
325
313
326
//TextIOBase Subclass
314
327
let text_io_wrapper = ctx. new_class ( "TextIOWrapper" , ctx. object ( ) ) ;
0 commit comments