fix local src/dst types in complex morphisms
This commit is contained in:
parent
39cba1ee57
commit
35b747ea15
1 changed files with 6 additions and 144 deletions
150
src/c_gen.rs
150
src/c_gen.rs
|
@ -2,12 +2,6 @@ use {
|
||||||
crate::{c_gen_types::{encode_morph_type_to_symbol, encode_type_to_symbol, encode_type_to_value, get_c_repr_type}, morphism::LdmcPrimMorph, struct_layout::{get_type_size, LayoutType, ObjectSize, StructLayout}}, chumsky::{chain::Chain, primitive::Container}, laddertypes::{morphism::{Morphism, MorphismInstance}, morphism_sugared::{MorphismInstance2, SugaredMorphism, SugaredMorphismType}, parser::*, substitution_sugared::SugaredSubstitution, unparser::*, Substitution, SugaredEnumVariant, SugaredStructMember, SugaredTypeTerm, TypeDict, TypeTerm}, std::collections::HashMap
|
crate::{c_gen_types::{encode_morph_type_to_symbol, encode_type_to_symbol, encode_type_to_value, get_c_repr_type}, morphism::LdmcPrimMorph, struct_layout::{get_type_size, LayoutType, ObjectSize, StructLayout}}, chumsky::{chain::Chain, primitive::Container}, laddertypes::{morphism::{Morphism, MorphismInstance}, morphism_sugared::{MorphismInstance2, SugaredMorphism, SugaredMorphismType}, parser::*, substitution_sugared::SugaredSubstitution, unparser::*, Substitution, SugaredEnumVariant, SugaredStructMember, SugaredTypeTerm, TypeDict, TypeTerm}, std::collections::HashMap
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
impl LdmcPrimMorph {
|
impl LdmcPrimMorph {
|
||||||
pub fn instantiated_symbol_name(&self, dict: &mut impl TypeDict, σ: &impl SugaredSubstitution) -> String {
|
pub fn instantiated_symbol_name(&self, dict: &mut impl TypeDict, σ: &impl SugaredSubstitution) -> String {
|
||||||
let mut s = self.symbol.clone();
|
let mut s = self.symbol.clone();
|
||||||
|
@ -40,9 +34,6 @@ impl LdmcPrimMorph {
|
||||||
|
|
||||||
pub fn generate_instantiation(&self, dict: &mut impl TypeDict, σ: &impl SugaredSubstitution) -> Option<String> {
|
pub fn generate_instantiation(&self, dict: &mut impl TypeDict, σ: &impl SugaredSubstitution) -> Option<String> {
|
||||||
let mut s = String::new();
|
let mut s = String::new();
|
||||||
let src_type = self.ty.src_type.clone().apply_subst(σ).clone();
|
|
||||||
let dst_type = self.ty.dst_type.clone().apply_subst(σ).clone();
|
|
||||||
|
|
||||||
let symbol = self.instantiated_symbol_name(dict, σ);
|
let symbol = self.instantiated_symbol_name(dict, σ);
|
||||||
let src_c_symbol = encode_type_to_symbol(dict, &self.ty.strip_halo().src_type);
|
let src_c_symbol = encode_type_to_symbol(dict, &self.ty.strip_halo().src_type);
|
||||||
let dst_c_symbol = encode_type_to_symbol(dict, &self.ty.strip_halo().dst_type);
|
let dst_c_symbol = encode_type_to_symbol(dict, &self.ty.strip_halo().dst_type);
|
||||||
|
@ -174,8 +165,8 @@ impl LdmcCTargetMorph {
|
||||||
if let Ok(inst) = self.add_instantiation(dict, morph.clone()) {
|
if let Ok(inst) = self.add_instantiation(dict, morph.clone()) {
|
||||||
let morph_symbol = inst.instantiated_symbol_name(dict, &morph.get_subst());
|
let morph_symbol = inst.instantiated_symbol_name(dict, &morph.get_subst());
|
||||||
|
|
||||||
let src_c_type = get_c_repr_type(dict, inst.get_type().strip_halo().src_type, true).expect("cant get c-repr type for src type");
|
let src_c_type = encode_type_to_symbol(dict, &inst.get_type().strip_halo().src_type);
|
||||||
let dst_c_type = get_c_repr_type(dict, inst.get_type().strip_halo().dst_type, true).expect("cant get c-repr type for dst type");
|
let dst_c_type = encode_type_to_symbol(dict, &inst.get_type().strip_halo().dst_type);
|
||||||
|
|
||||||
let src_buf = if i == 0 { "src" } else if i%2 == 0 { "(void*)bufA" } else { "(void*)bufB" };
|
let src_buf = if i == 0 { "src" } else if i%2 == 0 { "(void*)bufA" } else { "(void*)bufB" };
|
||||||
let dst_buf = if i+1 == path.len() { "dst" } else if i%2 == 0 { "(void*)bufB" } else { "(void*)bufA" };
|
let dst_buf = if i+1 == path.len() { "dst" } else if i%2 == 0 { "(void*)bufB" } else { "(void*)bufA" };
|
||||||
|
@ -218,8 +209,10 @@ impl LdmcCTargetMorph {
|
||||||
let length_c_type = get_c_repr_type(dict, length_type.clone(), true).expect("cant c-repr type for array length");
|
let length_c_type = get_c_repr_type(dict, length_type.clone(), true).expect("cant c-repr type for array length");
|
||||||
let src_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().src_type, true).expect("cant c-repr type for src item");
|
let src_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().src_type, true).expect("cant c-repr type for src item");
|
||||||
let dst_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().dst_type, true).expect("cant c-repr type for dst item");
|
let dst_item_c_type = get_c_repr_type(dict, item_morph.get_haloless_type().dst_type, true).expect("cant c-repr type for dst item");
|
||||||
let src_c_type = encode_type_to_symbol(dict, &ty.strip_halo().src_type);
|
let src_c_type = encode_type_to_symbol(dict, &ty.src_type);
|
||||||
let dst_c_type = encode_type_to_symbol(dict, &ty.strip_halo().dst_type);
|
let dst_c_type = encode_type_to_symbol(dict, &ty.dst_type);
|
||||||
|
|
||||||
|
// todo: self.add_active_length_prefix_map()
|
||||||
|
|
||||||
let map_fn = format!("length_prefix_{}_array_map_{}_to_{}",
|
let map_fn = format!("length_prefix_{}_array_map_{}_to_{}",
|
||||||
length_c_type, src_item_c_type, dst_item_c_type
|
length_c_type, src_item_c_type, dst_item_c_type
|
||||||
|
@ -285,134 +278,3 @@ impl LdmcCTargetMorph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
pub fn generate_main(
|
|
||||||
type_dict: &mut impl TypeDict,
|
|
||||||
morph: MorphismInstance2<LdmcPrimMorph>,
|
|
||||||
src_type: TypeTerm, dst_type: TypeTerm
|
|
||||||
) {
|
|
||||||
let mut i = 0;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* todo: collect include files from morphism base */
|
|
||||||
println!(r#"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
"#);
|
|
||||||
|
|
||||||
let mut existing_instantiations = Vec::new();
|
|
||||||
for morph_inst in path.iter() {
|
|
||||||
match &morph_inst.m {
|
|
||||||
LdmcMorphism::Primitive( item_morph ) => {
|
|
||||||
let name = item_morph.instantiated_symbol_name(type_dict, &morph_inst.σ);
|
|
||||||
if ! existing_instantiations.contains(&name) {
|
|
||||||
if let Some(s) = item_morph.generate_instantiation(type_dict, &morph_inst.σ) {
|
|
||||||
println!("{}", s);
|
|
||||||
} else {
|
|
||||||
eprintln!("couldnt generate instance {}", name);
|
|
||||||
}
|
|
||||||
existing_instantiations.push( name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
LdmcMorphism::LengthPrefixMap { length_prefix_type, item_morph } => {
|
|
||||||
let name = item_morph.instantiated_symbol_name(type_dict, &morph_inst.σ);
|
|
||||||
if ! existing_instantiations.contains(&name) {
|
|
||||||
if let Some(s) = item_morph.generate_instantiation(type_dict, &morph_inst.σ) {
|
|
||||||
println!("{}", s);
|
|
||||||
} else {
|
|
||||||
eprintln!("couldnt generate instance {}", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
existing_instantiations.push( name );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
println!(r#"
|
|
||||||
int main() {{
|
|
||||||
uint8_t bufA[128];
|
|
||||||
uint8_t bufB[128];
|
|
||||||
|
|
||||||
memset(bufA, 0, sizeof(bufA));
|
|
||||||
memset(bufB, 0, sizeof(bufB));
|
|
||||||
|
|
||||||
char in_str[] = "read :: {} \n";
|
|
||||||
char out_str[]= "write:: {} \n";
|
|
||||||
write(2, in_str, strlen(in_str));
|
|
||||||
write(2, out_str, strlen(out_str));
|
|
||||||
|
|
||||||
int l = read(0, bufA, sizeof(bufA));
|
|
||||||
//fprintf(stderr, "read %d bytes\n", l);
|
|
||||||
|
|
||||||
"#,
|
|
||||||
type_dict.unparse(&src_type).replace("\\", "\\\\"),
|
|
||||||
type_dict.unparse(&dst_type).replace("\\", "\\\\") );
|
|
||||||
|
|
||||||
for morph_inst in path.iter() {
|
|
||||||
println!(r#"
|
|
||||||
/* morph to {}
|
|
||||||
|
|
||||||
...with
|
|
||||||
morph {}
|
|
||||||
---> {},
|
|
||||||
subst σ = {:?},
|
|
||||||
halo Ψ = {}
|
|
||||||
*/
|
|
||||||
{}
|
|
||||||
"#,
|
|
||||||
type_dict.unparse(&morph_inst.get_type().dst_type.param_normalize().decurry()),
|
|
||||||
type_dict.unparse(&morph_inst.m.get_type().src_type),
|
|
||||||
type_dict.unparse(&morph_inst.m.get_type().dst_type),
|
|
||||||
morph_inst.σ,
|
|
||||||
type_dict.unparse(&morph_inst.halo),
|
|
||||||
morph_inst.m.generate_call(type_dict, &morph_inst.σ, i)
|
|
||||||
);
|
|
||||||
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let out_buf = if i%2==0 { "bufA" } else { "bufB" };
|
|
||||||
|
|
||||||
let is_string = false;
|
|
||||||
if let Ok((halo, σ)) = laddertypes::subtype_unify(
|
|
||||||
&dst_type,
|
|
||||||
&type_dict.parse("<Seq~<ValueTerminated 0> native.UInt8>").unwrap()
|
|
||||||
) {
|
|
||||||
println!(r#"
|
|
||||||
printf("%s\n", {});"#, out_buf);
|
|
||||||
} else if let Ok((halo, σ)) = laddertypes::subtype_unify(
|
|
||||||
&dst_type,
|
|
||||||
&type_dict.parse("<Seq~<LengthPrefix native.UInt64> native.UInt8>").unwrap()
|
|
||||||
) {
|
|
||||||
println!(r#"
|
|
||||||
/* write output
|
|
||||||
*/
|
|
||||||
{{
|
|
||||||
LengthPrefix_uint64_t_Array_uint8_t * buf = (void*){};
|
|
||||||
write(1, {}, sizeof(uint64_t) + buf->len);
|
|
||||||
}}"#, out_buf, out_buf);
|
|
||||||
} else {
|
|
||||||
println!(r#"
|
|
||||||
write(1, {}, sizeof({}));"#,
|
|
||||||
out_buf,
|
|
||||||
out_buf
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
println!(r#"
|
|
||||||
return 0;
|
|
||||||
}}
|
|
||||||
"#);
|
|
||||||
|
|
||||||
eprintln!("Success: generated C code");
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue