diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f631afae8..938d3134bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,32 +1,78 @@ # Changelog +## Version 0.5.0 + +### Breaking changes + +- Method names are now renamed to snake case by default [#63]. +- Refactored `ZendHashTable` into an owned and borrowed variant [#76]. + - Creating a new hashtable is done through the `OwnedHashTable` struct, which + is then dereferenced to `&HashTable`, as `String` is to `&str`. +- Refactored `ZendString` into an owned and borrowed variant [#77]. + - Creating a new Zend string is done through the `ZendString` struct, which is + then dereferenced to `&ZendStr`, as `String` is to `&str`. +- Class properties are now defined as struct properties, removing the old + property system in the process [#69]. + +### Enhancements + +- Added interfaces and parent class to the `Debug` implementation for + `ClassEntry` [@72b0491]. +- Rust unit type `()` now has a datatype of `void` [@8b3ed08]. +- Functions returning Rust objects will now display their full classname in + reflection [#64]. +- Fixed alignment of class objects in memory [#66]. + +Thanks to the contributors for this release: + +- @davidcole1340 +- @vodik + +[#63]: https://github.com/davidcole1340/ext-php-rs/pull/63 +[#76]: https://github.com/davidcole1340/ext-php-rs/pull/76 +[#77]: https://github.com/davidcole1340/ext-php-rs/pull/77 +[#69]: https://github.com/davidcole1340/ext-php-rs/pull/69 +[#64]: https://github.com/davidcole1340/ext-php-rs/pull/64 +[#66]: https://github.com/davidcole1340/ext-php-rs/pull/66 +[@72b0491]: https://github.com/davidcole1340/ext-php-rs/commit/72b0491 +[@8b3ed08]: https://github.com/davidcole1340/ext-php-rs/commit/8b3ed08 + +## Version 0.2.0 - 0.4.0 + +- Added macros! +- Missed a bit :( + ## Version 0.1.0 - `Zval::reference()` returns a reference instead of a dereferenced pointer. - Added `ZendHashTable::iter()` - note this is changing in a future version. -- `ClassBuilder::extends()` now takes a reference rather than a pointer to match the -return type of `ClassEntry::exception()`. +- `ClassBuilder::extends()` now takes a reference rather than a pointer to match + the return type of `ClassEntry::exception()`. - `ClassEntry::build()` now returns a reference - same reason as above. - Improve library 'safety' by removing `unwrap` calls: - - `.build()` returns `Result` on `FunctionBuilder`, `ClassBuilder` and `ModuleBuilder`. - - `.property()` and `.constant()` return `Result` on `ClassBuilder`. - - `.register_constant()` returns `Result`. - - `.try_call()` on callables now return `Result` rather than `Option`. - - `throw()` and `throw_with_code()` now returns `Result`. - - `new()` and `new_interned()` on `ZendString` now returns a `Result`. - - For `ZendHashTable`: - - `insert()`, `insert_at_index()` now returns a `Result`, where `Err` failed, - `Ok(Ok)` inserts successfully without overwrite, and `Ok(OkWithOverwrite(&Zval))` inserts successfully - with overwrite. - - `push()` now returns a `Result`. - - Converting from a `Vec` or `HashMap` to a `ZendHashTable` is fallible, so it now implementes `TryFrom` as - opposed to `From`. - - For `Zval`: - - `set_string()` now returns a `Result`, and takes a second parameter (persistent). - - `set_persistent_string()` has now been removed in favour of `set_string()`. - - `set_interned_string()` also returns a `Result`. - - `set_array()` now only takes a `ZendHashTable`, you must convert your `Vec` or `HashMap` - by calling `try_into()` and handling the error. + - `.build()` returns `Result` on `FunctionBuilder`, `ClassBuilder` and + `ModuleBuilder`. + - `.property()` and `.constant()` return `Result` on `ClassBuilder`. + - `.register_constant()` returns `Result`. + - `.try_call()` on callables now return `Result` rather than `Option`. + - `throw()` and `throw_with_code()` now returns `Result`. + - `new()` and `new_interned()` on `ZendString` now returns a `Result`. + - For `ZendHashTable`: + - `insert()`, `insert_at_index()` now returns a + `Result`, where `Err` failed, `Ok(Ok)` inserts + successfully without overwrite, and `Ok(OkWithOverwrite(&Zval))` inserts + successfully with overwrite. + - `push()` now returns a `Result`. + - Converting from a `Vec` or `HashMap` to a `ZendHashTable` is fallible, so + it now implementes `TryFrom` as opposed to `From`. + - For `Zval`: + - `set_string()` now returns a `Result`, and takes a second parameter + (persistent). + - `set_persistent_string()` has now been removed in favour of + `set_string()`. + - `set_interned_string()` also returns a `Result`. + - `set_array()` now only takes a `ZendHashTable`, you must convert your + `Vec` or `HashMap` by calling `try_into()` and handling the error. ## Version 0.0.7 @@ -36,19 +82,28 @@ return type of `ClassEntry::exception()`. ## Version 0.0.6 -- Fixed `panic!` when a PHP binary string was given to a function (@davidcole1340) [c:d73788e] -- Fixed memory leak when returning an array from Rust to PHP (@davidcole1340) #34 -- Documentation is now deployed to [GitHub Pages](https://davidcol1340.github.io/ext-php-rs) (@davidcole1340) #35 -- Added ability to unpack and pack binary strings similar to PHP (@davidcole1340) #32 +- Fixed `panic!` when a PHP binary string was given to a function + (@davidcole1340) [c:d73788e] +- Fixed memory leak when returning an array from Rust to PHP (@davidcole1340) + #34 +- Documentation is now deployed to + [GitHub Pages](https://davidcol1340.github.io/ext-php-rs) (@davidcole1340) #35 +- Added ability to unpack and pack binary strings similar to PHP + (@davidcole1340) #32 - Allowed `default-features` to be true for Bindgen (@willbrowningme) #36 ## Version 0.0.5 -- Relicensed project under MIT or Apache 2.0 as per Rust crate guidelines (@davidcole1340) [c:439f2ae] -- Added `parse_args!` macro to simplify argument parsing (@davidcole1340) [c:45c7242] -- Added ability to throw exceptions from Rust to PHP (@davidcole1340) [c:45c7242] +- Relicensed project under MIT or Apache 2.0 as per Rust crate guidelines + (@davidcole1340) [c:439f2ae] +- Added `parse_args!` macro to simplify argument parsing (@davidcole1340) + [c:45c7242] +- Added ability to throw exceptions from Rust to PHP (@davidcole1340) + [c:45c7242] - Added ability to register global constants (@davidcole1340) [c:472e26e] - Implemented `From` for `Vec` (@davidcole1340) [c:3917c41] -- Expanded implementations for converting to `Zval` from primitives (@davidcole1340) [c:d4c6aa2] +- Expanded implementations for converting to `Zval` from primitives + (@davidcole1340) [c:d4c6aa2] - Replaced unit errors with an `Error` enum (@davidcole1340) [c:f11451f] -- Added `Debug` and `Clone` implementations for most structs (@davidcole1340) [c:62a43e6] +- Added `Debug` and `Clone` implementations for most structs (@davidcole1340) + [c:62a43e6] diff --git a/Cargo.toml b/Cargo.toml index 2cb733efb6..1a496d7420 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ repository = "https://github.com/davidcole1340/ext-php-rs" homepage = "https://github.com/davidcole1340/ext-php-rs" license = "MIT OR Apache-2.0" keywords = ["php", "ffi", "zend"] -version = "0.4.0" +version = "0.5.0" authors = ["David Cole "] edition = "2018" categories = ["api-bindings"] @@ -13,12 +13,12 @@ categories = ["api-bindings"] [dependencies] bitflags = "1.2.1" parking_lot = "0.11.2" -ext-php-rs-derive = { version = "=0.4.0", path = "./ext-php-rs-derive" } +ext-php-rs-derive = { version = "=0.5.0", path = "./ext-php-rs-derive" } [build-dependencies] -bindgen = { version = ">= 0.57.0, < 0.58.1" } +bindgen = { version = "0.59" } regex = "1" -cc = "1.0.67" +cc = "1.0" [features] alloc = [] diff --git a/docsrs_bindings.rs b/docsrs_bindings.rs index 8d9f90cd76..d00eccfc1e 100644 --- a/docsrs_bindings.rs +++ b/docsrs_bindings.rs @@ -32,6 +32,7 @@ pub const IS_CONSTANT_AST: u32 = 11; pub const IS_CALLABLE: u32 = 12; pub const IS_VOID: u32 = 14; pub const IS_MIXED: u32 = 16; +pub const IS_PTR: u32 = 13; pub const _IS_BOOL: u32 = 17; pub const Z_TYPE_FLAGS_SHIFT: u32 = 8; pub const IS_TYPE_REFCOUNTED: u32 = 1; @@ -221,7 +222,6 @@ pub struct _zend_refcounted { pub gc: zend_refcounted_h, } #[repr(C)] -#[derive(Copy, Clone)] pub struct _zend_string { pub gc: zend_refcounted_h, pub h: zend_ulong, @@ -388,6 +388,9 @@ pub struct zend_get_gc_buffer { pub end: *mut zval, pub start: *mut zval, } +extern "C" { + pub fn zval_ptr_dtor(zval_ptr: *mut zval); +} pub type zend_object_iterator = _zend_object_iterator; #[repr(C)] #[derive(Debug, Copy, Clone)] diff --git a/ext-php-rs-derive/Cargo.toml b/ext-php-rs-derive/Cargo.toml index bbce18ac03..f9660329da 100644 --- a/ext-php-rs-derive/Cargo.toml +++ b/ext-php-rs-derive/Cargo.toml @@ -4,7 +4,7 @@ description = "Derive macros for ext-php-rs." repository = "https://github.com/davidcole1340/ext-php-rs" homepage = "https://github.com/davidcole1340/ext-php-rs" license = "MIT OR Apache-2.0" -version = "0.4.0" +version = "0.5.0" authors = ["David Cole "] edition = "2018" diff --git a/guide/src/macros/impl.md b/guide/src/macros/impl.md index cefffe1e53..b490978f3c 100644 --- a/guide/src/macros/impl.md +++ b/guide/src/macros/impl.md @@ -17,7 +17,18 @@ methods is they are bounded by their class object. Class methods can take a `&self` or `&mut self` parameter. They cannot take a consuming `self` parameter. Static methods can omit this `self` parameter. -Options are passed as separate attributes: +By default, all methods are renamed in PHP to the camel-case variant of the Rust +method name. This can be changed on the `#[php_impl]` attribute, by passing one +of the following as the `rename_methods` option: + +- `"none"` - does not rename the methods. +- `"camelCase"` - renames all methods to camel case (default). +- `"snake_case"` - renames all methods to snake case. + +For example, to disable renaming, change the `#[php_impl]` attribute to +`#[php_impl(rename_methods = "none")]`. + +The rest of the options are passed as separate attributes: - `#[defaults(i = 5, b = "hello")]` - Sets the default value for parameter(s). - `#[optional(i)]` - Sets the first optional parameter. Note that this also sets @@ -25,6 +36,8 @@ Options are passed as separate attributes: variant of `Option`. - `#[public]`, `#[protected]` and `#[private]` - Sets the visibility of the method. +- `#[rename("method_name")]` - Renames the PHP method to a different identifier, + without renaming the Rust method name. The `#[defaults]` and `#[optional]` attributes operate the same as the equivalent function attribute parameters.