Skip to content

Commit

Permalink
Cleanup related module structure
Browse files Browse the repository at this point in the history
  • Loading branch information
Y-Nak committed Sep 9, 2024
1 parent 327ac61 commit fe88bff
Show file tree
Hide file tree
Showing 3 changed files with 117 additions and 108 deletions.
108 changes: 5 additions & 103 deletions crates/ir/src/inst.rs → crates/ir/src/inst/basic.rs
Original file line number Diff line number Diff line change
@@ -1,24 +1,7 @@
use sonatina_macros::Inst;
use std::any::{Any, TypeId};

use smallvec::SmallVec;

use crate::{module::FuncRef, Block, Type, Value};
use smallvec::SmallVec;

pub trait Inst: Any {
fn visit_values(&self, f: &mut dyn FnMut(Value));
fn visit_values_mut(&mut self, f: &mut dyn FnMut(&mut Value));
fn has_side_effect(&self) -> bool;
fn as_text(&self) -> &'static str;
}

/// This trait works as a "proof" that a specific ISA contains `I`,
/// and then allows a construction and reflection of type `I` in that specific ISA context.
pub trait HasInst<I: Inst> {
fn is(&self, inst: &dyn Inst) -> bool {
inst.type_id() == TypeId::of::<I>()
}
}
use sonatina_macros::Inst;

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
#[inst(side_effect = false)]
Expand Down Expand Up @@ -308,87 +291,6 @@ pub struct Phi {
ty: Type,
}

pub(crate) trait ValueVisitable {
fn visit_with(&self, f: &mut dyn FnMut(Value));
fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value));
}

impl ValueVisitable for Value {
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
f(*self)
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
f(self)
}
}

impl<V> ValueVisitable for Option<V>
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
if let Some(value) = self {
value.visit_with(f)
}
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
if let Some(value) = self.as_mut() {
value.visit_mut_with(f)
}
}
}

impl<V, T> ValueVisitable for (V, T)
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.0.visit_with(f)
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.0.visit_mut_with(f)
}
}

impl<V> ValueVisitable for Vec<V>
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}

impl<V> ValueVisitable for [V]
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}

impl<V, const N: usize> ValueVisitable for SmallVec<[V; N]>
where
V: ValueVisitable,
[V; N]: smallvec::Array<Item = V>,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Inst)]
#[inst(side_effect = false)]
pub struct Nop {}
107 changes: 107 additions & 0 deletions crates/ir/src/inst/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
pub mod basic;

use std::any::{Any, TypeId};

use smallvec::SmallVec;

use crate::Value;

pub trait Inst: Any {
fn visit_values(&self, f: &mut dyn FnMut(Value));
fn visit_values_mut(&mut self, f: &mut dyn FnMut(&mut Value));
fn has_side_effect(&self) -> bool;
fn as_text(&self) -> &'static str;
}

/// This trait works as a "proof" that a specific ISA contains `I`,
/// and then allows a construction and reflection of type `I` in that specific ISA context.
pub trait HasInst<I: Inst> {
fn is(&self, inst: &dyn Inst) -> bool {
inst.type_id() == TypeId::of::<I>()
}
}

pub(crate) trait ValueVisitable {
fn visit_with(&self, f: &mut dyn FnMut(Value));
fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value));
}

impl ValueVisitable for Value {
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
f(*self)
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
f(self)
}
}

impl<V> ValueVisitable for Option<V>
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
if let Some(value) = self {
value.visit_with(f)
}
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
if let Some(value) = self.as_mut() {
value.visit_mut_with(f)
}
}
}

impl<V, T> ValueVisitable for (V, T)
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.0.visit_with(f)
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.0.visit_mut_with(f)
}
}

impl<V> ValueVisitable for Vec<V>
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}

impl<V> ValueVisitable for [V]
where
V: ValueVisitable,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}

impl<V, const N: usize> ValueVisitable for SmallVec<[V; N]>
where
V: ValueVisitable,
[V; N]: smallvec::Array<Item = V>,
{
fn visit_with(&self, f: &mut dyn FnMut(Value)) {
self.iter().for_each(|v| v.visit_with(f))
}

fn visit_mut_with(&mut self, f: &mut dyn FnMut(&mut Value)) {
self.iter_mut().for_each(|v| v.visit_mut_with(f))
}
}
10 changes: 5 additions & 5 deletions crates/macros/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,20 +186,20 @@ impl InstStruct {

fn make_cast_fn(&self) -> proc_macro2::TokenStream {
quote! {
pub fn cast<'i>(hi: &dyn crate::HasInst<Self>, inst: &'i dyn Inst) -> Option<&'i Self> {
pub fn cast<'i>(hi: &dyn crate::HasInst<Self>, inst: &'i dyn crate::Inst) -> Option<&'i Self> {
if hi.is(inst) {
unsafe { Some(&*(inst as *const dyn Inst as *const Self)) }
unsafe { Some(&*(inst as *const dyn crate::Inst as *const Self)) }
} else {
None
}
}

pub fn cast_mut<'i>(
hi: &dyn HasInst<Self>,
inst: &'i mut dyn Inst,
hi: &dyn crate::HasInst<Self>,
inst: &'i mut dyn crate::Inst,
) -> Option<&'i mut Self> {
if hi.is(inst) {
unsafe { Some(&mut *(inst as *mut dyn Inst as *mut Self)) }
unsafe { Some(&mut *(inst as *mut dyn crate::Inst as *mut Self)) }
} else {
None
}
Expand Down

0 comments on commit fe88bff

Please sign in to comment.