@@ -9,6 +9,7 @@ use crate::function::PyFuncArgs;
9
9
use crate :: obj:: objbytes;
10
10
use crate :: obj:: objbytes:: PyBytesRef ;
11
11
use crate :: obj:: objint;
12
+ use crate :: obj:: objint:: PyIntRef ;
12
13
use crate :: obj:: objstr;
13
14
use crate :: obj:: objtuple:: PyTupleRef ;
14
15
use crate :: pyobject:: { PyObjectRef , PyRef , PyResult , PyValue , TryFromObject } ;
@@ -251,6 +252,43 @@ impl SocketRef {
251
252
_ => Err ( vm. new_not_implemented_error ( "" . to_string ( ) ) ) ,
252
253
}
253
254
}
255
+
256
+ fn listen ( self , _num : PyIntRef , _vm : & VirtualMachine ) -> ( ) { }
257
+
258
+ fn accept ( self , vm : & VirtualMachine ) -> PyResult {
259
+ let ret = match self . con . borrow_mut ( ) . as_mut ( ) {
260
+ Some ( v) => v. accept ( ) ,
261
+ None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
262
+ } ;
263
+
264
+ let ( tcp_stream, addr) = match ret {
265
+ Ok ( ( socket, addr) ) => ( socket, addr) ,
266
+ Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
267
+ } ;
268
+
269
+ let socket = Socket {
270
+ address_family : self . address_family ,
271
+ socket_kind : self . socket_kind ,
272
+ con : RefCell :: new ( Some ( Connection :: TcpStream ( tcp_stream) ) ) ,
273
+ }
274
+ . into_ref ( vm) ;
275
+
276
+ let addr_tuple = get_addr_tuple ( vm, addr) ?;
277
+
278
+ Ok ( vm. ctx . new_tuple ( vec ! [ socket. into_object( ) , addr_tuple] ) )
279
+ }
280
+
281
+ fn recv ( self , bufsize : PyIntRef , vm : & VirtualMachine ) -> PyResult {
282
+ let mut buffer = vec ! [ 0u8 ; bufsize. as_bigint( ) . to_usize( ) . unwrap( ) ] ;
283
+ match self . con . borrow_mut ( ) . as_mut ( ) {
284
+ Some ( v) => match v. read_exact ( & mut buffer) {
285
+ Ok ( _) => ( ) ,
286
+ Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
287
+ } ,
288
+ None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
289
+ } ;
290
+ Ok ( vm. ctx . new_bytes ( buffer) )
291
+ }
254
292
}
255
293
256
294
fn get_address_string ( vm : & VirtualMachine , address : PyTupleRef ) -> Result < String , PyObjectRef > {
@@ -274,61 +312,6 @@ fn get_address_string(vm: &VirtualMachine, address: PyTupleRef) -> Result<String
274
312
) )
275
313
}
276
314
277
- fn socket_listen ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
278
- arg_check ! (
279
- vm,
280
- args,
281
- required = [ ( _zelf, None ) , ( _num, Some ( vm. ctx. int_type( ) ) ) ]
282
- ) ;
283
- Ok ( vm. get_none ( ) )
284
- }
285
-
286
- fn socket_accept ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
287
- arg_check ! ( vm, args, required = [ ( zelf, None ) ] ) ;
288
-
289
- let socket = get_socket ( zelf) ;
290
-
291
- let ret = match socket. con . borrow_mut ( ) . as_mut ( ) {
292
- Some ( v) => v. accept ( ) ,
293
- None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
294
- } ;
295
-
296
- let ( tcp_stream, addr) = match ret {
297
- Ok ( ( socket, addr) ) => ( socket, addr) ,
298
- Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
299
- } ;
300
-
301
- let socket = Socket {
302
- address_family : socket. address_family ,
303
- socket_kind : socket. socket_kind ,
304
- con : RefCell :: new ( Some ( Connection :: TcpStream ( tcp_stream) ) ) ,
305
- }
306
- . into_ref ( vm) ;
307
-
308
- let addr_tuple = get_addr_tuple ( vm, addr) ?;
309
-
310
- Ok ( vm. ctx . new_tuple ( vec ! [ socket. into_object( ) , addr_tuple] ) )
311
- }
312
-
313
- fn socket_recv ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
314
- arg_check ! (
315
- vm,
316
- args,
317
- required = [ ( zelf, None ) , ( bufsize, Some ( vm. ctx. int_type( ) ) ) ]
318
- ) ;
319
- let socket = get_socket ( zelf) ;
320
-
321
- let mut buffer = vec ! [ 0u8 ; objint:: get_value( bufsize) . to_usize( ) . unwrap( ) ] ;
322
- match socket. con . borrow_mut ( ) . as_mut ( ) {
323
- Some ( v) => match v. read_exact ( & mut buffer) {
324
- Ok ( _) => ( ) ,
325
- Err ( s) => return Err ( vm. new_os_error ( s. to_string ( ) ) ) ,
326
- } ,
327
- None => return Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
328
- } ;
329
- Ok ( vm. ctx . new_bytes ( buffer) )
330
- }
331
-
332
315
fn socket_recvfrom ( vm : & VirtualMachine , args : PyFuncArgs ) -> PyResult {
333
316
arg_check ! (
334
317
vm,
@@ -420,11 +403,11 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
420
403
let socket = py_class ! ( ctx, "socket" , ctx. object( ) , {
421
404
"__new__" => ctx. new_rustfunc( SocketRef :: new) ,
422
405
"connect" => ctx. new_rustfunc( SocketRef :: connect) ,
423
- "recv" => ctx. new_rustfunc( socket_recv ) ,
406
+ "recv" => ctx. new_rustfunc( SocketRef :: recv ) ,
424
407
"send" => ctx. new_rustfunc( socket_send) ,
425
408
"bind" => ctx. new_rustfunc( SocketRef :: bind) ,
426
- "accept" => ctx. new_rustfunc( socket_accept ) ,
427
- "listen" => ctx. new_rustfunc( socket_listen ) ,
409
+ "accept" => ctx. new_rustfunc( SocketRef :: accept ) ,
410
+ "listen" => ctx. new_rustfunc( SocketRef :: listen ) ,
428
411
"close" => ctx. new_rustfunc( socket_close) ,
429
412
"getsockname" => ctx. new_rustfunc( socket_getsockname) ,
430
413
"sendto" => ctx. new_rustfunc( SocketRef :: sendto) ,
0 commit comments