Skip to content

Commit 4272794

Browse files
committed
Add stateful obj.
1 parent 34beeb5 commit 4272794

File tree

20 files changed

+133
-132
lines changed

20 files changed

+133
-132
lines changed

examples/hello/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@
1010

1111
use phper::{
1212
arrays::ZArray,
13-
classes::{DynamicClass, Visibility},
13+
classes::{StatefulClass, Visibility},
1414
functions::Argument,
1515
ini::{Ini, Policy},
1616
modules::{Module, ModuleContext},
17-
objects::ZObj,
17+
objects::StatefulObj,
1818
php_get_module,
1919
values::ZVal,
2020
};
@@ -70,12 +70,12 @@ pub fn get_module() -> Module {
7070
);
7171

7272
// register classes
73-
let mut foo_class = DynamicClass::new("FooClass");
73+
let mut foo_class = StatefulClass::new("FooClass");
7474
foo_class.add_property("foo", Visibility::Private, 100);
7575
foo_class.add_method(
7676
"getFoo",
7777
Visibility::Public,
78-
|this: &mut ZObj, _: &mut [ZVal]| {
78+
|this: &mut StatefulObj<()>, _: &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 StatefulObj<()>, arguments: &mut [ZVal]| -> phper::Result<()> {
8888
this.set_property("foo", arguments[0].clone());
8989
Ok(())
9090
},

examples/http-client/src/client.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,24 @@ use crate::{
1515
};
1616
use phper::{
1717
alloc::ToRefOwned,
18-
classes::{ClassEntry, DynamicClass, Visibility},
18+
classes::{ClassEntry, StatefulClass, Visibility},
1919
functions::Argument,
20-
objects::ZObj,
2120
};
22-
use reqwest::blocking::{Client, ClientBuilder, RequestBuilder};
21+
use reqwest::blocking::{Client, ClientBuilder};
2322
use std::time::Duration;
2423

2524
const HTTP_CLIENT_BUILDER_CLASS_NAME: &str = "HttpClient\\HttpClientBuilder";
2625
const HTTP_CLIENT_CLASS_NAME: &str = "HttpClient\\HttpClient";
2726

28-
pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
29-
let mut class = DynamicClass::new_with_default(HTTP_CLIENT_BUILDER_CLASS_NAME);
27+
pub fn make_client_builder_class() -> StatefulClass<ClientBuilder> {
28+
let mut class = StatefulClass::new_with_default_state(HTTP_CLIENT_BUILDER_CLASS_NAME);
3029

3130
class.add_method(
3231
"timeout",
3332
Visibility::Public,
3433
|this, arguments| {
3534
let ms = arguments[0].as_long().unwrap();
36-
let state: &mut ClientBuilder = unsafe { this.as_mut_state() };
35+
let state: &mut ClientBuilder = this.as_mut_state();
3736
replace_and_set(state, |builder| {
3837
builder.timeout(Duration::from_millis(ms as u64))
3938
});
@@ -47,7 +46,7 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
4746
Visibility::Public,
4847
|this, arguments| {
4948
let enable = arguments[0].as_bool().unwrap();
50-
let state: &mut ClientBuilder = unsafe { this.as_mut_state() };
49+
let state: &mut ClientBuilder = this.as_mut_state();
5150
replace_and_set(state, |builder| builder.cookie_store(enable));
5251
Ok::<_, HttpClientError>(this.to_ref_owned())
5352
},
@@ -58,7 +57,7 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
5857
"build",
5958
Visibility::Public,
6059
|this, _arguments| {
61-
let state = unsafe { this.as_mut_state() };
60+
let state = this.as_mut_state();
6261
let client = replace_and_get(state, ClientBuilder::build)?;
6362
let mut object = ClassEntry::from_globals(HTTP_CLIENT_CLASS_NAME)?.new_object([])?;
6463
unsafe {
@@ -72,22 +71,17 @@ pub fn make_client_builder_class() -> DynamicClass<ClientBuilder> {
7271
class
7372
}
7473

75-
pub fn make_client_class() -> DynamicClass<Option<Client>> {
76-
let mut class = DynamicClass::new_with_default(HTTP_CLIENT_CLASS_NAME);
74+
pub fn make_client_class() -> StatefulClass<Option<Client>> {
75+
let mut class = StatefulClass::<Option<Client>>::new_with_default_state(HTTP_CLIENT_CLASS_NAME);
7776

78-
class.add_method(
79-
"__construct",
80-
Visibility::Private,
81-
|_: &mut ZObj, _| {},
82-
vec![],
83-
);
77+
class.add_method("__construct", Visibility::Private, |_, _| {}, vec![]);
8478

8579
class.add_method(
8680
"get",
8781
Visibility::Public,
8882
|this, arguments| {
8983
let url = arguments[0].as_z_str().unwrap().to_str().unwrap();
90-
let client = unsafe { this.as_state::<Option<Client>>().as_ref().unwrap() };
84+
let client = this.as_state().as_ref().unwrap();
9185
let request_builder = client.get(url);
9286
let mut object = ClassEntry::from_globals(REQUEST_BUILDER_CLASS_NAME)?.new_object([])?;
9387
unsafe {
@@ -103,7 +97,7 @@ pub fn make_client_class() -> DynamicClass<Option<Client>> {
10397
Visibility::Public,
10498
|this, arguments| {
10599
let url = arguments[0].as_z_str().unwrap().to_str().unwrap();
106-
let client = unsafe { this.as_state::<Option<Client>>().as_ref().unwrap() };
100+
let client = this.as_state().as_ref().unwrap();
107101
let request_builder = client.post(url);
108102
let mut object = ClassEntry::from_globals(REQUEST_BUILDER_CLASS_NAME)?.new_object([])?;
109103
unsafe {

examples/http-client/src/errors.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
99
// See the Mulan PSL v2 for more details.
1010

11-
use phper::classes::{ClassEntry, DynamicClass};
11+
use phper::classes::{ClassEntry, StatefulClass};
1212

1313
const EXCEPTION_CLASS_NAME: &str = "HttpClient\\HttpClientException";
1414

@@ -29,8 +29,8 @@ pub enum HttpClientError {
2929
ResponseHadRead,
3030
}
3131

32-
pub fn make_exception_class() -> DynamicClass<()> {
33-
let mut exception_class = DynamicClass::new(EXCEPTION_CLASS_NAME);
32+
pub fn make_exception_class() -> StatefulClass<()> {
33+
let mut exception_class = StatefulClass::new(EXCEPTION_CLASS_NAME);
3434
exception_class.extends("Exception");
3535
exception_class
3636
}

examples/http-client/src/request.rs

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

1111
use crate::{errors::HttpClientError, response::RESPONSE_CLASS_NAME, utils::replace_and_get};
12-
use phper::{
13-
classes::{ClassEntry, DynamicClass, Visibility},
14-
objects::ZObj,
15-
};
16-
use reqwest::blocking::{RequestBuilder, Response};
12+
use phper::classes::{ClassEntry, StatefulClass, Visibility};
13+
use reqwest::blocking::RequestBuilder;
1714

1815
pub const REQUEST_BUILDER_CLASS_NAME: &str = "HttpClient\\RequestBuilder";
1916

20-
pub fn make_request_builder_class() -> DynamicClass<Option<RequestBuilder>> {
21-
let mut class = DynamicClass::new_with_default(REQUEST_BUILDER_CLASS_NAME);
17+
pub fn make_request_builder_class() -> StatefulClass<Option<RequestBuilder>> {
18+
let mut class =
19+
StatefulClass::<Option<RequestBuilder>>::new_with_default_state(REQUEST_BUILDER_CLASS_NAME);
2220

23-
class.add_method(
24-
"__construct",
25-
Visibility::Private,
26-
|_: &mut ZObj, _| {},
27-
vec![],
28-
);
21+
class.add_method("__construct", Visibility::Private, |_, _| {}, vec![]);
2922

3023
class.add_method(
3124
"send",
3225
Visibility::Public,
3326
|this, _arguments| {
34-
let state = unsafe { this.as_mut_state::<Option<RequestBuilder>>() };
27+
let state = this.as_mut_state();
3528
let response = replace_and_get(state, |builder| builder.unwrap().send())?;
3629
let mut object = ClassEntry::from_globals(RESPONSE_CLASS_NAME)?.new_object([])?;
3730
unsafe {

examples/http-client/src/response.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,22 +11,21 @@
1111
use crate::{errors::HttpClientError, utils::replace_and_get};
1212
use phper::{
1313
arrays::{InsertKey, ZArray},
14-
classes::{DynamicClass, Visibility},
15-
objects::ZObj,
14+
classes::{StatefulClass, Visibility},
1615
values::ZVal,
1716
};
1817
use reqwest::blocking::Response;
1918

2019
pub const RESPONSE_CLASS_NAME: &str = "HttpClient\\Response";
2120

22-
pub fn make_response_class() -> DynamicClass<Option<Response>> {
23-
let mut class = DynamicClass::new_with_default(RESPONSE_CLASS_NAME);
21+
pub fn make_response_class() -> StatefulClass<Option<Response>> {
22+
let mut class = StatefulClass::<Option<Response>>::new_with_default_state(RESPONSE_CLASS_NAME);
2423

2524
class.add_method(
2625
"body",
2726
Visibility::Public,
28-
|this: &mut ZObj, _arguments| {
29-
let response = unsafe { this.as_mut_state::<Option<Response>>() };
27+
|this, _arguments| {
28+
let response = this.as_mut_state();
3029
let body = replace_and_get(response, |response| {
3130
response
3231
.ok_or(HttpClientError::ResponseHadRead)
@@ -41,11 +40,12 @@ pub fn make_response_class() -> DynamicClass<Option<Response>> {
4140
"status",
4241
Visibility::Public,
4342
|this, _arguments| {
44-
let response = unsafe { this.as_state::<Option<Response>>() }
45-
.as_ref()
46-
.ok_or_else(|| HttpClientError::ResponseAfterRead {
47-
method_name: "status".to_owned(),
48-
})?;
43+
let response =
44+
this.as_state()
45+
.as_ref()
46+
.ok_or_else(|| HttpClientError::ResponseAfterRead {
47+
method_name: "status".to_owned(),
48+
})?;
4949

5050
Ok::<_, HttpClientError>(response.status().as_u16() as i64)
5151
},
@@ -56,13 +56,12 @@ pub fn make_response_class() -> DynamicClass<Option<Response>> {
5656
"headers",
5757
Visibility::Public,
5858
|this, _arguments| {
59-
let response = unsafe {
60-
this.as_state::<Option<Response>>()
59+
let response =
60+
this.as_state()
6161
.as_ref()
6262
.ok_or_else(|| HttpClientError::ResponseAfterRead {
6363
method_name: "headers".to_owned(),
64-
})?
65-
};
64+
})?;
6665
let headers_map =
6766
response
6867
.headers()

examples/http-server/src/errors.rs

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

1111
use hyper::header::{InvalidHeaderName, InvalidHeaderValue};
12-
use phper::classes::{ClassEntry, DynamicClass};
12+
use phper::classes::{ClassEntry, StatefulClass};
1313
use std::{net::AddrParseError, str::Utf8Error};
1414

1515
const EXCEPTION_CLASS_NAME: &str = "HttpServer\\HttpServerException";
@@ -40,8 +40,8 @@ pub enum HttpServerError {
4040
InvalidHeaderValue(#[from] InvalidHeaderValue),
4141
}
4242

43-
pub fn make_exception_class() -> DynamicClass<()> {
44-
let mut exception_class = DynamicClass::new(EXCEPTION_CLASS_NAME);
43+
pub fn make_exception_class() -> StatefulClass<()> {
44+
let mut exception_class = StatefulClass::new(EXCEPTION_CLASS_NAME);
4545
exception_class.extends("Exception");
4646
exception_class
4747
}

examples/http-server/src/request.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
// NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
99
// See the Mulan PSL v2 for more details.
1010

11-
use phper::classes::{DynamicClass, Visibility};
11+
use phper::classes::{StatefulClass, Visibility};
1212

1313
pub const HTTP_REQUEST_CLASS_NAME: &str = "HttpServer\\HttpRequest";
1414

15-
pub fn make_request_class() -> DynamicClass<()> {
16-
let mut class = DynamicClass::new(HTTP_REQUEST_CLASS_NAME);
15+
pub fn make_request_class() -> StatefulClass<()> {
16+
let mut class = StatefulClass::new(HTTP_REQUEST_CLASS_NAME);
1717

1818
class.add_property("header", Visibility::Public, ());
1919
class.add_property("server", Visibility::Public, ());

examples/http-server/src/response.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,20 @@
1111
use crate::errors::HttpServerError;
1212
use hyper::{header::HeaderName, http::HeaderValue, Body, Response};
1313
use phper::{
14-
classes::{DynamicClass, Visibility},
14+
classes::{StatefulClass, Visibility},
1515
functions::Argument,
1616
};
1717

1818
pub const HTTP_RESPONSE_CLASS_NAME: &str = "HttpServer\\HttpResponse";
1919

20-
pub fn make_response_class() -> DynamicClass<Response<Body>> {
21-
let mut class = DynamicClass::new_with_default(HTTP_RESPONSE_CLASS_NAME);
20+
pub fn make_response_class() -> StatefulClass<Response<Body>> {
21+
let mut class = StatefulClass::new_with_default_state(HTTP_RESPONSE_CLASS_NAME);
2222

2323
class.add_method(
2424
"header",
2525
Visibility::Public,
2626
|this, arguments| {
27-
let response: &mut Response<Body> = unsafe { this.as_mut_state() };
27+
let response: &mut Response<Body> = 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> = unsafe { this.as_mut_state() };
41+
let response: &mut Response<Body> = 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: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use hyper::{
1919
};
2020
use phper::{
2121
alloc::{EBox, RefClone, ToRefOwned},
22-
classes::{ClassEntry, DynamicClass, Visibility},
22+
classes::{ClassEntry, StatefulClass, Visibility},
2323
errors::Error::Throw,
2424
functions::Argument,
2525
values::ZVal,
@@ -35,8 +35,10 @@ use tokio::runtime::Handle;
3535

3636
const HTTP_SERVER_CLASS_NAME: &str = "HttpServer\\HttpServer";
3737

38-
pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
39-
let mut class = DynamicClass::new_with_default(HTTP_SERVER_CLASS_NAME);
38+
pub fn make_server_class() -> StatefulClass<Option<Builder<AddrIncoming>>> {
39+
let mut class = StatefulClass::<Option<Builder<AddrIncoming>>>::new_with_default_state(
40+
HTTP_SERVER_CLASS_NAME,
41+
);
4042

4143
class.add_property("host", Visibility::Private, "127.0.0.1");
4244
class.add_property("port", Visibility::Private, 8080);
@@ -52,9 +54,7 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
5254
this.set_property("port", port);
5355
let addr = format!("{}:{}", host.to_str()?, port).parse::<SocketAddr>()?;
5456
let builder = Server::bind(&addr);
55-
unsafe {
56-
*this.as_mut_state() = Some(builder);
57-
}
57+
*this.as_mut_state() = Some(builder);
5858
Ok::<_, HttpServerError>(())
5959
},
6060
vec![Argument::by_val("host"), Argument::by_val("port")],
@@ -76,11 +76,7 @@ pub fn make_server_class() -> DynamicClass<Option<Builder<AddrIncoming>>> {
7676
|this, _| {
7777
static HANDLE: AtomicPtr<ZVal> = AtomicPtr::new(null_mut());
7878

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

phper/src/arrays.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ impl ZArr {
208208
}
209209
}
210210

211-
pub fn entry<'a>(&mut self, key: impl Into<Key<'a>>) -> Entry<'a> {
211+
pub fn entry<'a>(&mut self, _key: impl Into<Key<'a>>) -> Entry<'a> {
212212
todo!()
213213
}
214214
}
@@ -365,7 +365,7 @@ pub enum Entry<'a> {
365365
}
366366

367367
impl<'a> Entry<'a> {
368-
pub fn or_insert(&mut self, val: ZVal) -> &'a mut ZVal {
368+
pub fn or_insert(&mut self, _val: ZVal) -> &'a mut ZVal {
369369
todo!()
370370
}
371371
}

0 commit comments

Comments
 (0)