address review: assignment scan and wasm TLS (#8716) · RustPython/RustPython@ea02f84 · GitHub
Skip to content

Commit ea02f84

Browse files
authored
address review: assignment scan and wasm TLS (#8716)
* address review: assignment scan and wasm TLS Skip comments and lambda defaults in the condition assignment scanner. Restrict the suite-header colon fallback to yield targets. Capture __del__ before calling it. Store browser socket timeouts as f64 and accept integers. Fail closed when wasm verify_mode is not CERT_NONE. Export getpeercert and feed MemoryBIO EOF. Assisted-by: Grok:grok-4.6 * address review: parenthesized yield suite header Walk through grouping parentheses before requiring yield after a suite-header colon. Assisted-by: Grok:grok-4.6
1 parent 91eb0f8 commit ea02f84

4 files changed

Lines changed: 103 additions & 24 deletions

File tree

crates/compiler/src/lib.rs

Lines changed: 32 additions & 3 deletions

crates/vm/src/object/core.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1949,8 +1949,8 @@ impl PyObject {
19491949
// during __del__, preventing safe_inc from seeing 0.
19501950
zelf.0.ref_count.inc_by(2);
19511951

1952+
let del_method = zelf.get_class_attr(identifier!(vm, __del__)).unwrap();
19521953
if let Err(e) = slot_del(zelf, vm) {
1953-
let del_method = zelf.get_class_attr(identifier!(vm, __del__)).unwrap();
19541954
let msg = del_method
19551955
.repr(vm)
19561956
.ok()

crates/wasm/src/socket.rs

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ mod _socket {
66
Py, PyObjectRef, PyPayload, PyRef, PyResult, VirtualMachine,
77
builtins::{PyType, PyTypeRef},
88
common::lock::PyMutex,
9-
function::{OptionalArg, OptionalOption},
9+
function::{ArgIntoFloat, OptionalArg},
1010
types::{Constructor, Initializer},
1111
};
1212
use std::net::{Ipv4Addr, Ipv6Addr};
13-
use std::sync::atomic::{AtomicI32, Ordering};
13+
use std::sync::atomic::{AtomicI32, AtomicU64, Ordering};
1414

1515
#[pyattr]
1616
const AF_UNSPEC: i32 = 0;
@@ -102,7 +102,7 @@ mod _socket {
102102
#[pyattr(name = "has_ipv6")]
103103
const HAS_IPV6: bool = true;
104104

105-
static DEFAULT_TIMEOUT: AtomicI32 = AtomicI32::new(-1);
105+
static DEFAULT_TIMEOUT: AtomicU64 = AtomicU64::new(f64::to_bits(-1.0));
106106

107107
fn unsupported(
108108
vm: &VirtualMachine,
@@ -229,18 +229,24 @@ mod _socket {
229229

230230
#[pyfunction]
231231
fn getdefaulttimeout() -> Option<f64> {
232-
let timeout = DEFAULT_TIMEOUT.load(Ordering::Relaxed);
233-
(timeout >= 0).then_some(f64::from(timeout))
232+
let timeout = f64::from_bits(DEFAULT_TIMEOUT.load(Ordering::Relaxed));
233+
(timeout >= 0.0).then_some(timeout)
234234
}
235235

236236
#[pyfunction]
237-
fn setdefaulttimeout(timeout: OptionalOption<f64>, vm: &VirtualMachine) -> PyResult<()> {
238-
match timeout.flatten() {
239-
None => DEFAULT_TIMEOUT.store(-1, Ordering::Relaxed),
240-
Some(value) if value >= 0.0 => {
241-
DEFAULT_TIMEOUT.store(value as i32, Ordering::Relaxed);
237+
fn setdefaulttimeout(timeout: Option<ArgIntoFloat>, vm: &VirtualMachine) -> PyResult<()> {
238+
match timeout {
239+
None => DEFAULT_TIMEOUT.store((-1.0f64).to_bits(), Ordering::Relaxed),
240+
Some(value) => {
241+
let value = value.into_float();
242+
if value.is_nan() {
243+
return Err(vm.new_value_error("Invalid value NaN (not a number)"));
244+
}
245+
if value < 0.0 || !value.is_finite() {
246+
return Err(vm.new_value_error("Timeout value out of range"));
247+
}
248+
DEFAULT_TIMEOUT.store(value.to_bits(), Ordering::Relaxed);
242249
}
243-
Some(_) => return Err(vm.new_value_error("Timeout value out of range")),
244250
}
245251
Ok(())
246252
}
@@ -327,11 +333,19 @@ mod _socket {
327333
}
328334

329335
#[pymethod]
330-
fn settimeout(&self, timeout: OptionalOption<f64>, vm: &VirtualMachine) -> PyResult<()> {
331-
*self.timeout.lock() = match timeout.flatten() {
336+
fn settimeout(&self, timeout: Option<ArgIntoFloat>, vm: &VirtualMachine) -> PyResult<()> {
337+
*self.timeout.lock() = match timeout {
332338
None => None,
333-
Some(value) if value >= 0.0 => Some(value),
334-
Some(_) => return Err(vm.new_value_error("Timeout value out of range")),
339+
Some(value) => {
340+
let value = value.into_float();
341+
if value.is_nan() {
342+
return Err(vm.new_value_error("Invalid value NaN (not a number)"));
343+
}
344+
if value < 0.0 || !value.is_finite() {
345+
return Err(vm.new_value_error("Timeout value out of range"));
346+
}
347+
Some(value)
348+
}
335349
};
336350
Ok(())
337351
}
@@ -449,8 +463,8 @@ mod _socket {
449463
zelf.kind.store(kind, Ordering::Relaxed);
450464
zelf.proto.store(proto, Ordering::Relaxed);
451465
*zelf.closed.lock() = false;
452-
let default = DEFAULT_TIMEOUT.load(Ordering::Relaxed);
453-
*zelf.timeout.lock() = (default >= 0).then_some(f64::from(default));
466+
let default = f64::from_bits(DEFAULT_TIMEOUT.load(Ordering::Relaxed));
467+
*zelf.timeout.lock() = (default >= 0.0).then_some(default);
454468
Ok(())
455469
}
456470
}

crates/wasm/src/ssl.rs

Lines changed: 39 additions & 3 deletions

0 commit comments

Comments
 (0)