il2cpp_rs 0.1.3

A library for interacting with il2cpp on Windows
use crate::il2cpp::classes::arg::Arg;
use crate::il2cpp::classes::class::ClassInner;
use crate::il2cpp::classes::itype::Type;
use parking_lot::RwLock;
use std::sync::{Arc, Weak};

pub struct MethodInner {
    pub address: *mut u8,
    pub name: String,
    pub class: Weak<ClassInner>,
    pub return_type: Type,
    pub flags: i32,
    pub is_static: bool,
    pub function: *mut u8,
    pub args: RwLock<Vec<Arg>>,
}

pub type Method = Arc<MethodInner>;

impl MethodInner {
    pub fn new(
        address: *mut u8,
        name: String,
        class: Weak<ClassInner>,
        return_type: Type,
        flags: i32,
        is_static: bool,
        function: *mut u8,
        args: RwLock<Vec<Arg>>,
    ) -> Method {
        Arc::new(Self {
            address,
            name,
            class,
            return_type,
            flags,
            is_static,
            function,
            args,
        })
    }

    pub unsafe fn callable<T>(&self) -> T {
        unsafe { std::mem::transmute_copy(&self.function) }
    }

    pub fn try_callable<T>(&self) -> Result<T, String> {
        if self.function == std::ptr::null_mut() {
            return Err("invalid ptr".to_string());
        }
        Ok(unsafe { self.callable::<T>() })
    }
}

unsafe impl Send for MethodInner {}
unsafe impl Sync for MethodInner {}