Merge branch 'process-globals' into streams-api

This commit is contained in:
Joe Hoyle 2023-07-19 15:28:56 +02:00 committed by GitHub
commit 7803a450a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 88 additions and 10 deletions

View File

@ -217,6 +217,9 @@ bind! {
_ZEND_TYPE_NULLABLE_BIT, _ZEND_TYPE_NULLABLE_BIT,
ts_rsrc_id, ts_rsrc_id,
_ZEND_TYPE_NAME_BIT, _ZEND_TYPE_NAME_BIT,
ZEND_INTERNAL_FUNCTION,
ZEND_USER_FUNCTION,
ZEND_EVAL_CODE,
zval_ptr_dtor, zval_ptr_dtor,
zend_refcounted_h, zend_refcounted_h,
zend_is_true, zend_is_true,
@ -252,6 +255,7 @@ bind! {
sapi_globals_offset, sapi_globals_offset,
php_file_globals, php_file_globals,
file_globals, file_globals,
file_globals_id,
TRACK_VARS_POST, TRACK_VARS_POST,
TRACK_VARS_GET, TRACK_VARS_GET,
TRACK_VARS_COOKIE, TRACK_VARS_COOKIE,
@ -270,5 +274,7 @@ bind! {
php_unregister_url_stream_wrapper_volatile, php_unregister_url_stream_wrapper_volatile,
php_register_url_stream_wrapper_volatile, php_register_url_stream_wrapper_volatile,
php_stream_wrapper, php_stream_wrapper,
php_stream_stdio_ops php_stream_stdio_ops,
zend_atomic_bool_store,
zend_interrupt_function
} }

View File

@ -171,6 +171,9 @@ pub const ZEND_ACC_GENERATOR: u32 = 16777216;
pub const ZEND_ACC_DONE_PASS_TWO: u32 = 33554432; pub const ZEND_ACC_DONE_PASS_TWO: u32 = 33554432;
pub const ZEND_ACC_HEAP_RT_CACHE: u32 = 67108864; pub const ZEND_ACC_HEAP_RT_CACHE: u32 = 67108864;
pub const ZEND_ACC_STRICT_TYPES: u32 = 2147483648; pub const ZEND_ACC_STRICT_TYPES: u32 = 2147483648;
pub const ZEND_INTERNAL_FUNCTION: u32 = 1;
pub const ZEND_USER_FUNCTION: u32 = 2;
pub const ZEND_EVAL_CODE: u32 = 4;
pub const ZEND_ISEMPTY: u32 = 1; pub const ZEND_ISEMPTY: u32 = 1;
pub const _ZEND_SEND_MODE_SHIFT: u32 = 25; pub const _ZEND_SEND_MODE_SHIFT: u32 = 25;
pub const _ZEND_IS_VARIADIC_BIT: u32 = 134217728; pub const _ZEND_IS_VARIADIC_BIT: u32 = 134217728;
@ -901,6 +904,10 @@ pub struct _zend_class_entry__bindgen_ty_4__bindgen_ty_2 {
pub builtin_functions: *const _zend_function_entry, pub builtin_functions: *const _zend_function_entry,
pub module: *mut _zend_module_entry, pub module: *mut _zend_module_entry,
} }
extern "C" {
pub static mut zend_interrupt_function:
::std::option::Option<unsafe extern "C" fn(execute_data: *mut zend_execute_data)>;
}
extern "C" { extern "C" {
pub static mut zend_standard_class_def: *mut zend_class_entry; pub static mut zend_standard_class_def: *mut zend_class_entry;
} }
@ -1284,6 +1291,9 @@ pub struct zend_atomic_bool_s {
pub value: u8, pub value: u8,
} }
pub type zend_atomic_bool = zend_atomic_bool_s; pub type zend_atomic_bool = zend_atomic_bool_s;
extern "C" {
pub fn zend_atomic_bool_store(obj: *mut zend_atomic_bool, desired: bool);
}
#[repr(C)] #[repr(C)]
#[derive(Debug, Copy, Clone)] #[derive(Debug, Copy, Clone)]
pub struct _zend_stack { pub struct _zend_stack {

View File

@ -218,3 +218,13 @@ impl<T: IntoZval + Clone> IntoZvalDyn for T {
Self::TYPE Self::TYPE
} }
} }
impl IntoZvalDyn for Zval {
fn as_zval(&self, _persistent: bool) -> Result<Zval> {
Ok(self.shallow_clone())
}
fn get_type(&self) -> DataType {
self.get_type()
}
}

