forked from M-Labs/nac3
1
0
Fork 0

FieldTraversal::{Out -> Output}

This commit is contained in:
lyken 2024-08-27 17:33:17 +08:00
parent f167f5f215
commit 6283036815
No known key found for this signature in database
GPG Key ID: 3BD5FC6AC8325DD8
1 changed files with 10 additions and 10 deletions

View File

@ -13,16 +13,16 @@ use super::*;
/// A traveral that traverses a Rust `struct` that is used to declare an LLVM's struct's field types. /// A traveral that traverses a Rust `struct` that is used to declare an LLVM's struct's field types.
pub trait FieldTraversal<'ctx> { pub trait FieldTraversal<'ctx> {
/// Output type of [`FieldTraversal::add`]. /// Output type of [`FieldTraversal::add`].
type Out<M>; type Output<M>;
/// Traverse through the type of a declared field and do something with it. /// Traverse through the type of a declared field and do something with it.
/// ///
/// * `name` - The cosmetic name of the LLVM field. Used for debugging. /// * `name` - The cosmetic name of the LLVM field. Used for debugging.
/// * `model` - The [`Model`] representing the LLVM type of this field. /// * `model` - The [`Model`] representing the LLVM type of this field.
fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Out<M>; fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Output<M>;
/// Like [`FieldTraversal::add`] but [`Model`] is automatically inferred from its [`Default`] trait. /// Like [`FieldTraversal::add`] but [`Model`] is automatically inferred from its [`Default`] trait.
fn add_auto<M: Model<'ctx> + Default>(&mut self, name: &'static str) -> Self::Out<M> { fn add_auto<M: Model<'ctx> + Default>(&mut self, name: &'static str) -> Self::Output<M> {
self.add(name, M::default()) self.add(name, M::default())
} }
} }
@ -45,12 +45,12 @@ pub struct GepFieldTraversal {
} }
impl<'ctx> FieldTraversal<'ctx> for GepFieldTraversal { impl<'ctx> FieldTraversal<'ctx> for GepFieldTraversal {
type Out<M> = GepField<M>; type Output<M> = GepField<M>;
fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Out<M> { fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Output<M> {
let gep_index = self.gep_index_counter; let gep_index = self.gep_index_counter;
self.gep_index_counter += 1; self.gep_index_counter += 1;
Self::Out { gep_index, name, model } Self::Output { gep_index, name, model }
} }
} }
@ -65,9 +65,9 @@ struct TypeFieldTraversal<'ctx, 'a, G: CodeGenerator + ?Sized> {
} }
impl<'ctx, 'a, G: CodeGenerator + ?Sized> FieldTraversal<'ctx> for TypeFieldTraversal<'ctx, 'a, G> { impl<'ctx, 'a, G: CodeGenerator + ?Sized> FieldTraversal<'ctx> for TypeFieldTraversal<'ctx, 'a, G> {
type Out<M> = (); // Checking types return nothing. type Output<M> = (); // Checking types return nothing.
fn add<M: Model<'ctx>>(&mut self, _name: &'static str, model: M) -> Self::Out<M> { fn add<M: Model<'ctx>>(&mut self, _name: &'static str, model: M) -> Self::Output<M> {
let t = model.llvm_type(self.generator, self.ctx).as_basic_type_enum(); let t = model.llvm_type(self.generator, self.ctx).as_basic_type_enum();
self.field_types.push(t); self.field_types.push(t);
} }
@ -89,9 +89,9 @@ struct CheckTypeFieldTraversal<'ctx, 'a, G: CodeGenerator + ?Sized> {
impl<'ctx, 'a, G: CodeGenerator + ?Sized> FieldTraversal<'ctx> impl<'ctx, 'a, G: CodeGenerator + ?Sized> FieldTraversal<'ctx>
for CheckTypeFieldTraversal<'ctx, 'a, G> for CheckTypeFieldTraversal<'ctx, 'a, G>
{ {
type Out<M> = (); // Checking types return nothing. type Output<M> = (); // Checking types return nothing.
fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Out<M> { fn add<M: Model<'ctx>>(&mut self, name: &'static str, model: M) -> Self::Output<M> {
let gep_index = self.gep_index_counter; let gep_index = self.gep_index_counter;
self.gep_index_counter += 1; self.gep_index_counter += 1;