1
1
use phper:: { c_str_ptr, php_fn, ebox} ;
2
2
use phper:: sys:: { ZEND_RESULT_CODE_SUCCESS , zend_parse_parameters, zend_internal_arg_info, zend_function_entry, PHP_INI_SYSTEM } ;
3
- use phper:: sys:: { zend_ini_entry_def, zend_module_entry, zend_register_ini_entries, zend_unregister_ini_entries, OnUpdateBool } ;
4
- use phper:: sys:: { OnUpdateString } ;
3
+ use phper:: sys:: { zend_ini_entry_def, zend_module_entry, zend_register_ini_entries, zend_unregister_ini_entries, OnUpdateBool , phper_zval_string } ;
4
+ use phper:: sys:: { OnUpdateString , zend_class_entry , zend_register_internal_class , zend_declare_property_string , ZEND_ACC_PUBLIC , zend_type , zend_read_property } ;
5
5
use phper:: zend:: api:: { FunctionEntries , ModuleGlobals , function_entry_end} ;
6
6
use phper:: zend:: compile:: { InternalArgInfos , internal_arg_info_begin} ;
7
7
use phper:: zend:: ini:: { IniEntryDefs , ini_entry_def_end} ;
@@ -12,13 +12,15 @@ use phper::{
12
12
php_rinit_function, php_rshutdown_function,
13
13
} ;
14
14
use phper:: { php_minfo, php_minfo_function, php_rinit, php_rshutdown, zend_get_module} ;
15
- use std:: ffi:: CStr ;
15
+ use std:: ffi:: { CStr , CString } ;
16
16
use std:: mem;
17
17
use std:: mem:: { size_of, transmute} ;
18
18
use std:: os:: raw:: { c_char, c_int, c_uchar, c_uint, c_ushort} ;
19
19
use std:: ptr:: { null, null_mut} ;
20
20
use phper:: zend:: exceptions:: MyException ;
21
- use phper:: sys:: { php_info_print_table_start, php_info_print_table_row, php_info_print_table_end} ;
21
+ use phper:: sys:: { php_info_print_table_start, php_info_print_table_row, php_info_print_table_end, phper_init_class_entry} ;
22
+
23
+ static mut MY_CLASS_CE : * mut zend_class_entry = null_mut ( ) ;
22
24
23
25
static SIMPLE_ENABLE : ModuleGlobals < bool > = ModuleGlobals :: new ( false ) ;
24
26
static SIMPLE_TEXT : ModuleGlobals < * const c_char > = ModuleGlobals :: new ( null ( ) ) ;
@@ -32,7 +34,12 @@ static INI_ENTRIES: IniEntryDefs<3> = IniEntryDefs::new([
32
34
#[ php_minit_function]
33
35
fn m_init_simple ( type_ : c_int , module_number : c_int ) -> bool {
34
36
unsafe {
35
- zend_register_ini_entries ( INI_ENTRIES . get ( ) , module_number) ;
37
+ zend_register_ini_entries ( INI_ENTRIES . as_ptr ( ) , module_number) ;
38
+ }
39
+ unsafe {
40
+ let mut my_class_ce = phper_init_class_entry ( c_str_ptr ! ( "MyClass" ) , MY_CLASS_METHODS . as_ptr ( ) ) ;
41
+ MY_CLASS_CE = zend_register_internal_class ( & mut my_class_ce) ;
42
+ zend_declare_property_string ( MY_CLASS_CE , c_str_ptr ! ( "foo" ) , 3 , c_str_ptr ! ( "bar" ) , ZEND_ACC_PUBLIC as c_int ) ;
36
43
}
37
44
true
38
45
}
@@ -59,8 +66,8 @@ fn r_shutdown_simple(type_: c_int, module_number: c_int) -> bool {
59
66
fn m_info_simple ( zend_module : * mut :: phper:: sys:: zend_module_entry ) {
60
67
unsafe {
61
68
php_info_print_table_start ( ) ;
62
- php_info_print_table_row ( 2 , c_str_ptr ! ( "simple.enable" ) , format ! ( "{}\0 " , * SIMPLE_ENABLE . get ( ) ) . as_ptr ( ) ) ;
63
- php_info_print_table_row ( 2 , c_str_ptr ! ( "simple.text" ) , format ! ( "{}\0 " , CStr :: from_ptr( ( * SIMPLE_TEXT . get ( ) ) ) . to_str( ) . unwrap( ) ) . as_ptr ( ) ) ;
69
+ php_info_print_table_row ( 2 , c_str_ptr ! ( "simple.enable" ) , format ! ( "{}\0 " , * SIMPLE_ENABLE . as_ptr ( ) ) . as_ptr ( ) ) ;
70
+ php_info_print_table_row ( 2 , c_str_ptr ! ( "simple.text" ) , format ! ( "{}\0 " , CStr :: from_ptr( ( * SIMPLE_TEXT . as_ptr ( ) ) ) . to_str( ) . unwrap( ) ) . as_ptr ( ) ) ;
64
71
php_info_print_table_end ( ) ;
65
72
}
66
73
}
@@ -85,7 +92,7 @@ pub fn test_simple(execute_data: ExecuteData) -> impl SetVal {
85
92
return None ;
86
93
}
87
94
88
- let s = CStr :: from_ptr ( ( * SIMPLE_TEXT . get ( ) ) ) . to_str ( ) . unwrap ( ) ;
95
+ let s = CStr :: from_ptr ( ( * SIMPLE_TEXT . as_ptr ( ) ) ) . to_str ( ) . unwrap ( ) ;
89
96
println ! ( "simple.text: '{}'" , s) ;
90
97
91
98
Some ( format ! (
@@ -123,10 +130,70 @@ static FUNCTION_ENTRIES: FunctionEntries<2> = FunctionEntries::new([
123
130
function_entry_end ( ) ,
124
131
] ) ;
125
132
133
+
134
+ static ARG_INFO_MY_CLASS_FOO : InternalArgInfos < 2 > = InternalArgInfos :: new ( [
135
+ zend_internal_arg_info {
136
+ name : 2 as * const _ ,
137
+ type_ : 0 ,
138
+ pass_by_reference : 0 ,
139
+ is_variadic : 0 ,
140
+ } ,
141
+ zend_internal_arg_info {
142
+ name : c_str_ptr ! ( "prefix" ) ,
143
+ type_ : 0 ,
144
+ pass_by_reference : 0 ,
145
+ is_variadic : 0 ,
146
+ } ,
147
+ ] ) ;
148
+
149
+ static MY_CLASS_METHODS : FunctionEntries < 2 > = FunctionEntries :: new ( [
150
+ zend_function_entry {
151
+ fname : c_str_ptr ! ( "foo" ) ,
152
+ handler : Some ( php_fn ! ( my_class_foo) ) ,
153
+ arg_info : ARG_INFO_MY_CLASS_FOO . get ( ) ,
154
+ num_args : 1 ,
155
+ flags : 0 ,
156
+ } ,
157
+ unsafe { transmute ( [ 0u8 ; size_of :: < zend_function_entry > ( ) ] ) } ,
158
+ ] ) ;
159
+
160
+
161
+ #[ php_function]
162
+ pub fn my_class_foo ( execute_data : ExecuteData ) -> impl SetVal {
163
+ let mut prefix: * const c_char = null_mut ( ) ;
164
+ let mut prefix_len = 0 ;
165
+
166
+ unsafe {
167
+ if zend_parse_parameters (
168
+ execute_data. num_args ( ) as c_int ,
169
+ c_str_ptr ! ( "s" ) ,
170
+ & mut prefix,
171
+ & mut prefix_len,
172
+ ) != ZEND_RESULT_CODE_SUCCESS
173
+ {
174
+ return None ;
175
+ }
176
+
177
+ let prefix = CStr :: from_ptr ( prefix) . to_str ( ) . unwrap ( ) ;
178
+
179
+ let this = if execute_data. get_type ( ) == phper:: sys:: IS_OBJECT as zend_type {
180
+ execute_data. get_this ( )
181
+ } else {
182
+ null_mut ( )
183
+ } ;
184
+
185
+ let foo = zend_read_property ( MY_CLASS_CE , this, c_str_ptr ! ( "foo" ) , 3 , 1 , null_mut ( ) ) ;
186
+ let foo = Val :: from_raw ( foo) ;
187
+ let foo = foo. as_c_str ( ) . unwrap ( ) . to_str ( ) . unwrap ( ) ;
188
+ Some ( format ! ( "{}{}" , prefix, foo) )
189
+ }
190
+ }
191
+
192
+
126
193
static MODULE_ENTRY : ModuleEntry = ModuleEntry :: new ( create_zend_module_entry (
127
194
c_str_ptr ! ( env!( "CARGO_PKG_NAME" ) ) ,
128
195
c_str_ptr ! ( env!( "CARGO_PKG_VERSION" ) ) ,
129
- FUNCTION_ENTRIES . get ( ) ,
196
+ FUNCTION_ENTRIES . as_ptr ( ) ,
130
197
Some ( php_minit ! ( m_init_simple) ) ,
131
198
Some ( php_mshutdown ! ( m_shutdown_simple) ) ,
132
199
Some ( php_rinit ! ( r_init_simple) ) ,
0 commit comments