Skip to content

Commit dfb37d9

Browse files
committed
setattro uses Py<PyStr>
1 parent ab1de29 commit dfb37d9

File tree

17 files changed

+87
-72
lines changed

17 files changed

+87
-72
lines changed

Lib/test/test_socket.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1650,8 +1650,6 @@ def test_dealloc_warn(self):
16501650
f = None
16511651
support.gc_collect()
16521652

1653-
# TODO: RUSTPYTHON
1654-
@unittest.expectedFailure
16551653
def test_name_closed_socketio(self):
16561654
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
16571655
fp = sock.makefile("rb")

derive-impl/src/pymodule.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ impl ModuleItem for ClassItem {
458458
let set_attr = match py_names.len() {
459459
0 => quote! {
460460
let _ = new_class; // suppress warning
461+
let _ = vm.ctx.intern_str(#class_name);
461462
},
462463
1 => {
463464
let py_name = &py_names[0];

stdlib/src/sqlite.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,7 @@ mod _sqlite {
766766

767767
pub(super) fn setup_module(module: &PyObject, vm: &VirtualMachine) {
768768
for (name, code) in ERROR_CODES {
769-
let name = vm.ctx.new_str(*name);
769+
let name = vm.ctx.intern_str(*name);
770770
let code = vm.new_pyobj(*code);
771771
module.set_attr(name, code, vm).unwrap();
772772
}

vm/src/builtins/module.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use super::pystr::IntoPyStrRef;
21
use super::{PyDictRef, PyStr, PyStrRef, PyType, PyTypeRef};
32
use crate::{
43
builtins::{pystr::AsPyStr, PyStrInterned},
@@ -84,9 +83,9 @@ impl Py<PyModule> {
8483
self.getattr_inner(attr_name.as_pystr(&vm.ctx), vm)
8584
}
8685

87-
pub fn set_attr(
86+
pub fn set_attr<'a>(
8887
&self,
89-
attr_name: impl IntoPyStrRef,
88+
attr_name: impl AsPyStr<'a>,
9089
attr_value: impl Into<PyObjectRef>,
9190
vm: &VirtualMachine,
9291
) -> PyResult<()> {

vm/src/builtins/namespace.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ impl Initializer for PyNamespace {
5353
return Err(vm.new_type_error("no positional arguments expected".to_owned()));
5454
}
5555
for (name, value) in args.kwargs.into_iter() {
56-
zelf.as_object().set_attr(name, value, vm)?;
56+
let name = vm.ctx.new_str(name);
57+
zelf.as_object().set_attr(&name, value, vm)?;
5758
}
5859
Ok(())
5960
}

vm/src/builtins/object.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,19 @@ impl PyBaseObject {
161161
value: PyObjectRef,
162162
vm: &VirtualMachine,
163163
) -> PyResult<()> {
164-
obj.generic_setattr(name, PySetterValue::Assign(value), vm)
164+
obj.generic_setattr(&name, PySetterValue::Assign(value), vm)
165165
}
166166

167167
/// Implement delattr(self, name).
168168
#[pymethod]
169169
fn __delattr__(obj: PyObjectRef, name: PyStrRef, vm: &VirtualMachine) -> PyResult<()> {
170-
obj.generic_setattr(name, PySetterValue::Delete, vm)
170+
obj.generic_setattr(&name, PySetterValue::Delete, vm)
171171
}
172172

173173
#[pyslot]
174174
fn slot_setattro(
175175
obj: &PyObject,
176-
attr_name: PyStrRef,
176+
attr_name: &Py<PyStr>,
177177
value: PySetterValue,
178178
vm: &VirtualMachine,
179179
) -> PyResult<()> {

vm/src/builtins/type.rs

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -374,23 +374,30 @@ impl PyType {
374374
call_slot_new(zelf, subtype, args, vm)
375375
}
376376

377-
pub fn slot_name(&self) -> BorrowedValue<str> {
377+
fn name_inner<'a, R: 'a>(
378+
&'a self,
379+
static_f: impl FnOnce(&'static str) -> R,
380+
heap_f: impl FnOnce(&'a HeapTypeExt) -> R,
381+
) -> R {
378382
if !self.slots.flags.has_feature(PyTypeFlags::HEAPTYPE) {
379-
return self.slots.name.load().into();
383+
static_f(self.slots.name.load())
384+
} else {
385+
heap_f(self.heaptype_ext.as_ref().unwrap())
380386
}
381-
let name_lock = self.heaptype_ext.as_ref().unwrap().name.read();
382-
PyRwLockReadGuard::map(name_lock, |_| self.slots.name.load()).into()
387+
}
388+
389+
pub fn slot_name(&self) -> BorrowedValue<str> {
390+
self.name_inner(
391+
|name| name.into(),
392+
|ext| PyRwLockReadGuard::map(ext.name.read(), |name| name.as_str()).into(),
393+
)
383394
}
384395

385396
pub fn name(&self) -> BorrowedValue<str> {
386-
if !self.slots.flags.has_feature(PyTypeFlags::HEAPTYPE) {
387-
return self.slots.name.load().into();
388-
}
389-
let name_lock = self.heaptype_ext.as_ref().unwrap().name.read();
390-
PyRwLockReadGuard::map(name_lock, |name| {
391-
name.as_str() // = self.slots.name.load().rsplit_once('.').unwrap().1
392-
})
393-
.into()
397+
self.name_inner(
398+
|name| name.rsplit_once('.').map_or(name, |(_, name)| name).into(),
399+
|ext| PyRwLockReadGuard::map(ext.name.read(), |name| name.as_str()).into(),
400+
)
394401
}
395402
}
396403

@@ -438,19 +445,20 @@ impl PyType {
438445

439446
#[pygetset]
440447
pub fn __name__(&self, vm: &VirtualMachine) -> PyStrRef {
441-
if !self.slots.flags.has_feature(PyTypeFlags::HEAPTYPE) {
442-
vm.ctx
443-
.interned_str(self.slots.name.load())
444-
.unwrap_or_else(|| {
445-
panic!(
446-
"static type name must be already interned but {} is not",
447-
self.slots.name.load()
448-
)
449-
})
450-
.to_owned()
451-
} else {
452-
self.heaptype_ext.as_ref().unwrap().name.read().clone()
453-
}
448+
self.name_inner(
449+
|name| {
450+
vm.ctx
451+
.interned_str(name.rsplit_once('.').map_or(name, |(_, name)| name))
452+
.unwrap_or_else(|| {
453+
panic!(
454+
"static type name must be already interned but {} is not",
455+
self.slots.name.load()
456+
)
457+
})
458+
.to_owned()
459+
},
460+
|ext| ext.name.read().clone(),
461+
)
454462
}
455463

456464
#[pygetset(magic)]
@@ -1037,7 +1045,7 @@ impl GetAttr for PyType {
10371045
impl SetAttr for PyType {
10381046
fn setattro(
10391047
zelf: &Py<Self>,
1040-
attr_name: PyStrRef,
1048+
attr_name: &Py<PyStr>,
10411049
value: PySetterValue,
10421050
vm: &VirtualMachine,
10431051
) -> PyResult<()> {

vm/src/builtins/weakproxy.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ impl GetAttr for PyWeakProxy {
141141
impl SetAttr for PyWeakProxy {
142142
fn setattro(
143143
zelf: &Py<Self>,
144-
attr_name: PyStrRef,
144+
attr_name: &Py<PyStr>,
145145
value: PySetterValue,
146146
vm: &VirtualMachine,
147147
) -> PyResult<()> {

vm/src/protocol/object.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
44
use crate::{
55
builtins::{
6-
pystr::{AsPyStr, IntoPyStrRef},
7-
PyBytes, PyDict, PyDictRef, PyGenericAlias, PyInt, PyStr, PyStrRef, PyTupleRef, PyTypeRef,
6+
pystr::AsPyStr, PyBytes, PyDict, PyDictRef, PyGenericAlias, PyInt, PyStr, PyStrRef,
7+
PyTupleRef, PyTypeRef,
88
},
99
bytesinner::ByteInnerNewOptions,
1010
common::{hash::PyHash, str::to_ascii},
@@ -102,7 +102,7 @@ impl PyObject {
102102
pub fn call_set_attr(
103103
&self,
104104
vm: &VirtualMachine,
105-
attr_name: PyStrRef,
105+
attr_name: &Py<PyStr>,
106106
attr_value: PySetterValue,
107107
) -> PyResult<()> {
108108
let setattro = {
@@ -126,28 +126,28 @@ impl PyObject {
126126
setattro(self, attr_name, attr_value, vm)
127127
}
128128

129-
pub fn set_attr(
129+
pub fn set_attr<'a>(
130130
&self,
131-
attr_name: impl IntoPyStrRef,
131+
attr_name: impl AsPyStr<'a>,
132132
attr_value: impl Into<PyObjectRef>,
133133
vm: &VirtualMachine,
134134
) -> PyResult<()> {
135-
let attr_name = attr_name.into_pystr_ref(vm);
135+
let attr_name = attr_name.as_pystr(&vm.ctx);
136136
self.call_set_attr(vm, attr_name, PySetterValue::Assign(attr_value.into()))
137137
}
138138

139139
// int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)
140140
#[cfg_attr(feature = "flame-it", flame)]
141141
pub fn generic_setattr(
142142
&self,
143-
attr_name: PyStrRef, // TODO: Py<PyStr>
143+
attr_name: &Py<PyStr>,
144144
value: PySetterValue,
145145
vm: &VirtualMachine,
146146
) -> PyResult<()> {
147147
vm_trace!("object.__setattr__({:?}, {}, {:?})", self, attr_name, value);
148148
if let Some(attr) = vm
149149
.ctx
150-
.interned_str(&*attr_name)
150+
.interned_str(attr_name)
151151
.and_then(|attr_name| self.get_class_attr(attr_name))
152152
{
153153
let descr_set = attr.class().mro_find_map(|cls| cls.slots.descr_set.load());
@@ -158,9 +158,9 @@ impl PyObject {
158158

159159
if let Some(dict) = self.dict() {
160160
if let PySetterValue::Assign(value) = value {
161-
dict.set_item(&*attr_name, value, vm)?;
161+
dict.set_item(attr_name, value, vm)?;
162162
} else {
163-
dict.del_item(&*attr_name, vm).map_err(|e| {
163+
dict.del_item(attr_name, vm).map_err(|e| {
164164
if e.fast_isinstance(vm.ctx.exceptions.key_error) {
165165
vm.new_attribute_error(format!(
166166
"'{}' object has no attribute '{}'",
@@ -243,8 +243,8 @@ impl PyObject {
243243
}
244244
}
245245

246-
pub fn del_attr(&self, attr_name: impl IntoPyStrRef, vm: &VirtualMachine) -> PyResult<()> {
247-
let attr_name = attr_name.into_pystr_ref(vm);
246+
pub fn del_attr<'a>(&self, attr_name: impl AsPyStr<'a>, vm: &VirtualMachine) -> PyResult<()> {
247+
let attr_name = attr_name.as_pystr(&vm.ctx);
248248
self.call_set_attr(vm, attr_name, PySetterValue::Delete)
249249
}
250250

vm/src/stdlib/ast.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ mod _ast {
5050
)));
5151
}
5252
for (name, arg) in fields.iter().zip(args.args) {
53-
zelf.set_attr(name.clone(), arg, vm)?;
53+
zelf.set_attr(name, arg, vm)?;
5454
}
5555
for (key, value) in args.kwargs {
5656
if let Some(pos) = fields.iter().position(|f| f.as_str() == key) {
@@ -62,7 +62,7 @@ mod _ast {
6262
)));
6363
}
6464
}
65-
zelf.set_attr(key, value, vm)?;
65+
zelf.set_attr(vm.ctx.intern_str(key), value, vm)?;
6666
}
6767
Ok(())
6868
}

0 commit comments

Comments
 (0)