Skip to content

Commit 2e5a6f1

Browse files
committed
Modify struct Array.
1 parent 8746e20 commit 2e5a6f1

File tree

3 files changed

+17
-53
lines changed

3 files changed

+17
-53
lines changed

phper/src/arrays.rs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,33 @@
11
use crate::{sys::*, values::Val};
2-
use std::mem::size_of;
2+
use std::mem::{size_of, zeroed};
33

4+
#[repr(transparent)]
45
pub struct Array {
5-
inner: *mut zend_array,
6-
leak: bool,
6+
inner: zend_array,
77
}
88

99
impl Array {
1010
pub fn new() -> Self {
1111
unsafe {
12-
let inner = _emalloc(size_of::<zend_array>()).cast();
13-
_zend_hash_init(inner, 0, None, true.into());
14-
Self { inner, leak: false }
12+
let mut array = zeroed::<Array>();
13+
_zend_hash_init(&mut array.inner, 0, None, true.into());
14+
array
1515
}
1616
}
1717

1818
pub fn as_ptr(&self) -> *const zend_array {
19-
self.inner
19+
&self.inner
2020
}
2121

2222
pub fn as_mut_ptr(&mut self) -> *mut zend_array {
23-
self.inner
24-
}
25-
26-
pub fn into_raw(mut self) -> *mut zend_array {
27-
self.leak = true;
28-
self.inner
23+
&mut self.inner
2924
}
3025

3126
pub fn insert(&mut self, key: impl AsRef<str>, value: &mut Val) {
3227
let key = key.as_ref();
3328
unsafe {
3429
phper_zend_hash_str_update(
35-
self.inner,
30+
&mut self.inner,
3631
key.as_ptr().cast(),
3732
key.len(),
3833
value.as_mut_ptr(),
@@ -43,23 +38,20 @@ impl Array {
4338
pub fn get(&mut self, key: impl AsRef<str>) -> &mut Val {
4439
let key = key.as_ref();
4540
unsafe {
46-
let value = zend_hash_str_find(self.inner, key.as_ptr().cast(), key.len());
41+
let value = zend_hash_str_find(&mut self.inner, key.as_ptr().cast(), key.len());
4742
Val::from_mut(value)
4843
}
4944
}
5045

5146
pub fn len(&mut self) -> usize {
52-
unsafe { zend_array_count(self.inner) as usize }
47+
unsafe { zend_array_count(&mut self.inner) as usize }
5348
}
5449
}
5550

5651
impl Drop for Array {
5752
fn drop(&mut self) {
5853
unsafe {
59-
if !self.leak {
60-
zend_hash_destroy(self.inner);
61-
_efree(self.inner.cast());
62-
}
54+
zend_hash_destroy(&mut self.inner);
6355
}
6456
}
6557
}

phper/src/strings.rs

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,6 @@
11
use crate::sys::*;
22

3-
pub struct ZString {
4-
inner: *mut zend_string,
5-
}
6-
7-
impl ZString {
8-
pub fn new() -> Self {
9-
unsafe {
10-
Self {
11-
inner: phper_zend_string_alloc(0, 1),
12-
}
13-
}
14-
}
15-
}
16-
17-
impl<T: AsRef<str>> From<T> for ZString {
18-
fn from(t: T) -> Self {
19-
let s = t.as_ref();
20-
unsafe {
21-
Self {
22-
inner: phper_zend_string_init(s.as_ptr().cast(), s.len(), 1),
23-
}
24-
}
25-
}
26-
}
27-
28-
impl Drop for ZString {
29-
fn drop(&mut self) {
30-
unsafe {
31-
phper_zend_string_release(self.inner);
32-
}
33-
}
3+
#[repr(transparent)]
4+
pub struct ZendString {
5+
inner: zend_string,
346
}

phper/src/values.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,10 @@ impl SetVal for String {
262262
}
263263

264264
impl SetVal for Array {
265-
fn set_val(self, val: &mut Val) {
265+
fn set_val(mut self, val: &mut Val) {
266266
unsafe {
267267
let mut new_val = Val::empty();
268-
phper_zval_arr(new_val.as_mut_ptr(), self.into_raw());
268+
phper_zval_arr(new_val.as_mut_ptr(), self.as_mut_ptr());
269269
phper_zval_zval(
270270
val.as_mut_ptr(),
271271
new_val.as_mut_ptr(),

0 commit comments

Comments
 (0)