impl Instruction {
#[inline]
pub fn registers(&self) -> Vec<RegType> {
- match self {
- &Instruction::GetConstant(_, _, r) => vec![r],
- &Instruction::GetList(_, r) => vec![r],
- &Instruction::GetPartialString(_, _, r, _) => vec![r],
- &Instruction::GetStructure(_, _, _, r) => vec![r],
- &Instruction::GetVariable(r, t) => vec![r, temp_v!(t)],
- &Instruction::GetValue(r, t) => vec![r, temp_v!(t)],
- &Instruction::UnifyLocalValue(r) => vec![r],
- &Instruction::UnifyVariable(r) => vec![r],
- &Instruction::PutConstant(_, _, r) => vec![r],
- &Instruction::PutList(_, r) => vec![r],
- &Instruction::PutPartialString(_, _, r, _) => vec![r],
- &Instruction::PutStructure(_, _, r) => vec![r],
- &Instruction::PutValue(r, t) => vec![r, temp_v!(t)],
- &Instruction::PutVariable(r, t) => vec![r, temp_v!(t)],
- &Instruction::SetLocalValue(r) => vec![r],
- &Instruction::SetVariable(r) => vec![r],
- &Instruction::SetValue(r) => vec![r],
- &Instruction::GetLevel(r) => vec![r],
- &Instruction::GetPrevLevel(r) => vec![r],
- &Instruction::GetCutPoint(r) => vec![r],
+ match *self {
+ Instruction::GetConstant(_, _, r) => vec![r],
+ Instruction::GetList(_, r) => vec![r],
+ Instruction::GetPartialString(_, _, r, _) => vec![r],
+ Instruction::GetStructure(_, _, _, r) => vec![r],
+ Instruction::GetVariable(r, t) => vec![r, temp_v!(t)],
+ Instruction::GetValue(r, t) => vec![r, temp_v!(t)],
+ Instruction::UnifyLocalValue(r) => vec![r],
+ Instruction::UnifyVariable(r) => vec![r],
+ Instruction::PutConstant(_, _, r) => vec![r],
+ Instruction::PutList(_, r) => vec![r],
+ Instruction::PutPartialString(_, _, r, _) => vec![r],
+ Instruction::PutStructure(_, _, r) => vec![r],
+ Instruction::PutValue(r, t) => vec![r, temp_v!(t)],
+ Instruction::PutVariable(r, t) => vec![r, temp_v!(t)],
+ Instruction::SetLocalValue(r) => vec![r],
+ Instruction::SetVariable(r) => vec![r],
+ Instruction::SetValue(r) => vec![r],
+ Instruction::GetLevel(r) => vec![r],
+ Instruction::GetPrevLevel(r) => vec![r],
+ Instruction::GetCutPoint(r) => vec![r],
_ => vec![],
}
}
use std::convert::TryFrom;
use std::error::Error;
use std::ffi::{c_void, CString};
+use std::ptr::addr_of_mut;
use libffi::low::type_tag::STRUCT;
use libffi::low::{ffi_abi_FFI_DEFAULT_ABI, ffi_cif, ffi_type, prep_cif, types, CodePtr};
fn map_type_ffi(&mut self, source: &Atom) -> *mut ffi_type {
unsafe {
match source {
- atom!("sint64") => &mut types::sint64,
- atom!("sint32") => &mut types::sint32,
- atom!("sint16") => &mut types::sint16,
- atom!("sint8") => &mut types::sint8,
- atom!("uint64") => &mut types::uint64,
- atom!("uint32") => &mut types::uint32,
- atom!("uint16") => &mut types::uint16,
- atom!("uint8") => &mut types::uint8,
- atom!("bool") => &mut types::sint8,
- atom!("void") => &mut types::void,
- atom!("cstr") => &mut types::pointer,
- atom!("ptr") => &mut types::pointer,
- atom!("f32") => &mut types::float,
- atom!("f64") => &mut types::double,
+ atom!("sint64") => addr_of_mut!(types::sint64),
+ atom!("sint32") => addr_of_mut!(types::sint32),
+ atom!("sint16") => addr_of_mut!(types::sint16),
+ atom!("sint8") => addr_of_mut!(types::sint8),
+ atom!("uint64") => addr_of_mut!(types::uint64),
+ atom!("uint32") => addr_of_mut!(types::uint32),
+ atom!("uint16") => addr_of_mut!(types::uint16),
+ atom!("uint8") => addr_of_mut!(types::uint8),
+ atom!("bool") => addr_of_mut!(types::sint8),
+ atom!("void") => addr_of_mut!(types::void),
+ atom!("cstr") => addr_of_mut!(types::pointer),
+ atom!("ptr") => addr_of_mut!(types::pointer),
+ atom!("f32") => addr_of_mut!(types::float),
+ atom!("f64") => addr_of_mut!(types::double),
struct_name => match self.structs.get_mut(&*struct_name.as_str()) {
Some(ref mut struct_type) => &mut struct_type.ffi_type,
None => unreachable!(),
}
fn build_pointer_args(
- args: &mut Vec<Value>,
+ args: &mut [Value],
type_args: &[*mut ffi_type],
structs_table: &mut HashMap<String, StructImpl>,
) -> Result<PointerArgs, FFIError> {