Skip to content

Commit 58d0763

Browse files
committed
refactor(enum): use raii box pattern for enum values
Refs: #178
1 parent 3eedcd2 commit 58d0763

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

src/builders/enum_builder.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::{
44
builders::FunctionBuilder,
55
convert::IntoZval,
66
describe::DocComments,
7-
enum_::EnumCase,
7+
enum_::{Discriminant, EnumCase},
88
error::Result,
99
ffi::{zend_enum_add_case, zend_register_internal_enum},
1010
flags::{DataType, MethodFlags},
@@ -114,14 +114,7 @@ impl EnumBuilder {
114114
for case in self.cases {
115115
let name = ZendStr::new_interned(case.name, true);
116116
let value = match &case.discriminant {
117-
Some(value) => {
118-
let value: Zval = match value {
119-
crate::enum_::Discriminant::Int(i) => i.into_zval(false)?,
120-
crate::enum_::Discriminant::String(s) => s.into_zval(true)?,
121-
};
122-
let mut zv = core::mem::ManuallyDrop::new(value);
123-
(&raw mut zv).cast()
124-
}
117+
Some(value) => Self::create_enum_value(value)?,
125118
None => ptr::null_mut(),
126119
};
127120
unsafe {
@@ -137,6 +130,16 @@ impl EnumBuilder {
137130

138131
Ok(())
139132
}
133+
134+
fn create_enum_value(discriminant: &Discriminant) -> Result<*mut Zval> {
135+
let value: Zval = match discriminant {
136+
Discriminant::Int(i) => i.into_zval(false)?,
137+
Discriminant::String(s) => s.into_zval(true)?,
138+
};
139+
140+
let boxed_value = Box::new(value);
141+
Ok(Box::into_raw(boxed_value).cast())
142+
}
140143
}
141144

142145
#[cfg(test)]

0 commit comments

Comments
 (0)