Skip to content

Commit ce11ae3

Browse files
committed
Remove generic type of Objects.
1 parent c1052b7 commit ce11ae3

File tree

12 files changed

+71
-58
lines changed

12 files changed

+71
-58
lines changed

examples/hello/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ pub fn get_module() -> Module {
7575
foo_class.add_method(
7676
"getFoo",
7777
Visibility::Public,
78-
|this: &mut ZObj<()>, _: &mut [ZVal]| {
78+
|this: &mut ZObj, _: &mut [ZVal]| {
7979
let prop = this.get_property("foo");
8080
Ok::<_, phper::Error>(prop.clone())
8181
},
@@ -84,7 +84,7 @@ pub fn get_module() -> Module {
8484
foo_class.add_method(
8585
"setFoo",
8686
Visibility::Public,
87-
|this: &mut ZObj<()>, arguments: &mut [ZVal]| -> phper::Result<()> {
87+
|this: &mut ZObj, arguments: &mut [ZVal]| -> phper::Result<()> {
8888
this.set_property("foo", arguments[0].clone());
8989
Ok(())
9090
},

examples/http-client/src/client.rs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::{
1414
utils::{replace_and_get, replace_and_set},
1515
};
1616
use phper::{
17+
alloc::ToRefOwned,
1718
classes::{ClassEntry, DynamicClass, Visibility},
1819
functions::Argument,
1920
objects::ZObj,
@@ -36,7 +37,7 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
3637
replace_and_set(state, |builder| {
3738
builder.timeout(Duration::from_millis(ms as u64))
3839
});
39-
Ok::<_, HttpClientError>(this.duplicate())
40+
Ok::<_, HttpClientError>(this.to_ref_owned())
4041
},
4142
vec![Argument::by_val("ms")],
4243
);
@@ -46,9 +47,9 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
4647
Visibility::Public,
4748
|this, arguments| {
4849
let enable = arguments[0].as_bool().unwrap();
49-
let state = unsafe { this.as_mut_state() };
50+
let state: &mut ClientBuilder = unsafe { this.as_mut_state() };
5051
replace_and_set(state, |builder| builder.cookie_store(enable));
51-
Ok::<_, HttpClientError>(this.duplicate())
52+
Ok::<_, HttpClientError>(this.to_ref_owned())
5253
},
5354
vec![Argument::by_val("enable")],
5455
);
@@ -59,8 +60,7 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
5960
|this, _arguments| {
6061
let state = unsafe { this.as_mut_state() };
6162
let client = replace_and_get(state, ClientBuilder::build)?;
62-
let mut object = ClassEntry::<Option<Client>>::from_globals(HTTP_CLIENT_CLASS_NAME)?
63-
.init_object()?;
63+
let mut object = ClassEntry::from_globals(HTTP_CLIENT_CLASS_NAME)?.new_object([])?;
6464
unsafe {
6565
*object.as_mut_state() = Some(client);
6666
}
@@ -78,7 +78,7 @@ pub fn make_client_class() -> DynamicClass<Option<Client>> {
7878
class.add_method(
7979
"__construct",
8080
Visibility::Private,
81-
|_: &mut ZObj<Option<Client>>, _| {},
81+
|_: &mut ZObj, _| {},
8282
vec![],
8383
);
8484

@@ -87,11 +87,9 @@ pub fn make_client_class() -> DynamicClass<Option<Client>> {
8787
Visibility::Public,
8888
|this, arguments| {
8989
let url = arguments[0].as_z_str().unwrap().to_str().unwrap();
90-
let client = unsafe { this.as_state().as_ref().unwrap() };
90+
let client = unsafe { this.as_state::<Option<Client>>().as_ref().unwrap() };
9191
let request_builder = client.get(url);
92-
let mut object =
93-
ClassEntry::<Option<RequestBuilder>>::from_globals(REQUEST_BUILDER_CLASS_NAME)?
94-
.init_object()?;
92+
let mut object = ClassEntry::from_globals(REQUEST_BUILDER_CLASS_NAME)?.new_object([])?;
9593
unsafe {
9694
*object.as_mut_state() = Some(request_builder);
9795
}
@@ -105,11 +103,9 @@ pub fn make_client_class() -> DynamicClass<Option<Client>> {
105103
Visibility::Public,
106104
|this, arguments| {
107105
let url = arguments[0].as_z_str().unwrap().to_str().unwrap();
108-
let client = unsafe { this.as_state().as_ref().unwrap() };
106+
let client = unsafe { this.as_state::<Option<Client>>().as_ref().unwrap() };
109107
let request_builder = client.post(url);
110-
let mut object =
111-
ClassEntry::<Option<RequestBuilder>>::from_globals(REQUEST_BUILDER_CLASS_NAME)?
112-
.init_object()?;
108+
let mut object = ClassEntry::from_globals(REQUEST_BUILDER_CLASS_NAME)?.new_object([])?;
113109
unsafe {
114110
*object.as_mut_state() = Some(request_builder);
115111
}

examples/http-client/src/request.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,17 @@ pub fn make_request_builder_class() -> DynamicClass<Option<RequestBuilder>> {
2323
class.add_method(
2424
"__construct",
2525
Visibility::Private,
26-
|_: &mut ZObj<Option<RequestBuilder>>, _| {},
26+
|_: &mut ZObj, _| {},
2727
vec![],
2828
);
2929

3030
class.add_method(
3131
"send",
3232
Visibility::Public,
3333
|this, _arguments| {
34-
let state = unsafe { this.as_mut_state() };
34+
let state = unsafe { this.as_mut_state::<Option<RequestBuilder>>() };
3535
let response = replace_and_get(state, |builder| builder.unwrap().send())?;
36-
let mut object =
37-
ClassEntry::<Option<Response>>::from_globals(RESPONSE_CLASS_NAME)?.init_object()?;
36+
let mut object = ClassEntry::from_globals(RESPONSE_CLASS_NAME)?.new_object([])?;
3837
unsafe {
3938
*object.as_mut_state() = Some(response);
4039
}

examples/http-client/src/response.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ pub fn make_response_class() -> DynamicClass<Option<Response>> {
2525
class.add_method(
2626
"body",
2727
Visibility::Public,
28-
|this: &mut ZObj<Option<Response>>, _arguments| {
29-
let response = unsafe { this.as_mut_state() };
28+
|this: &mut ZObj, _arguments| {
29+
let response = unsafe { this.as_mut_state::<Option<Response>>() };
3030
let body = replace_and_get(response, |response| {
3131
response
3232
.ok_or(HttpClientError::ResponseHadRead)
@@ -41,11 +41,11 @@ pub fn make_response_class() -> DynamicClass<Option<Response>> {
4141
"status",
4242
Visibility::Public,
4343
|this, _arguments| {
44-
let response = unsafe { this.as_state() }.as_ref().ok_or_else(|| {
45-
HttpClientError::ResponseAfterRead {
44+
let response = unsafe { this.as_state::<Option<Response>>() }
45+
.as_ref()
46+
.ok_or_else(|| HttpClientError::ResponseAfterRead {
4647
method_name: "status".to_owned(),
47-
}
48-
})?;
48+
})?;
4949

5050
Ok::<_, HttpClientError>(response.status().as_u16() as i64)
5151
},
@@ -57,7 +57,7 @@ pub fn make_response_class() -> DynamicClass<Option<Response>> {
5757
Visibility::Public,
5858
|this, _arguments| {
5959
let response = unsafe {
60-
this.as_state()
60+
this.as_state::<Option<Response>>()
6161
.as_ref()
6262
.ok_or_else(|| HttpClientError::ResponseAfterRead {
6363
method_name: "headers".to_owned(),

examples/http-server/src/response.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub fn make_response_class() -> DynamicClass<Response<Body>> {
2424
"header",
2525
Visibility::Public,
2626
|this, arguments| {
27-
let response: &mut Response<Body> = this.as_mut_state();
27+
let response: &mut Response<Body> = unsafe { this.as_mut_state() };
2828
response.headers_mut().insert(
2929
HeaderName::from_bytes(arguments[0].as_z_str().unwrap().to_bytes())?,
3030
HeaderValue::from_bytes(arguments[1].as_z_str().unwrap().to_bytes())?,
@@ -38,7 +38,7 @@ pub fn make_response_class() -> DynamicClass<Response<Body>> {
3838
"end",
3939
Visibility::Public,
4040
|this, arguments| {
41-
let response: &mut Response<Body> = this.as_mut_state();
41+
let response: &mut Response<Body> = unsafe { this.as_mut_state() };
4242
*response.body_mut() = arguments[0].as_z_str().unwrap().to_bytes().to_vec().into();
4343
Ok::<_, phper::Error>(())
4444
},

examples/http-server/src/server.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use hyper::{
1818
Body, Request, Response, Server, StatusCode,
1919
};
2020
use phper::{
21-
alloc::{EBox, RefClone},
22-
classes::{ClassEntry, DynamicClass, StatelessClassEntry, Visibility},
21+
alloc::{EBox, RefClone, ToRefOwned},
22+
classes::{ClassEntry, DynamicClass, Visibility},
2323
errors::Error::Throw,
2424
functions::Argument,
2525
values::ZVal,
@@ -52,7 +52,9 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
5252
this.set_property("port", port);
5353
let addr = format!("{}:{}", host.to_str()?, port).parse::<SocketAddr>()?;
5454
let builder = Server::bind(&addr);
55-
*this.as_mut_state() = Some(builder);
55+
unsafe {
56+
*this.as_mut_state() = Some(builder);
57+
}
5658
Ok::<_, HttpServerError>(())
5759
},
5860
vec![Argument::by_val("host"), Argument::by_val("port")],
@@ -74,7 +76,11 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
7476
|this, _| {
7577
static HANDLE: AtomicPtr<ZVal> = AtomicPtr::new(null_mut());
7678

77-
let builder = replace(this.as_mut_state(), None).unwrap();
79+
let builder = replace(
80+
unsafe { this.as_mut_state::<Option<Builder<AddrIncoming>>>() },
81+
None,
82+
)
83+
.unwrap();
7884
let handle = EBox::new(this.get_mut_property("onRequestHandle").ref_clone());
7985
HANDLE.store(EBox::into_raw(handle), Ordering::SeqCst);
8086

@@ -83,27 +89,26 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
8389
match async move {
8490
let handle = unsafe { HANDLE.load(Ordering::SeqCst).as_mut().unwrap() };
8591

86-
let request = StatelessClassEntry::from_globals(HTTP_REQUEST_CLASS_NAME)?
87-
.new_object([])?;
92+
let request =
93+
ClassEntry::from_globals(HTTP_REQUEST_CLASS_NAME)?.new_object([])?;
8894
let request = ZVal::from(request);
8995

9096
let mut response =
91-
ClassEntry::<Response<Body>>::from_globals(HTTP_RESPONSE_CLASS_NAME)?
92-
.new_object([])?;
93-
let response_val = response.duplicate();
97+
ClassEntry::from_globals(HTTP_RESPONSE_CLASS_NAME)?.new_object([])?;
98+
let response_val = response.to_ref_owned();
9499
let response_val = ZVal::from(response_val);
95100

96101
match handle.call([request, response_val]) {
97102
Err(Throw(ex)) => {
98-
*response.as_mut_state().status_mut() =
99-
StatusCode::INTERNAL_SERVER_ERROR;
100-
*response.as_mut_state().body_mut() = ex.to_string().into();
103+
let state = unsafe { response.as_mut_state::<Response<Body>>() };
104+
*state.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;
105+
*state.body_mut() = ex.to_string().into();
101106
}
102107
Err(e) => return Err(e.into()),
103108
_ => {}
104109
}
105110

106-
let response = replace_and_get(response.as_mut_state());
111+
let response = replace_and_get(unsafe { response.as_mut_state() });
107112
Ok::<Response<Body>, HttpServerError>(response)
108113
}
109114
.await

phper/src/functions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ pub(crate) fn call_raw_common(
488488
};
489489
}
490490

491-
let ex = ZObj::from_ptr(e);
491+
let ex = ZObj::from_mut_ptr(e);
492492
eg!(exception) = null_mut();
493493
let class_name = ex.get_class().get_name().to_str()?.to_string();
494494
let code = ex.call("getCode", [])?.as_long().unwrap();

phper/src/objects.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ impl ZObject {
218218
Self::new(class_entry, arguments)
219219
}
220220

221+
pub fn new_by_std_class() -> Self {
222+
Self::new_by_class_name("stdclass", &mut []).unwrap()
223+
}
224+
221225
#[inline]
222226
pub unsafe fn from_raw(ptr: *mut zend_object) -> Self {
223227
Self {

tests/integration/src/arguments.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99
// See the Mulan PSL v2 for more details.
1010

1111
use phper::{
12-
alloc::EBox, arrays::ZArray, functions::Argument, modules::Module, objects::ZObj, values::ZVal,
12+
alloc::{EBox, ToRefOwned},
13+
arrays::ZArray,
14+
functions::Argument,
15+
modules::Module,
16+
objects::{ZObj, ZObject},
17+
values::ZVal,
1318
};
1419

1520
pub fn integrate(module: &mut Module) {
@@ -65,9 +70,9 @@ fn integrate_arguments(module: &mut Module) {
6570

6671
module.add_function(
6772
"integrate_arguments_object",
68-
|arguments: &mut [ZVal]| -> phper::Result<EBox<ZObj<()>>> {
69-
let a = arguments[0].expect_z_obj()?;
70-
let mut a = a.clone_obj();
73+
|arguments: &mut [ZVal]| -> phper::Result<ZObject> {
74+
let a = arguments[0].expect_mut_z_obj()?;
75+
let mut a = a.to_ref_owned();
7176
a.set_property("foo", ZVal::from("bar"));
7277
Ok(a)
7378
},

tests/integration/src/arrays.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use phper::{
1212
alloc::EBox,
1313
arrays::{InsertKey, IterKey, ZArray},
1414
modules::Module,
15-
objects::ZObj,
15+
objects::{ZObj, ZObject},
1616
strings::ZString,
1717
values::ZVal,
1818
};
@@ -56,7 +56,7 @@ pub fn integrate(module: &mut Module) {
5656
a.insert(
5757
"obj",
5858
ZVal::from({
59-
let mut o: EBox<ZObj<()>> = ZObj::new_by_std_class();
59+
let mut o = ZObject::new_by_std_class();
6060
o.set_property("foo", ZVal::from("bar"));
6161
o
6262
}),
@@ -73,7 +73,7 @@ pub fn integrate(module: &mut Module) {
7373
assert_eq!(arr.get(0).unwrap().as_long().unwrap(), 0);
7474
assert_eq!(arr.get(1).unwrap().as_long().unwrap(), 1);
7575

76-
let obj: &mut ZObj<()> = a.get_mut("obj").unwrap().expect_mut_z_obj()?;
76+
let obj: &mut ZObj = a.get_mut("obj").unwrap().expect_mut_z_obj()?;
7777
let val = obj.get_property("foo");
7878
assert_eq!(val.as_z_str().unwrap().to_str().unwrap(), "bar");
7979

0 commit comments

Comments
 (0)