#[cfg(feature = "no_std")]
use std::prelude::v1::*;
#[cfg(not(feature = "no_function"))]
use crate::{
ast::script_fn::{ScriptFuncDef, ScriptFuncPayload},
grain::program::SharedProgram,
types::Span,
FnAccess, Module,
};
#[cfg(not(feature = "no_function"))]
const MAX_PARAMS: usize = 16;
#[cfg(not(feature = "no_function"))]
pub(super) fn wrappers(program: &SharedProgram) -> Module {
let mut module = Module::new();
if let Some(source) = program.source() {
module.set_id(source.clone());
}
for function in program.functions() {
let arity = function.params.len();
if arity > MAX_PARAMS {
continue;
}
let Some(name) = program.name(function.name) else {
continue;
};
let params = function
.params
.iter()
.map(|&index| program.names().get(index).unwrap_or(""))
.map(Into::into)
.collect();
module.set_script_fn(ScriptFuncDef {
body: ScriptFuncPayload::GrainVM {
program: program.clone(),
params: function.params.iter().copied().collect(),
chunk: function.chunk,
span: Span::new(
program.position(function.chunk.entry() as usize),
program.position(function.chunk.end() as usize),
),
},
name: name.into(),
access: FnAccess::Private,
#[cfg(not(feature = "no_object"))]
this_type: None,
params,
#[cfg(feature = "metadata")]
comments: Default::default(),
});
}
module
}