Read file contents to binary within macro
This commit is contained in:
parent
480ba5155a
commit
140d963d9b
@ -1,4 +1,4 @@
|
|||||||
fn main() -> u32 {
|
fn main() -> u8 {
|
||||||
// let message = String::from(include_bytes!("./macro_easy_file.txt"));
|
// let message = String::from(include_bytes!("./macro_easy_file.txt"));
|
||||||
return test_macro!();
|
return test_macro!("./examples/macro_easy_file.txt");
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, WhileStatement};
|
use crate::mir::{self, FunctionCall, GlobalKind, GlobalValue, IfExpression, Literal, TypeKind, WhileStatement};
|
||||||
|
|
||||||
use super::pass::{Pass, PassResult, PassState};
|
use super::pass::{Pass, PassResult, PassState};
|
||||||
|
|
||||||
@ -16,6 +16,12 @@ pub enum ErrorKind {
|
|||||||
NoSuchMacro(String),
|
NoSuchMacro(String),
|
||||||
#[error("Macro arguments may only be literals")]
|
#[error("Macro arguments may only be literals")]
|
||||||
InvalidMacroArgs,
|
InvalidMacroArgs,
|
||||||
|
#[error("Got {0} parameters, expected {1}")]
|
||||||
|
InvalidAmountOfParams(u32, u32),
|
||||||
|
#[error("Expected argument type of {0}, got {1}")]
|
||||||
|
InvalidArgumentType(TypeKind, TypeKind),
|
||||||
|
#[error("Error executing macro: {0}")]
|
||||||
|
MacroExecutionError(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Struct used to implement a type-checking pass that can be performed on the
|
/// Struct used to implement a type-checking pass that can be performed on the
|
||||||
@ -183,11 +189,32 @@ pub fn form_macros() -> HashMap<String, Box<dyn MacroFunction>> {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct TestMacro;
|
pub struct TestMacro;
|
||||||
impl MacroFunction for TestMacro {
|
impl MacroFunction for TestMacro {
|
||||||
fn generate<'ctx, 'a>(&self, _: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> {
|
fn generate<'ctx, 'a>(&self, literals: &[mir::Literal]) -> Result<(Vec<GlobalValue>, mir::ExprKind), ErrorKind> {
|
||||||
|
if literals.len() != 1 {
|
||||||
|
return Err(ErrorKind::InvalidAmountOfParams(literals.len() as u32, 1));
|
||||||
|
}
|
||||||
|
let literal = literals.get(0).unwrap();
|
||||||
|
let Literal::String(path) = literal else {
|
||||||
|
return Err(ErrorKind::InvalidArgumentType(
|
||||||
|
literal.as_type(),
|
||||||
|
TypeKind::UserPtr(Box::new(TypeKind::Char)),
|
||||||
|
));
|
||||||
|
};
|
||||||
|
|
||||||
|
let contents = match std::fs::read(path) {
|
||||||
|
Ok(content) => content,
|
||||||
|
Err(e) => return Err(ErrorKind::MacroExecutionError(format!("{}", e))),
|
||||||
|
};
|
||||||
|
|
||||||
|
let literals = contents
|
||||||
|
.iter()
|
||||||
|
.map(|c| GlobalKind::Literal(Literal::U8(*c)))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
Ok((
|
Ok((
|
||||||
vec![GlobalValue {
|
vec![GlobalValue {
|
||||||
name: "sometestglobalvalue".to_owned(),
|
name: "sometestglobalvalue".to_owned(),
|
||||||
kind: GlobalKind::Array(vec![GlobalKind::Literal(Literal::I16(12))]),
|
kind: GlobalKind::Array(literals),
|
||||||
}],
|
}],
|
||||||
mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(5))),
|
mir::ExprKind::Literal(mir::Literal::Vague(mir::VagueLiteral::Number(5))),
|
||||||
))
|
))
|
||||||
|
Loading…
Reference in New Issue
Block a user