View File

@ -28,6 +28,7 @@ extern "C" {
pub fn ext_php_rs_executor_globals() -> *mut zend_executor_globals; pub fn ext_php_rs_executor_globals() -> *mut zend_executor_globals;
pub fn ext_php_rs_process_globals() -> *mut php_core_globals; pub fn ext_php_rs_process_globals() -> *mut php_core_globals;
pub fn ext_php_rs_sapi_globals() -> *mut sapi_globals_struct; pub fn ext_php_rs_sapi_globals() -> *mut sapi_globals_struct;
pub fn ext_php_rs_file_globals() -> *mut php_file_globals;
} }
include!(concat!(env!("OUT_DIR"), "/bindings.rs")); include!(concat!(env!("OUT_DIR"), "/bindings.rs"));

View File

@ -20,8 +20,9 @@ use crate::ffi::{
ZEND_ACC_PROMOTED, ZEND_ACC_PROTECTED, ZEND_ACC_PUBLIC, ZEND_ACC_RESOLVED_INTERFACES, ZEND_ACC_PROMOTED, ZEND_ACC_PROTECTED, ZEND_ACC_PUBLIC, ZEND_ACC_RESOLVED_INTERFACES,
ZEND_ACC_RESOLVED_PARENT, ZEND_ACC_RETURN_REFERENCE, ZEND_ACC_STATIC, ZEND_ACC_STRICT_TYPES, ZEND_ACC_RESOLVED_PARENT, ZEND_ACC_RETURN_REFERENCE, ZEND_ACC_STATIC, ZEND_ACC_STRICT_TYPES,
ZEND_ACC_TOP_LEVEL, ZEND_ACC_TRAIT, ZEND_ACC_TRAIT_CLONE, ZEND_ACC_UNRESOLVED_VARIANCE, ZEND_ACC_TOP_LEVEL, ZEND_ACC_TRAIT, ZEND_ACC_TRAIT_CLONE, ZEND_ACC_UNRESOLVED_VARIANCE,
ZEND_ACC_USES_THIS, ZEND_ACC_USE_GUARDS, ZEND_ACC_VARIADIC, ZEND_HAS_STATIC_IN_METHODS, ZEND_ACC_USES_THIS, ZEND_ACC_USE_GUARDS, ZEND_ACC_VARIADIC, ZEND_EVAL_CODE,
Z_TYPE_FLAGS_SHIFT, _IS_BOOL, ZEND_HAS_STATIC_IN_METHODS, ZEND_INTERNAL_FUNCTION, ZEND_USER_FUNCTION, Z_TYPE_FLAGS_SHIFT,
_IS_BOOL,
}; };
use std::{convert::TryFrom, fmt::Display}; use std::{convert::TryFrom, fmt::Display};
@ -193,6 +194,24 @@ bitflags! {
const UserDeprecated = E_USER_DEPRECATED; const UserDeprecated = E_USER_DEPRECATED;
} }
} }
#[derive(PartialEq, Eq, Hash, Debug, Clone, Copy)]
pub enum FunctionType {
Internal,
User,
Eval,
}
impl From<u8> for FunctionType {
#[allow(clippy::bad_bit_mask)]
fn from(value: u8) -> Self {
match value as _ {
ZEND_INTERNAL_FUNCTION => Self::Internal,
ZEND_USER_FUNCTION => Self::User,
ZEND_EVAL_CODE => Self::Eval,
_ => panic!("Unknown function type: {}", value),
}
}
}
/// Valid data types for PHP. /// Valid data types for PHP.
#[repr(C, u8)] #[repr(C, u8)]

View File

@ -64,3 +64,12 @@ sapi_globals_struct *ext_php_rs_sapi_globals() {
return &sapi_globals; return &sapi_globals;
#endif #endif
} }
php_file_globals *ext_php_rs_file_globals() {
#ifdef ZTS
return TSRMG_FAST_BULK(file_globals_id, php_file_globals *);
#else
return &file_globals;
#endif
}

View File

@ -36,3 +36,4 @@ void ext_php_rs_zend_object_release(zend_object *obj);
zend_executor_globals *ext_php_rs_executor_globals(); zend_executor_globals *ext_php_rs_executor_globals();
php_core_globals *ext_php_rs_process_globals(); php_core_globals *ext_php_rs_process_globals();
sapi_globals_struct *ext_php_rs_sapi_globals(); sapi_globals_struct *ext_php_rs_sapi_globals();
php_file_globals *ext_php_rs_file_globals();

