Skip to content

Commit 2ea41a2

Browse files
committed
Keep sendmsg errors and drop duplicate linecache
Replace sendmsg iterable TypeError only. Register REPL source in linecache once per compiled input. Assisted-by: Grok:grok-4.6
1 parent 7d4ea4b commit 2ea41a2

2 files changed

Lines changed: 15 additions & 8 deletions

File tree

‎crates/stdlib/src/socket.rs‎

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2089,9 +2089,19 @@ mod _socket {
20892089
msg = msg.with_addr(&sockaddr);
20902090
}
20912091

2092-
let buffer_items = vm
2093-
.extract_elements_with(&buffers, Ok)
2094-
.map_err(|_| vm.new_type_error("sendmsg() argument 1 must be an iterable"))?;
2092+
let collect_iterable =
2093+
|obj: &PyObject, msg: &'static str| -> PyResult<Vec<PyObjectRef>> {
2094+
match vm.extract_elements_with(obj, Ok) {
2095+
Ok(items) => Ok(items),
2096+
Err(e) if e.fast_isinstance(vm.ctx.exceptions.type_error) => {
2097+
Err(vm.new_type_error(msg))
2098+
}
2099+
Err(e) => Err(e),
2100+
}
2101+
};
2102+
2103+
let buffer_items =
2104+
collect_iterable(&buffers, "sendmsg() argument 1 must be an iterable")?;
20952105
let buffers = buffer_items
20962106
.into_iter()
20972107
.map(|obj| ArgBytesLike::try_from_object(vm, obj))
@@ -2108,9 +2118,8 @@ mod _socket {
21082118

21092119
let control_buf;
21102120
if let OptionalArg::Present(ancdata) = ancdata {
2111-
let cmsg_fast = vm
2112-
.extract_elements_with(&ancdata, Ok)
2113-
.map_err(|_| vm.new_type_error("sendmsg() argument 2 must be an iterable"))?;
2121+
let cmsg_fast =
2122+
collect_iterable(&ancdata, "sendmsg() argument 2 must be an iterable")?;
21142123
let cmsgs = cmsg_fast
21152124
.into_iter()
21162125
.map(|item| -> PyResult<(i32, i32, ArgBytesLike)> {

‎src/shell.rs‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@ fn shell_exec(
4444
*future_features |= code.code.flags & CodeFlags::FUTURE_MASK;
4545
let _ = vm.register_code_in_linecache(&code, source);
4646
if empty_line_given || !continuing_block {
47-
// We want to execute the full code
48-
let _ = vm.register_code_in_linecache(&code, source);
4947
match vm.run_code_obj(code, scope) {
5048
Ok(_val) => ShellExecResult::Ok,
5149
Err(err) => ShellExecResult::PyErr(err),

0 commit comments

Comments
 (0)