Skip to content

Commit 9954361

Browse files
committed
Move more socket methods to new arg style
1 parent 206ba4d commit 9954361

File tree

1 file changed

+41
-58
lines changed

1 file changed

+41
-58
lines changed

vm/src/stdlib/socket.rs

Lines changed: 41 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use crate::function::PyFuncArgs;
99
use crate::obj::objbytes;
1010
use crate::obj::objbytes::PyBytesRef;
1111
use crate::obj::objint;
12+
use crate::obj::objint::PyIntRef;
1213
use crate::obj::objstr;
1314
use crate::obj::objtuple::PyTupleRef;
1415
use crate::pyobject::{PyObjectRef, PyRef, PyResult, PyValue, TryFromObject};
@@ -251,6 +252,43 @@ impl SocketRef {
251252
_ => Err(vm.new_not_implemented_error("".to_string())),
252253
}
253254
}
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+
}
254292
}
255293

256294
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
274312
))
275313
}
276314

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-
332315
fn socket_recvfrom(vm: &VirtualMachine, args: PyFuncArgs) -> PyResult {
333316
arg_check!(
334317
vm,
@@ -420,11 +403,11 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
420403
let socket = py_class!(ctx, "socket", ctx.object(), {
421404
"__new__" => ctx.new_rustfunc(SocketRef::new),
422405
"connect" => ctx.new_rustfunc(SocketRef::connect),
423-
"recv" => ctx.new_rustfunc(socket_recv),
406+
"recv" => ctx.new_rustfunc(SocketRef::recv),
424407
"send" => ctx.new_rustfunc(socket_send),
425408
"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),
428411
"close" => ctx.new_rustfunc(socket_close),
429412
"getsockname" => ctx.new_rustfunc(socket_getsockname),
430413
"sendto" => ctx.new_rustfunc(SocketRef::sendto),

0 commit comments

Comments
 (0)