View File

@ -79,6 +79,10 @@ impl ClassEntry {
Self::try_find(name.as_str().ok()?) Self::try_find(name.as_str().ok()?)
} }
} }
pub fn name(&self) -> Option<&str> {
unsafe { self.name.as_ref().and_then(|s| s.as_str().ok()) }
}
} }
impl PartialEq for ClassEntry { impl PartialEq for ClassEntry {

View File

@ -7,12 +7,14 @@ use std::str;
use parking_lot::{const_rwlock, RwLock, RwLockReadGuard, RwLockWriteGuard}; use parking_lot::{const_rwlock, RwLock, RwLockReadGuard, RwLockWriteGuard};
use crate::boxed::ZBox; use crate::boxed::ZBox;
#[cfg(php82)]
use crate::ffi::zend_atomic_bool_store;
use crate::ffi::{ use crate::ffi::{
_zend_executor_globals, ext_php_rs_executor_globals, ext_php_rs_process_globals, _zend_executor_globals, ext_php_rs_executor_globals, ext_php_rs_file_globals,
ext_php_rs_sapi_globals, file_globals, php_core_globals, php_file_globals, sapi_globals_struct, ext_php_rs_process_globals, ext_php_rs_sapi_globals, php_core_globals, php_file_globals,
sapi_header_struct, sapi_headers_struct, sapi_request_info, zend_is_auto_global, sapi_globals_struct, sapi_header_struct, sapi_headers_struct, sapi_request_info,
TRACK_VARS_COOKIE, TRACK_VARS_ENV, TRACK_VARS_FILES, TRACK_VARS_GET, TRACK_VARS_POST, zend_is_auto_global, TRACK_VARS_COOKIE, TRACK_VARS_ENV, TRACK_VARS_FILES, TRACK_VARS_GET,
TRACK_VARS_REQUEST, TRACK_VARS_SERVER, TRACK_VARS_POST, TRACK_VARS_REQUEST, TRACK_VARS_SERVER,
}; };
use crate::types::{ZendHashTable, ZendObject, ZendStr}; use crate::types::{ZendHashTable, ZendObject, ZendStr};
@ -80,6 +82,21 @@ impl ExecutorGlobals {
// SAFETY: `as_mut` checks for null. // SAFETY: `as_mut` checks for null.
Some(unsafe { ZBox::from_raw(exception_ptr.as_mut()?) }) Some(unsafe { ZBox::from_raw(exception_ptr.as_mut()?) })
} }
/// Request an interrupt of the PHP VM. This will call the registered
/// interrupt handler function.
/// set with [`crate::ffi::zend_interrupt_function`].
pub fn request_interrupt(&mut self) {
cfg_if::cfg_if! {
if #[cfg(php82)] {
unsafe {
zend_atomic_bool_store(&mut self.vm_interrupt, true);
}
} else {
self.vm_interrupt = true;
}
}
}
} }
/// Stores global variables used in the PHP executor. /// Stores global variables used in the PHP executor.
@ -378,7 +395,8 @@ impl FileGlobals {
pub fn get() -> GlobalReadGuard<Self> { pub fn get() -> GlobalReadGuard<Self> {
// SAFETY: PHP executor globals are statically declared therefore should never // SAFETY: PHP executor globals are statically declared therefore should never
// return an invalid pointer. // return an invalid pointer.
let globals = unsafe { &file_globals }; let globals = unsafe { ext_php_rs_file_globals().as_ref() }
.expect("Static file globals were invalid");
let guard = FILE_GLOBALS_LOCK.read(); let guard = FILE_GLOBALS_LOCK.read();
GlobalReadGuard { globals, guard } GlobalReadGuard { globals, guard }
} }
@ -393,7 +411,7 @@ impl FileGlobals {
pub fn get_mut() -> GlobalWriteGuard<Self> { pub fn get_mut() -> GlobalWriteGuard<Self> {
// SAFETY: PHP executor globals are statically declared therefore should never // SAFETY: PHP executor globals are statically declared therefore should never
// return an invalid pointer. // return an invalid pointer.
let globals = unsafe { &mut file_globals }; let globals = unsafe { &mut *ext_php_rs_file_globals() };
let guard = SAPI_GLOBALS_LOCK.write(); let guard = SAPI_GLOBALS_LOCK.write();
GlobalWriteGuard { globals, guard } GlobalWriteGuard { globals, guard }
} }