Skip to content

Commit

Permalink
WIP: refactor: link type information at runtime
Browse files Browse the repository at this point in the history
  • Loading branch information
Wodann committed May 15, 2022
1 parent 34c3508 commit 9562cb2
Show file tree
Hide file tree
Showing 39 changed files with 1,414 additions and 1,230 deletions.
6 changes: 3 additions & 3 deletions crates/mun/src/ops/start.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,19 @@ pub fn start(matches: &ArgMatches) -> Result<ExitStatus, anyhow::Error> {

if let Some(ret_type) = fn_definition.prototype.signature.return_type() {
let type_guid = &ret_type.guid;
if *type_guid == bool::type_guid() {
if *type_guid == bool::type_id() {
let result: bool = borrowed
.invoke(entry_point, ())
.map_err(|e| anyhow!("{}", e))?;

println!("{}", result)
} else if *type_guid == f64::type_guid() {
} else if *type_guid == f64::type_id() {
let result: f64 = borrowed
.invoke(entry_point, ())
.map_err(|e| anyhow!("{}", e))?;

println!("{}", result)
} else if *type_guid == i64::type_guid() {
} else if *type_guid == i64::type_id() {
let result: i64 = borrowed
.invoke(entry_point, ())
.map_err(|e| anyhow!("{}", e))?;
Expand Down
11 changes: 7 additions & 4 deletions crates/mun_abi/src/assembly_info.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
use crate::{DispatchTable, ModuleInfo};
use crate::{DispatchTable, ModuleInfo, TypeLut};
use std::{ffi::CStr, os::raw::c_char, slice, str};

/// Represents an assembly declaration.
#[repr(C)]
pub struct AssemblyInfo {
/// Symbols of the top-level module
pub symbols: ModuleInfo,
/// Dispatch table
/// Function dispatch table
pub dispatch_table: DispatchTable,
/// Type lookup table
pub type_lut: TypeLut,
/// Paths to assembly dependencies
pub(crate) dependencies: *const *const c_char,
/// Number of dependencies
Expand Down Expand Up @@ -35,7 +37,7 @@ unsafe impl Sync for AssemblyInfo {}
#[cfg(test)]
mod tests {
use crate::test_utils::{
fake_assembly_info, fake_dispatch_table, fake_module_info, FAKE_DEPENDENCY,
fake_assembly_info, fake_dispatch_table, fake_module_info, fake_type_lut, FAKE_DEPENDENCY,
FAKE_MODULE_PATH,
};
use std::ffi::CString;
Expand All @@ -46,10 +48,11 @@ mod tests {
let module = fake_module_info(&module_path, &[], &[]);

let dispatch_table = fake_dispatch_table(&[], &mut []);
let type_lut = fake_type_lut(&[], &mut []);

let dependency = CString::new(FAKE_DEPENDENCY).expect("Invalid fake dependency.");
let dependencies = &[dependency.as_ptr()];
let assembly = fake_assembly_info(module, dispatch_table, dependencies);
let assembly = fake_assembly_info(module, dispatch_table, type_lut, dependencies);

assert_eq!(assembly.dependencies().count(), dependencies.len());
for (lhs, rhs) in assembly.dependencies().zip([FAKE_DEPENDENCY].iter()) {
Expand Down
22 changes: 11 additions & 11 deletions crates/mun_abi/src/dispatch_table.rs
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -147,7 +147,7 @@ mod tests {
assert_eq!(lhs.0, rhs.0);
assert_eq!(lhs.1.name(), rhs.1.name());
assert_eq!(lhs.1.signature.arg_types(), rhs.1.signature.arg_types());
assert_eq!(lhs.1.signature.return_type(), rhs.1.signature.return_type());
assert_eq!(lhs.1.signature.return_type, rhs.1.signature.return_type);
}
}

Expand All @@ -165,7 +165,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand Down Expand Up @@ -194,7 +194,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -207,7 +207,7 @@ mod tests {
for (lhs, rhs) in result.iter().zip(prototypes.iter()) {
assert_eq!(lhs.name(), rhs.name());
assert_eq!(lhs.signature.arg_types(), rhs.signature.arg_types());
assert_eq!(lhs.signature.return_type(), rhs.signature.return_type());
assert_eq!(lhs.signature.return_type, rhs.signature.return_type);
}
}

Expand All @@ -216,7 +216,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -232,7 +232,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -248,7 +248,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -264,7 +264,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -283,7 +283,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand All @@ -299,7 +299,7 @@ mod tests {
let type_name = CString::new(FAKE_TYPE_NAME).expect("Invalid fake type name.");
let type_info = fake_type_info(&type_name, 1, 1, TypeInfoData::Primitive);

let return_type = Some(&type_info);
let return_type = Some(type_info.id);
let fn_name = CString::new(FAKE_FN_NAME).expect("Invalid fake fn name.");
let fn_prototype = fake_fn_prototype(&fn_name, &[], return_type);

Expand Down
Loading

0 comments on commit 9562cb2

Please sign in to comment.