Skip to content

Commit e61a583

Browse files
committed
pyexpat: refactor getters and setters for handlers
1 parent ec90a22 commit e61a583

1 file changed

Lines changed: 24 additions & 46 deletions

File tree

vm/src/stdlib/pyexpat.rs

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,34 @@ pub fn make_module(vm: &VirtualMachine) -> PyObjectRef {
1010
let module = _pyexpat::make_module(vm);
1111

1212
extend_module!(vm, module, {
13-
"errors" => _errors::make_module(vm),
14-
"model" => _model::make_module(vm)
13+
"errors" => _errors::make_module(vm),
14+
"model" => _model::make_module(vm),
1515
});
1616

1717
module
1818
}
1919

20+
macro_rules! create_property {
21+
($ctx: expr, $attributes: expr, $name: expr, $element: ident) => {
22+
let attr = $ctx.new_getset(
23+
$name,
24+
move |this: &PyExpatLikeXmlParser| this.$element.read().clone(),
25+
move |this: &PyExpatLikeXmlParser, func: PyObjectRef| *this.$element.write() = func,
26+
);
27+
28+
$attributes.insert($name.to_owned(), attr);
29+
};
30+
}
31+
2032
#[pymodule(name = "pyexpat")]
2133
mod _pyexpat {
2234
use crate::builtins::{PyStr, PyStrRef, PyTypeRef};
2335
use crate::byteslike::PyBytesLike;
2436
use crate::function::{IntoFuncArgs, OptionalArg};
2537
use crate::pyobject::StaticType;
2638
use crate::{
27-
IntoPyObject, IntoPyRef, ItemProtocol, PyObjectRef, PyRef, PyResult, PyValue,
28-
TryFromObject, VirtualMachine,
39+
ItemProtocol, PyContext, PyObjectRef, PyRef, PyResult, PyValue, TryFromObject,
40+
VirtualMachine,
2941
};
3042

3143
use rustpython_common::lock::PyRwLock;
@@ -36,7 +48,7 @@ mod _pyexpat {
3648
#[pyattr]
3749
#[pyclass(name = "xmlparser", module = false)]
3850
#[derive(Debug)]
39-
struct PyExpatLikeXmlParser {
51+
pub struct PyExpatLikeXmlParser {
4052
start_element: MutableObject,
4153
end_element: MutableObject,
4254
character_data: MutableObject,
@@ -70,48 +82,14 @@ mod _pyexpat {
7082
.into_ref(vm))
7183
}
7284

73-
#[pyproperty(name = "StartElementHandler")]
74-
fn start_element_handler(&self) -> PyObjectRef {
75-
self.start_element.read().clone()
76-
}
77-
78-
#[pyproperty(setter, name = "StartElementHandler")]
79-
fn set_start_element_handler(&self, func: PyObjectRef) {
80-
let mut handler = self.start_element.write();
81-
*handler = func;
82-
}
83-
84-
#[pyproperty(name = "EndElementHandler")]
85-
fn end_element_handler(&self) -> PyObjectRef {
86-
self.end_element.read().clone()
87-
}
88-
89-
#[pyproperty(setter, name = "EndElementHandler")]
90-
fn set_end_element_handler(&self, func: PyObjectRef) {
91-
let mut handler = self.end_element.write();
92-
*handler = func;
93-
}
94-
95-
#[pyproperty(name = "CharacterDataHandler")]
96-
fn character_data_handler(&self) -> PyObjectRef {
97-
self.character_data.read().clone()
98-
}
99-
100-
#[pyproperty(setter, name = "CharacterDataHandler")]
101-
fn set_character_data_handler(&self, func: PyObjectRef) {
102-
let mut handler = self.character_data.write();
103-
*handler = func;
104-
}
105-
106-
#[pyproperty(name = "EntityDeclHandler")]
107-
fn entity_decl(&self) -> PyObjectRef {
108-
self.entity_decl.read().clone()
109-
}
85+
#[extend_class]
86+
fn extend_class_with_fields(ctx: &PyContext, class: &PyTypeRef) {
87+
let mut attributes = class.attributes.write();
11088

111-
#[pyproperty(setter, name = "EntityDeclHandler")]
112-
fn set_decl_handler(&self, func: PyObjectRef) {
113-
let mut handler = self.entity_decl.write();
114-
*handler = func;
89+
create_property!(ctx, attributes, "StartElementHandler", start_element);
90+
create_property!(ctx, attributes, "EndElementHandler", end_element);
91+
create_property!(ctx, attributes, "CharacterDataHandler", character_data);
92+
create_property!(ctx, attributes, "EntityDeclHandler", entity_decl);
11593
}
11694

11795
fn create_config(&self) -> xml::ParserConfig {

0 commit comments

Comments
 (0)