vecs instead of boxed arrays

This commit is contained in:
Robin Appelman 2019-03-18 23:04:49 +01:00
commit b68d1a445d
5 changed files with 33 additions and 23 deletions

View file

@ -12,5 +12,5 @@ edition = "2018"
libc = "0.2.50" libc = "0.2.50"
[lib] [lib]
name = "php" name = "php_rs"

View file

@ -6,7 +6,7 @@ edition = "2018"
[dependencies] [dependencies]
libc = "0.2.50" libc = "0.2.50"
php-rs = { path = "../.." } php-rs = { path = "../..", version = "0.1.0" }
[lib] [lib]
name = "helloworld" name = "helloworld"

View file

@ -1,7 +1,7 @@
use libc::*; use libc::*;
use php::info::*; use php_rs::info::{print_table_start, print_table_row, print_table_end};
use php::zend::*; use php_rs::zend::*;
use php::*; use php_rs::*;
extern "C" { extern "C" {
pub fn php_printf(format: *const c_char, ...) -> size_t; pub fn php_printf(format: *const c_char, ...) -> size_t;
@ -35,16 +35,15 @@ pub extern "C" fn get_module() -> *mut zend::Module {
entry.set_info_func(php_module_info); entry.set_info_func(php_module_info);
let args = Box::new([ let args = vec![
ArgInfo::new(1 as *const c_char, 0, 0, 0),
ArgInfo::new(c_str!("name"), 0, 0, 0), ArgInfo::new(c_str!("name"), 0, 0, 0),
]); ArgInfo::new(c_str!("foo"), 0, 0, 0),
];
let funcs = Box::new([ let funcs = vec![
Function::new(c_str!("helloworld"), helloworld), Function::new(c_str!("helloworld"), helloworld),
Function::new_with_args(c_str!("helloworld2"), helloworld, args), Function::new_with_args(c_str!("helloworld2"), helloworld, args),
Function::end(), ];
]);
entry.set_functions(funcs); entry.set_functions(funcs);

View file

@ -1,7 +1,8 @@
use libc::*;
use std; use std;
use std::mem; use std::mem;
use libc::*;
type StartupFunc = extern "C" fn(type_: c_int, module_number: c_int) -> c_int; type StartupFunc = extern "C" fn(type_: c_int, module_number: c_int) -> c_int;
type ShutdownFunc = extern "C" fn(type_: c_int, module_number: c_int) -> c_int; type ShutdownFunc = extern "C" fn(type_: c_int, module_number: c_int) -> c_int;
type InfoFunc = extern "C" fn(); type InfoFunc = extern "C" fn();
@ -11,7 +12,9 @@ type PostDeactivateFunc = extern "C" fn() -> c_int;
type HandlerFunc = extern "C" fn(execute_data: &ExecuteData, retval: &Value); type HandlerFunc = extern "C" fn(execute_data: &ExecuteData, retval: &Value);
pub struct ExecuteData {} pub struct ExecuteData {}
pub struct Value {} pub struct Value {}
pub struct ModuleDep {} pub struct ModuleDep {}
#[repr(C)] #[repr(C)]
@ -32,12 +35,12 @@ impl ArgInfo {
by_reference: c_uchar, by_reference: c_uchar,
) -> ArgInfo { ) -> ArgInfo {
ArgInfo { ArgInfo {
name: name, name,
class_name: std::ptr::null(), class_name: std::ptr::null(),
type_hint: 0, type_hint: 0,
pass_by_reference: by_reference, pass_by_reference: by_reference,
allow_null: allow_null, allow_null,
is_variadic: is_variadic, is_variadic,
} }
} }
} }
@ -65,20 +68,26 @@ impl Function {
pub fn new_with_args( pub fn new_with_args(
name: *const c_char, name: *const c_char,
handler: HandlerFunc, handler: HandlerFunc,
args: Box<[ArgInfo]>, mut args: Vec<ArgInfo>,
) -> Function { ) -> Function {
let num_args = args.len() as u32; let num_args = args.len() as u32;
let arg_count = ArgInfo::new(num_args as *const c_char, 0, 0, 0);
args.insert(0, arg_count);
let arg_ptr = args.as_ptr();
mem::forget(args);
Function { Function {
fname: name, fname: name,
handler: Some(handler), handler: Some(handler),
arg_info: Box::into_raw(args) as *const ArgInfo, arg_info: arg_ptr,
num_args: num_args - 1, num_args,
flags: 0, flags: 0,
} }
} }
pub fn end() -> Function { fn end() -> Function {
Function { Function {
fname: std::ptr::null(), fname: std::ptr::null(),
handler: None, handler: None,
@ -128,14 +137,14 @@ impl Module {
zts: 0, zts: 0,
ini_entry: std::ptr::null(), ini_entry: std::ptr::null(),
deps: std::ptr::null(), deps: std::ptr::null(),
name: name, name,
functions: std::ptr::null(), functions: std::ptr::null(),
module_startup_func: None, module_startup_func: None,
module_shutdown_func: None, module_shutdown_func: None,
request_startup_func: None, request_startup_func: None,
request_shutdown_func: None, request_shutdown_func: None,
info_func: None, info_func: None,
version: version, version,
globals_size: 0, globals_size: 0,
globals_ptr: std::ptr::null(), globals_ptr: std::ptr::null(),
globals_ctor: None, globals_ctor: None,
@ -161,8 +170,10 @@ impl Module {
self.info_func = Some(func); self.info_func = Some(func);
} }
pub fn set_functions(&mut self, funcs: Box<[Function]>) { pub fn set_functions(&mut self, mut funcs: Vec<Function>) {
self.functions = Box::into_raw(funcs) as *const Function; funcs.push(Function::end());
self.functions = funcs.as_ptr();
mem::forget(funcs);
} }
} }

0
tests/tests.rs Normal file
View file