lemonlang 0.0.3

an experimental, modern, purely safe, programming language.
use crate::{
	ir::{self},
	report::throw_llvm_error,
};

use super::Llvm;

impl Llvm<'_> {
	pub fn llvm_init_struct(&mut self, instr: &ir::StructInitInstr) {
		let struct_name = instr.struct_id.as_str();

		#[rustfmt::skip]
		let struct_type = self.module.get_struct_type(struct_name).unwrap_or_else(|| {
			throw_llvm_error(format!("struct '{}' not found", struct_name))
		});

		self.stack.set_struct_type(instr.type_id, struct_type);

		let mut values = vec![None; struct_type.count_fields() as usize];
		self.fill_struct_values(struct_name, &instr.binds, &mut values);

		let final_values = values.into_iter().flatten().collect::<Vec<_>>();

		let _ = struct_type.const_named_struct(&final_values);

		let struct_size = self.calculate_struct_size(struct_type);
		let struct_ptr = self.allocate_struct(struct_size, &instr.dest);

		final_values.iter().enumerate().for_each(|(at, value)| {
			self.store_struct_field(struct_type, struct_ptr, *value, at);
		});
		self.stack.set_register_type(instr.dest, struct_type);
		self.stack.set_value(instr.dest, struct_ptr.into());
	}
}