gccjit 5.0.0

Higher-level Rust bindings for libgccjit.
Documentation
use std::ffi::CString;
use std::fmt;
use std::marker::PhantomData;

use block::{self, Block};
use context::Context;

use crate::with_lib;

#[derive(Copy, Clone, Eq, Hash, PartialEq)]
pub struct Region<'ctx> {
    marker: PhantomData<&'ctx Context<'ctx>>,
    ptr: *mut gccjit_sys::gcc_jit_region,
}

impl<'ctx> fmt::Debug for Region<'ctx> {
    fn fmt<'a>(&self, fmt: &mut fmt::Formatter<'a>) -> Result<(), fmt::Error> {
        write!(fmt, "Region ({:?})", self.ptr)
    }
}

impl<'ctx> Region<'ctx> {
    pub fn new_block<S: AsRef<str>>(&self, name: S) -> Block<'ctx> {
        with_lib(|lib| unsafe {
            let cstr = CString::new(name.as_ref()).unwrap();
            let ptr = lib.gcc_jit_region_new_block(self.ptr, cstr.as_ptr());
            block::from_ptr(ptr)
        })
    }

    pub fn add_block(&self, blk: Block<'ctx>) {
        with_lib(|lib| unsafe {
            lib.gcc_jit_region_add_block(self.ptr, block::get_ptr(&blk));
        })
    }
}

pub unsafe fn from_ptr<'ctx>(ptr: *mut gccjit_sys::gcc_jit_region) -> Region<'ctx> {
    Region {
        marker: PhantomData,
        ptr,
    }
}

pub unsafe fn get_ptr<'ctx>(region: &Region<'ctx>) -> *mut gccjit_sys::gcc_jit_region {
    region.ptr
}