fix typedefs
This commit is contained in:
parent
3ed7a19270
commit
923fe987dc
14 changed files with 309 additions and 245 deletions
morphisms
src
|
@ -7,9 +7,9 @@ morph_array_as_valterm_to_lenpfx (Terminator:native.UInt8)
|
||||||
<Seq~<ValueTerminated Terminator> native.UInt8>
|
<Seq~<ValueTerminated Terminator> native.UInt8>
|
||||||
--> <Seq~<LengthPrefix native.UInt64> native.UInt8>
|
--> <Seq~<LengthPrefix native.UInt64> native.UInt8>
|
||||||
```
|
```
|
||||||
length_prefix_uint64_t_array_uint8_t_clear(dst);
|
length_prefix_nativeUInt64_array_nativeUInt8_clear(dst);
|
||||||
while( *src != Terminator )
|
while( *src != Terminator )
|
||||||
length_prefix_uint64_t_array_uint8_t_push(dst, *src++);
|
length_prefix_nativeUInt64_array_nativeUInt8_push(dst, *src++);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,15 +38,15 @@ morph_posint_radix_le (SrcRadix:ℤ, DstRadix:ℤ)
|
||||||
value += src->items[src->len - i - 1];
|
value += src->items[src->len - i - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
length_prefix_uint64_t_array_uint64_t_clear( dst );
|
length_prefix_nativeUInt64_array_nativeUInt64_clear( dst );
|
||||||
|
|
||||||
#if DstRadix==0
|
#if DstRadix==0
|
||||||
length_prefix_uint64_t_array_uint64_t_push( dst, value );
|
length_prefix_nativeUInt64_array_nativeUInt64_push( dst, value );
|
||||||
#else
|
#else
|
||||||
if( value == 0 ) {
|
if( value == 0 ) {
|
||||||
length_prefix_uint64_t_array_uint64_t_push( dst, 0 );
|
length_prefix_nativeUInt64_array_nativeUInt64_push( dst, 0 );
|
||||||
} else while( value > 0 ) {
|
} else while( value > 0 ) {
|
||||||
length_prefix_uint64_t_array_uint64_t_push( dst, value % DstRadix );
|
length_prefix_nativeUInt64_array_nativeUInt64_push( dst, value % DstRadix );
|
||||||
value /= DstRadix;
|
value /= DstRadix;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -97,7 +97,7 @@ morph_posint_endianness (Radix:ℤ)
|
||||||
~ <PosInt Radix BigEndian>
|
~ <PosInt Radix BigEndian>
|
||||||
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
||||||
```
|
```
|
||||||
return length_prefix_uint64_t_array_uint64_t_reverse( src, dst );
|
return length_prefix_nativeUInt64_array_nativeUInt64_reverse( src, dst );
|
||||||
```
|
```
|
||||||
|
|
||||||
morph_posint_endianness (Radix:ℤ)
|
morph_posint_endianness (Radix:ℤ)
|
||||||
|
@ -108,5 +108,5 @@ morph_posint_endianness (Radix:ℤ)
|
||||||
~ <PosInt Radix LittleEndian>
|
~ <PosInt Radix LittleEndian>
|
||||||
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
~ <Seq~<LengthPrefix native.UInt64> <Digit Radix> ~ native.UInt64>
|
||||||
```
|
```
|
||||||
return length_prefix_uint64_t_array_uint64_t_reverse( src, dst );
|
return length_prefix_nativeUInt64_array_nativeUInt64_reverse( src, dst );
|
||||||
```
|
```
|
||||||
|
|
|
@ -2,27 +2,37 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
/*
|
||||||
|
typedef struct { \
|
||||||
|
LEN_TYPE len; \
|
||||||
|
ITEM_TYPE items[]; \
|
||||||
|
} __Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_; \
|
||||||
|
*/ \
|
||||||
|
|
||||||
|
#define LENGTH_PREFIX_ARRAY_TYPE(LEN_TYPE, ITEM_TYPE) \
|
||||||
|
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_
|
||||||
|
|
||||||
|
#define LENGTH_PREFIX_ARRAY_CALL(LEN_TYPE, ITEM_TYPE, METHOD) \
|
||||||
|
length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_ ## METHOD
|
||||||
|
|
||||||
|
#define PRESCAN_LENGTH_PREFIX_CALL(LEN, ITEM, METHOD) \
|
||||||
|
LENGTH_PREFIX_ARRAY_CALL(LEN, ITEM, METHOD)
|
||||||
|
|
||||||
#define DEFINE_LENGTH_PREFIX_ARRAY(LEN_TYPE, ITEM_TYPE) \
|
#define DEFINE_LENGTH_PREFIX_ARRAY(LEN_TYPE, ITEM_TYPE) \
|
||||||
typedef struct { \
|
static inline void PRESCAN_LENGTH_PREFIX_CALL(LEN_TYPE, ITEM_TYPE, clear) \
|
||||||
LEN_TYPE len; \
|
(__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *data) { \
|
||||||
ITEM_TYPE items[]; \
|
|
||||||
} __Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_; \
|
|
||||||
\
|
|
||||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_clear( \
|
|
||||||
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *data) { \
|
|
||||||
data->len = 0; \
|
data->len = 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_push( \
|
static inline void PRESCAN_LENGTH_PREFIX_CALL(LEN_TYPE, ITEM_TYPE, push) \
|
||||||
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *data, \
|
(__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *data, \
|
||||||
ITEM_TYPE value) { \
|
ITEM_TYPE value) { \
|
||||||
data->items[data->len++] = value; \
|
data->items[data->len++] = value; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline int length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_reverse( \
|
static inline int PRESCAN_LENGTH_PREFIX_CALL(LEN_TYPE, ITEM_TYPE, reverse) \
|
||||||
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ const * restrict src, \
|
( __Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ const * restrict src, \
|
||||||
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *restrict dst) { \
|
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ *restrict dst) { \
|
||||||
for (LEN_TYPE i = 0; i < src->len; i++) { \
|
for (LEN_TYPE i = 0; i < src->len; i++) { \
|
||||||
dst->items[i] = src->items[src->len - 1 - i]; \
|
dst->items[i] = src->items[src->len - 1 - i]; \
|
||||||
} \
|
} \
|
||||||
|
@ -30,8 +40,8 @@
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline void length_prefix_##LEN_TYPE##_array_##ITEM_TYPE##_dump( \
|
static inline void PRESCAN_LENGTH_PREFIX_CALL(LEN_TYPE, ITEM_TYPE, dump) \
|
||||||
__Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ const * data) { \
|
( __Seq__LengthPrefix_##LEN_TYPE##___##ITEM_TYPE##_ const * data) { \
|
||||||
printf("Length: %llu\n", (unsigned long long) data->len); \
|
printf("Length: %llu\n", (unsigned long long) data->len); \
|
||||||
for (LEN_TYPE i = 0; i < data->len; i++) { \
|
for (LEN_TYPE i = 0; i < data->len; i++) { \
|
||||||
printf("%llu ", (unsigned long long) data->items[i]); \
|
printf("%llu ", (unsigned long long) data->items[i]); \
|
||||||
|
|
|
@ -12,19 +12,19 @@ morph_seqseq_valsep_uint8 (T: Type, SrcDelim: T, DstDelim: T)
|
||||||
~ < ValueSep DstDelim T >
|
~ < ValueSep DstDelim T >
|
||||||
~ < Seq~<LengthPrefix native.UInt64> T >
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
||||||
```
|
```
|
||||||
length_prefix_uint64_t_array_uint8_t_clear( dst );
|
PRESCAN_LENGTH_PREFIX_CALL(nativeUInt64, T, clear)( dst );
|
||||||
|
|
||||||
uint8_t * dst_items = dst->items;
|
uint8_t * dst_items = dst->items;
|
||||||
for( uint64_t i = 0; i < src->len; ++i ) {
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
||||||
if( src->items[i] == SrcDelim ) {
|
if( src->items[i] == SrcDelim ) {
|
||||||
length_prefix_uint64_t_array_uint8_t_push( dst, DstDelim );
|
PRESCAN_LENGTH_PREFIX_CALL(nativeUInt64, T, push)( dst, DstDelim );
|
||||||
} else if( src->items[i] == DstDelim ) {
|
} else if( src->items[i] == DstDelim ) {
|
||||||
if( DstDelim == '\n' ) {
|
if( DstDelim == '\n' ) {
|
||||||
length_prefix_uint64_t_array_uint8_t_push( dst, '\\' );
|
PRESCAN_LENGTH_PREFIX_CALL(nativeUInt64, T, push)( dst, '\\' );
|
||||||
length_prefix_uint64_t_array_uint8_t_push( dst, 'n' );
|
PRESCAN_LENGTH_PREFIX_CALL(nativeUInt64, T, push)( dst, 'n' );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
length_prefix_uint64_t_array_uint8_t_push( dst, src->items[i] );
|
PRESCAN_LENGTH_PREFIX_CALL(nativeUInt64, T, push)( dst, src->items[i] );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -42,9 +42,9 @@ morph_seqseq_as_valsep_to_lenpfx (T: Type, Delim: T, EscKey: T)
|
||||||
~ native.UInt64
|
~ native.UInt64
|
||||||
>
|
>
|
||||||
```
|
```
|
||||||
length_prefix_uint64_t_array_uint64_t_clear( dst );
|
length_prefix_nativeUInt64_array_nativeUInt64_clear( dst );
|
||||||
|
|
||||||
struct LengthPrefix_uint64_t_Array_uint8_t * cur_item = NULL;
|
struct LengthPrefix_nativeUInt64_Array_nativeUInt8 * cur_item = NULL;
|
||||||
|
|
||||||
uint8_t const * start = &src->items[0];
|
uint8_t const * start = &src->items[0];
|
||||||
uint8_t const * cur = start;
|
uint8_t const * cur = start;
|
||||||
|
@ -58,7 +58,7 @@ morph_seqseq_as_valsep_to_lenpfx (T: Type, Delim: T, EscKey: T)
|
||||||
cur_item->len = len;
|
cur_item->len = len;
|
||||||
memcpy( cur_item->items, start, len );
|
memcpy( cur_item->items, start, len );
|
||||||
|
|
||||||
length_prefix_uint64_t_array_uint64_t_push( dst, (uint64_t)cur_item );
|
length_prefix_nativeUInt64_array_nativeUInt64_push( dst, (uint64_t)cur_item );
|
||||||
start = ++cur;
|
start = ++cur;
|
||||||
} else {
|
} else {
|
||||||
cur++;
|
cur++;
|
||||||
|
@ -77,17 +77,17 @@ morph_seqeq_as_lenpfx_to_valsep (T: Type, Delim: T, EscKey: T)
|
||||||
~ < ValueSep T Delim >
|
~ < ValueSep T Delim >
|
||||||
~ < Seq~<LengthPrefix native.UInt64> T >
|
~ < Seq~<LengthPrefix native.UInt64> T >
|
||||||
```
|
```
|
||||||
length_prefix_uint64_t_array_uint8_t_clear( dst );
|
length_prefix_nativeUInt64_array_nativeUInt8_clear( dst );
|
||||||
|
|
||||||
for( uint64_t i = 0; i < src->len; ++i ) {
|
for( uint64_t i = 0; i < src->len; ++i ) {
|
||||||
LengthPrefix_uint64_t_Array_uint8_t * item = src->items[i];
|
LengthPrefix_nativeUInt64_Array_nativeUInt8_t * item = src->items[i];
|
||||||
|
|
||||||
for( uint64_t j = 0; j < item->len; ++j ) {
|
for( uint64_t j = 0; j < item->len; ++j ) {
|
||||||
length_prefix_uint64_t_array_uint8_t_push( items->items[j] );
|
length_prefix_nativeUInt64_array_nativeUInt8_push( items->items[j] );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( i+1 < src->len ) {
|
if( i+1 < src->len ) {
|
||||||
length_prefix_uint64_t_array_uint8_t_push( Delim );
|
length_prefix_nativeUInt64_array_nativeUInt8_push( Delim );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
49
src/c_gen/gen_main.rs
Normal file
49
src/c_gen/gen_main.rs
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
use {
|
||||||
|
laddertypes::{TypeDict, morphism::MorphismInstance, parser::*},
|
||||||
|
crate::LdmcPrimMorph,
|
||||||
|
crate::c_gen::LdmcCTargetMorph,
|
||||||
|
std::collections::HashMap,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn generate_main(dict: &mut impl TypeDict, morph: MorphismInstance<LdmcPrimMorph>) -> Result<String, ()> {
|
||||||
|
let mut target = LdmcCTargetMorph::new();
|
||||||
|
let ty = morph.get_type();
|
||||||
|
match target.add_instantiation(dict, morph) {
|
||||||
|
Ok(inst) => {
|
||||||
|
let mut c_source = target.into_c_source(dict);
|
||||||
|
|
||||||
|
c_source.push_str(&format!(r#"
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
int main() {{
|
||||||
|
uint8_t bufIn[4096];
|
||||||
|
uint8_t bufOut[4096];"#));
|
||||||
|
|
||||||
|
let (src_top, src_floor) = ty.src_type.get_floor_type();
|
||||||
|
if src_floor == dict.parse_desugared("<Seq~<ValueTerminated 0> native.UInt8>").expect("").sugar(dict) {
|
||||||
|
c_source.push_str("scanf(\"%s\", bufIn);");
|
||||||
|
} else {
|
||||||
|
c_source.push_str("read(0, bufIn, sizeof(bufIn));");
|
||||||
|
}
|
||||||
|
|
||||||
|
c_source.push_str(&format!(r#"FUSE( {}, (void const*)bufIn, (void*)bufOut );"#, inst.instantiated_symbol_name(dict, &HashMap::new())));
|
||||||
|
|
||||||
|
if let Ok(ψ) = laddertypes::constraint_system::subtype_unify(
|
||||||
|
&ty.src_type,
|
||||||
|
&dict.parse_desugared("<Seq~<ValueTerminated 0> native.UInt8>").expect("").sugar(dict)
|
||||||
|
) {
|
||||||
|
c_source.push_str("printf(\"%s\\n\", bufOut);");
|
||||||
|
} else {
|
||||||
|
c_source.push_str("write(1, bufOut, sizeof(bufOut));");
|
||||||
|
}
|
||||||
|
c_source.push_str("
|
||||||
|
return 0;
|
||||||
|
}");
|
||||||
|
Ok(c_source)
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
eprintln!("failed to create morphism instatiation");
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
src/c_gen/mod.rs
Normal file
7
src/c_gen/mod.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
pub mod types;
|
||||||
|
pub mod morph;
|
||||||
|
pub mod gen_main;
|
||||||
|
|
||||||
|
pub use {
|
||||||
|
morph::target_morph::LdmcCTargetMorph
|
||||||
|
};
|
76
src/c_gen/morph/mod.rs
Normal file
76
src/c_gen/morph/mod.rs
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
pub mod target_morph;
|
||||||
|
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
c_gen::types::{
|
||||||
|
get_c_repr_arg_type,
|
||||||
|
get_c_repr_definition,
|
||||||
|
get_c_repr_type
|
||||||
|
},
|
||||||
|
morphism::LdmcPrimMorph
|
||||||
|
},
|
||||||
|
laddertypes::{TypeDict, Substitution},
|
||||||
|
};
|
||||||
|
|
||||||
|
impl LdmcPrimMorph {
|
||||||
|
pub fn instantiated_symbol_name(&self, dict: &mut impl TypeDict, σ: &impl Substitution) -> String {
|
||||||
|
let mut s = self.symbol.clone();
|
||||||
|
for (k_id,v) in self.type_args.iter() {
|
||||||
|
if let Some(val_trm) = σ.get(k_id) {
|
||||||
|
if let laddertypes::TypeID::Var(var_id) = k_id {
|
||||||
|
|
||||||
|
//if self.get_type().strip_halo().src_type.contains_var(*var_id) ||
|
||||||
|
//self.get_type().strip_halo().dst_type.contains_var(*var_id) {
|
||||||
|
|
||||||
|
let name = dict.get_varname(*var_id).unwrap();
|
||||||
|
let val_str = get_c_repr_type(dict, &val_trm);
|
||||||
|
s.push_str(&format!("_{}_{}", name, val_str));
|
||||||
|
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if let laddertypes::TypeID::Var(var_id) = k_id {
|
||||||
|
let k = dict.get_varname(*var_id).unwrap();
|
||||||
|
s.push_str(&format!("_{:?}_MISSING", k));
|
||||||
|
eprintln!("INCOMPLETE MORPHISM INSTANTIATION, missing type parameter {} ({})", k, var_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn expected_c_type_signature(&self, dict: &mut impl TypeDict,
|
||||||
|
σ: &std::collections::HashMap<laddertypes::TypeID, laddertypes::TypeTerm>
|
||||||
|
) -> String {
|
||||||
|
format!("int {} ({} const * restrict src, {} * restrict dst);",
|
||||||
|
self.instantiated_symbol_name(dict, σ),
|
||||||
|
get_c_repr_definition(dict, self.ty.src_type.clone(), true).expect("cant get c-repr type for src type"),
|
||||||
|
get_c_repr_definition(dict, self.ty.dst_type.clone(), true).expect("cant get c-repr type for dst type"))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn generate_instantiation(&self, dict: &mut impl TypeDict, σ: &impl Substitution) -> Option<String> {
|
||||||
|
let mut s = String::new();
|
||||||
|
let symbol = self.instantiated_symbol_name(dict, σ);
|
||||||
|
|
||||||
|
eprintln!("generate instantiation:");
|
||||||
|
let ty = self.ty.clone();
|
||||||
|
eprintln!("full type: {} ----> {}", ty.src_type.pretty(dict, 0), ty.dst_type.pretty(dict,0));
|
||||||
|
let ty = ty.strip_halo().apply_subst(σ);
|
||||||
|
eprintln!("stripped type: {} ----> {}", ty.src_type.pretty(dict, 0), ty.dst_type.pretty(dict,0));
|
||||||
|
|
||||||
|
let src_c_symbol = get_c_repr_arg_type(dict, &ty.src_type);
|
||||||
|
let dst_c_symbol = get_c_repr_arg_type(dict, &ty.dst_type);
|
||||||
|
|
||||||
|
s.push_str(&format!(r#"
|
||||||
|
int {} ( {} const * restrict src, {} * restrict dst ) {{
|
||||||
|
"#,
|
||||||
|
symbol, src_c_symbol, dst_c_symbol,
|
||||||
|
));
|
||||||
|
s.push_str(&self.c_source);
|
||||||
|
s.push_str(&format!(r#"
|
||||||
|
return 0;
|
||||||
|
}}
|
||||||
|
"#));
|
||||||
|
Some(s)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,86 +1,22 @@
|
||||||
use {
|
use {
|
||||||
crate::{c_gen_types::{encode_morph_type_to_symbol, encode_type_to_value, get_c_repr_arg_type,
|
crate::{
|
||||||
get_c_repr_definition, get_c_repr_type}, morphism::LdmcPrimMorph,
|
c_gen::types::{
|
||||||
struct_layout::{get_type_size, LayoutType, ObjectSize, StructLayout}},
|
encode_morph_type_to_symbol, get_c_repr_definition, get_c_repr_type, encode_type_to_value
|
||||||
chumsky::{chain::Chain, primitive::Container},
|
},
|
||||||
laddertypes::{morphism::{MorphismInstance, Morphism, MorphismType},
|
morphism::LdmcPrimMorph
|
||||||
parser::*, substitution::Substitution, unparser::*,
|
},
|
||||||
EnumVariant, StructMember, TypeTerm, TypeDict, DesugaredTypeTerm},
|
laddertypes::{
|
||||||
|
parser::*, MorphismInstance, TypeDict, TypeTerm, Morphism
|
||||||
|
},
|
||||||
std::collections::HashMap
|
std::collections::HashMap
|
||||||
};
|
};
|
||||||
|
|
||||||
impl LdmcPrimMorph {
|
|
||||||
pub fn instantiated_symbol_name(&self, dict: &mut impl TypeDict, σ: &impl Substitution) -> String {
|
|
||||||
let mut s = self.symbol.clone();
|
|
||||||
for (k_id,v) in self.type_args.iter() {
|
|
||||||
|
|
||||||
if let Some(val_trm) = σ.get(k_id) {
|
|
||||||
if let laddertypes::TypeID::Var(var_id) = k_id {
|
|
||||||
|
|
||||||
//if self.get_type().strip_halo().src_type.contains_var(*var_id) ||
|
|
||||||
//self.get_type().strip_halo().dst_type.contains_var(*var_id) {
|
|
||||||
|
|
||||||
let name = dict.get_varname(*var_id).unwrap();
|
|
||||||
let val_str = get_c_repr_type(dict, &val_trm);
|
|
||||||
s.push_str(&format!("_{}_{}", name, val_str));
|
|
||||||
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if let laddertypes::TypeID::Var(var_id) = k_id {
|
|
||||||
let k = dict.get_varname(*var_id).unwrap();
|
|
||||||
s.push_str(&format!("_{:?}_MISSING", k));
|
|
||||||
eprintln!("INCOMPLETE MORPHISM INSTANTIATION, missing type parameter {} ({})", k, var_id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn expected_c_type_signature(&self, dict: &mut impl TypeDict,
|
|
||||||
σ: &std::collections::HashMap<laddertypes::TypeID, laddertypes::TypeTerm>
|
|
||||||
) -> String {
|
|
||||||
format!("int {} ({} const * restrict src, {} * restrict dst);",
|
|
||||||
self.instantiated_symbol_name(dict, σ),
|
|
||||||
get_c_repr_definition(dict, self.ty.src_type.clone(), true).expect("cant get c-repr type for src type"),
|
|
||||||
get_c_repr_definition(dict, self.ty.dst_type.clone(), true).expect("cant get c-repr type for dst type"))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn generate_instantiation(&self, dict: &mut impl TypeDict, σ: &impl Substitution) -> Option<String> {
|
|
||||||
let mut s = String::new();
|
|
||||||
let symbol = self.instantiated_symbol_name(dict, σ);
|
|
||||||
|
|
||||||
eprintln!("generate instantiation:");
|
|
||||||
let ty = self.ty.clone();
|
|
||||||
eprintln!("full type: {} ----> {}", ty.src_type.pretty(dict, 0), ty.dst_type.pretty(dict,0));
|
|
||||||
let ty = ty.strip_halo().apply_subst(σ);
|
|
||||||
eprintln!("stripped type: {} ----> {}", ty.src_type.pretty(dict, 0), ty.dst_type.pretty(dict,0));
|
|
||||||
|
|
||||||
let src_c_symbol = get_c_repr_arg_type(dict, &ty.src_type);
|
|
||||||
let dst_c_symbol = get_c_repr_arg_type(dict, &ty.dst_type);
|
|
||||||
|
|
||||||
s.push_str(&format!(r#"
|
|
||||||
int {} ( {} const * restrict src, {} * restrict dst ) {{
|
|
||||||
"#,
|
|
||||||
symbol, src_c_symbol, dst_c_symbol,
|
|
||||||
));
|
|
||||||
s.push_str(&self.c_source);
|
|
||||||
s.push_str(&format!(r#"
|
|
||||||
return 0;
|
|
||||||
}}
|
|
||||||
"#));
|
|
||||||
Some(s)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub struct LdmcCTargetMorph {
|
pub struct LdmcCTargetMorph {
|
||||||
includes: Vec< String >,
|
includes: Vec< String >,
|
||||||
active_types: Vec< TypeTerm >,
|
active_types: Vec< TypeTerm >,
|
||||||
active_instantiations: Vec< LdmcPrimMorph >,
|
active_instantiations: Vec< LdmcPrimMorph >,
|
||||||
|
active_lenpfx_types: Vec< (TypeTerm, TypeTerm) >,
|
||||||
|
typedefs: Vec< String >,
|
||||||
macro_calls: Vec< String >
|
macro_calls: Vec< String >
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +30,8 @@ impl LdmcCTargetMorph {
|
||||||
],
|
],
|
||||||
active_instantiations: Vec::new(),
|
active_instantiations: Vec::new(),
|
||||||
active_types: Vec::new(),
|
active_types: Vec::new(),
|
||||||
|
active_lenpfx_types: Vec::new(),
|
||||||
|
typedefs: Vec::new(),
|
||||||
macro_calls: Vec::new()
|
macro_calls: Vec::new()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -101,34 +39,51 @@ impl LdmcCTargetMorph {
|
||||||
pub fn add_type(&mut self, dict: &mut impl TypeDict, ty: TypeTerm) {
|
pub fn add_type(&mut self, dict: &mut impl TypeDict, ty: TypeTerm) {
|
||||||
let ty = ty.strip();
|
let ty = ty.strip();
|
||||||
if ! self.active_types.contains(&ty) {
|
if ! self.active_types.contains(&ty) {
|
||||||
eprintln!("add type {:?}", ty);
|
eprintln!("add type {}", ty.pretty(dict,0));
|
||||||
match &ty {
|
|
||||||
TypeTerm::Seq { seq_repr, items } =>{
|
|
||||||
let item_type = items.first().unwrap().clone();
|
|
||||||
self.add_type(dict, item_type.clone());
|
|
||||||
|
|
||||||
if let Some(seq_repr) = seq_repr {
|
let (ht,ft) = ty.get_floor_type();
|
||||||
dict.add_varname("LengthType".into());
|
if ht.is_empty() {
|
||||||
if let Ok(σ) =
|
|
||||||
laddertypes::constraint_system::unify(
|
match &ft {
|
||||||
seq_repr.as_ref(),
|
TypeTerm::Seq { seq_repr, items } => {
|
||||||
&dict.parse_desugared("<LengthPrefix LengthType>").expect("").sugar(dict)
|
let item_type = items.first().unwrap().clone();
|
||||||
)
|
self.add_type(dict, item_type.clone());
|
||||||
{
|
|
||||||
let length_type = σ.get(&dict.get_typeid(&"LengthType".into()).expect("")).expect("cant get Length type");
|
if let Some(seq_repr) = seq_repr {
|
||||||
self.add_type(dict, length_type.clone());
|
dict.add_varname("LengthType".into());
|
||||||
self.macro_calls.push(
|
if let Ok(σ) =
|
||||||
format!("DEFINE_LENGTH_PREFIX_ARRAY({}, {})\n",
|
laddertypes::constraint_system::unify(
|
||||||
get_c_repr_type(dict, &length_type),
|
seq_repr.as_ref(),
|
||||||
get_c_repr_type(dict, &item_type)
|
&dict.parse_desugared("<LengthPrefix LengthType>").expect("").sugar(dict)
|
||||||
)
|
)
|
||||||
);
|
{
|
||||||
|
let length_type = σ.get(&dict.get_typeid(&"LengthType".into()).expect("")).expect("cant get Length type");
|
||||||
|
self.add_type(dict, length_type.clone());
|
||||||
|
self.macro_calls.push(
|
||||||
|
format!("DEFINE_LENGTH_PREFIX_ARRAY({}, {})\n",
|
||||||
|
get_c_repr_type(dict, &length_type),
|
||||||
|
get_c_repr_type(dict, &item_type)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
_=>{}
|
|
||||||
|
self.active_types.push(ty.clone());
|
||||||
|
if let Some(type_def) = get_c_repr_definition(dict, ft, false) {
|
||||||
|
let type_name = get_c_repr_type(dict, &ty);
|
||||||
|
self.typedefs.push(format!("typedef {} {};\n", type_def, type_name));
|
||||||
|
} else {
|
||||||
|
eprintln!("cant get c-repr type for type '{}'", ty.pretty(dict,0));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let type_name = get_c_repr_type(dict, &ty);
|
||||||
|
let type_def = get_c_repr_type(dict, &ft);
|
||||||
|
self.add_type(dict, ft);
|
||||||
|
self.typedefs.push(format!("typedef {} {};\n", type_def, type_name));
|
||||||
}
|
}
|
||||||
self.active_types.push(ty.clone());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,14 +117,10 @@ impl LdmcCTargetMorph {
|
||||||
|
|
||||||
source.push('\n');
|
source.push('\n');
|
||||||
|
|
||||||
for ty in self.active_types {
|
for typedef in self.typedefs {
|
||||||
if let Some(type_def) = get_c_repr_definition(dict, ty.clone(), false) {
|
source.push_str(&typedef);
|
||||||
let type_name = get_c_repr_type(dict, &ty);
|
|
||||||
source.push_str(&format!("typedef {} {};\n", type_def, type_name));
|
|
||||||
} else {
|
|
||||||
eprintln!("cant get c-repr type for type '{}'", ty.pretty(dict,0));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
source.push('\n');
|
source.push('\n');
|
||||||
|
|
||||||
|
|
||||||
|
@ -201,13 +152,7 @@ impl LdmcCTargetMorph {
|
||||||
//if morph_inst.get_type().strip_halo().src_type.contains_var(*var_id) ||
|
//if morph_inst.get_type().strip_halo().src_type.contains_var(*var_id) ||
|
||||||
//morph_inst.get_type().strip_halo().dst_type.contains_var(*var_id) {
|
//morph_inst.get_type().strip_halo().dst_type.contains_var(*var_id) {
|
||||||
if let Some(val) = σ.get(ty_id) {
|
if let Some(val) = σ.get(ty_id) {
|
||||||
let type_var_value =
|
let type_var_value = get_c_repr_type(dict, val);
|
||||||
if let Some(c_repr_type) = get_c_repr_definition(dict, val.clone(), true) {
|
|
||||||
c_repr_type
|
|
||||||
} else {
|
|
||||||
encode_type_to_value(dict, &val)
|
|
||||||
};
|
|
||||||
|
|
||||||
c_source.push_str(&format!(" #define {} {}\n", dict.get_typename(&ty_id).unwrap(), type_var_value));
|
c_source.push_str(&format!(" #define {} {}\n", dict.get_typename(&ty_id).unwrap(), type_var_value));
|
||||||
}
|
}
|
||||||
//}
|
//}
|
||||||
|
@ -399,47 +344,3 @@ impl LdmcCTargetMorph {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_main(dict: &mut impl TypeDict, morph: MorphismInstance<LdmcPrimMorph>) -> Result<String, ()> {
|
|
||||||
let mut target = LdmcCTargetMorph::new();
|
|
||||||
let ty = morph.get_type();
|
|
||||||
match target.add_instantiation(dict, morph) {
|
|
||||||
Ok(inst) => {
|
|
||||||
let mut c_source = target.into_c_source(dict);
|
|
||||||
|
|
||||||
c_source.push_str(&format!(r#"
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int main() {{
|
|
||||||
uint8_t bufIn[4096];
|
|
||||||
uint8_t bufOut[4096];"#));
|
|
||||||
|
|
||||||
let (src_top, src_floor) = ty.src_type.get_floor_type();
|
|
||||||
if src_floor == dict.parse_desugared("<Seq~<ValueTerminated 0> native.UInt8>").expect("").sugar(dict) {
|
|
||||||
c_source.push_str("scanf(\"%s\", bufIn);");
|
|
||||||
} else {
|
|
||||||
c_source.push_str("read(0, bufIn, sizeof(bufIn));");
|
|
||||||
}
|
|
||||||
|
|
||||||
c_source.push_str(&format!(r#"FUSE( {}, (void const*)bufIn, (void*)bufOut );"#, inst.instantiated_symbol_name(dict, &HashMap::new())));
|
|
||||||
|
|
||||||
if let Ok(ψ) = laddertypes::constraint_system::subtype_unify(
|
|
||||||
&ty.src_type,
|
|
||||||
&dict.parse_desugared("<Seq~<ValueTerminated 0> native.UInt8>").expect("").sugar(dict)
|
|
||||||
) {
|
|
||||||
c_source.push_str("printf(\"%s\\n\", bufOut);");
|
|
||||||
} else {
|
|
||||||
c_source.push_str("write(1, bufOut, sizeof(bufOut));");
|
|
||||||
}
|
|
||||||
c_source.push_str("
|
|
||||||
return 0;
|
|
||||||
}");
|
|
||||||
|
|
||||||
Ok(c_source)
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
eprintln!("failed to create morphism instatiation");
|
|
||||||
Err(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,9 +1,9 @@
|
||||||
use {
|
use {
|
||||||
crate::{morphism::LdmcPrimMorph, struct_layout::{get_type_size, LayoutType, ObjectSize, StructLayout}},
|
crate::struct_layout::LayoutType,
|
||||||
chumsky::chain::Chain, laddertypes::{morphism::{MorphismInstance, MorphismType},
|
chumsky::chain::Chain, laddertypes::{morphism::MorphismType,
|
||||||
parser::*,
|
parser::*,
|
||||||
substitution::Substitution,
|
substitution::Substitution,
|
||||||
unparser::*, EnumVariant, StructMember, TypeTerm, TypeDict, DesugaredTypeTerm}, std::thread::yield_now
|
unparser::*, EnumVariant, StructMember, TypeTerm, TypeDict}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -87,6 +87,16 @@ pub fn get_c_repr_definition(dict: &mut impl TypeDict, t: TypeTerm, skip_pointer
|
||||||
Some(format!("{} *", item_c_type))
|
Some(format!("{} *", item_c_type))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if let Ok((ψ, σ)) = laddertypes::constraint_system::subtype_unify(
|
||||||
|
seq_repr.as_ref(),
|
||||||
|
&dict.parse_desugared("MsbCont").expect("parse template type").sugar(dict)
|
||||||
|
) {
|
||||||
|
if skip_pointer {
|
||||||
|
Some(item_c_type)
|
||||||
|
} else {
|
||||||
|
Some(format!("{} *", item_c_type))
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
eprintln!("can't get C-repr for sequence type `{}`!", seq_repr.pretty(dict, 0));
|
eprintln!("can't get C-repr for sequence type `{}`!", seq_repr.pretty(dict, 0));
|
||||||
None
|
None
|
||||||
|
@ -219,6 +229,12 @@ pub fn get_c_repr_arg_type(dict: &mut impl TypeDict, t: &laddertypes::TypeTerm)-
|
||||||
) {
|
) {
|
||||||
return get_c_repr_type(dict, &items[0].clone().strip().get_floor_type().1);
|
return get_c_repr_type(dict, &items[0].clone().strip().get_floor_type().1);
|
||||||
}
|
}
|
||||||
|
else if let Ok(ψ) = laddertypes::constraint_system::subtype_unify(
|
||||||
|
seq_repr,
|
||||||
|
&dict.parse_desugared("MsbCont").expect("").sugar(dict)
|
||||||
|
) {
|
||||||
|
return get_c_repr_type(dict, &items[0].clone().strip().get_floor_type().1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
60
src/main.rs
60
src/main.rs
|
@ -3,17 +3,21 @@
|
||||||
mod morphism;
|
mod morphism;
|
||||||
mod parser;
|
mod parser;
|
||||||
mod c_gen;
|
mod c_gen;
|
||||||
mod c_gen_types;
|
|
||||||
mod struct_layout;
|
mod struct_layout;
|
||||||
|
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
morphism::LdmcPrimMorph,
|
morphism::LdmcPrimMorph,
|
||||||
parser::morphism_base_parser,
|
parser::morphism_base_parser,
|
||||||
}, ariadne::{Color, Label, Report, ReportKind, Source}, c_gen::LdmcCTargetMorph, chumsky::prelude::*, laddertypes::{
|
},
|
||||||
morphism_path::ShortestPathProblem, morphism::{MorphismInstance, Morphism, MorphismType},
|
ariadne::{Color, Label, Report, ReportKind, Source},
|
||||||
parser::ParseLadderType, unparser::*, BimapTypeDict, TypeTerm, TypeDict
|
chumsky::prelude::*,
|
||||||
}, std::{collections::HashMap, sync::{Arc, RwLock}}, tiny_ansi::TinyAnsi
|
laddertypes::{
|
||||||
|
morphism::MorphismType,
|
||||||
|
parser::ParseLadderType, BimapTypeDict
|
||||||
|
},
|
||||||
|
std::{sync::{Arc, RwLock}},
|
||||||
|
tiny_ansi::TinyAnsi
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -26,7 +30,7 @@ fn main() {
|
||||||
let dst_type_arg = args.next().expect("dst type expected");
|
let dst_type_arg = args.next().expect("dst type expected");
|
||||||
|
|
||||||
for mb_path in args {
|
for mb_path in args {
|
||||||
let src = std::fs::read_to_string(mb_path.clone()).expect("read");
|
let src = std::fs::read_to_string(mb_path.clone()).expect("failed to read morphism base");
|
||||||
let result = morphism_base_parser(type_dict.clone()).parse(src.clone());
|
let result = morphism_base_parser(type_dict.clone()).parse(src.clone());
|
||||||
match result {
|
match result {
|
||||||
Ok((includes, morphisms)) => {
|
Ok((includes, morphisms)) => {
|
||||||
|
@ -53,50 +57,10 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut γ = HashMap::new();
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"Byte"),
|
|
||||||
type_dict.parse("<Seq~<StaticLength 8> Bit>").expect("parse")
|
|
||||||
.apply_subst(&γ)
|
|
||||||
.clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.UInt8"),
|
|
||||||
type_dict.parse("ℤ_2^8 ~ <PosInt 2 BigEndian> ~ <Seq~<StaticLength 8> <Digit 2> ~ Bit>").expect("parse")
|
|
||||||
.apply_subst(&γ)
|
|
||||||
.clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.UInt16"),
|
|
||||||
type_dict.parse("ℤ_2^16 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 2> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
|
||||||
.apply_subst(&γ)
|
|
||||||
.clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.UInt32"),
|
|
||||||
type_dict.parse("ℤ_2^32 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 4> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
|
||||||
.apply_subst(&γ).clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.UInt64"),
|
|
||||||
type_dict.parse("ℤ_2^64 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 8> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
|
||||||
.apply_subst(&γ).clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.Float32"),
|
|
||||||
type_dict.parse("ℝ ~ IEEE-754.Float32 ~ <Seq~<StaticLength 4> Byte>").expect("parse")
|
|
||||||
.apply_subst(&γ).clone()
|
|
||||||
);
|
|
||||||
γ.insert(
|
|
||||||
type_dict.get_typeid_creat(&"x86.Float64"),
|
|
||||||
type_dict.parse("ℝ ~ IEEE-754.Float64 ~ <Seq~<StaticLength 4> Byte>").expect("parse")
|
|
||||||
.apply_subst(&γ).clone()
|
|
||||||
);
|
|
||||||
|
|
||||||
let src_type = type_dict.parse( src_type_arg.as_str() ).expect("");
|
let src_type = type_dict.parse( src_type_arg.as_str() ).expect("");
|
||||||
let dst_type = type_dict.parse( dst_type_arg.as_str() ).expect("");
|
let dst_type = type_dict.parse( dst_type_arg.as_str() ).expect("");
|
||||||
|
|
||||||
let ty = MorphismType{ src_type: src_type, dst_type };
|
let ty = MorphismType{ src_type, dst_type };
|
||||||
let m = morphism_base.get_morphism_instance( &ty ).expect("failed to find morphism");
|
let m = morphism_base.get_morphism_instance( &ty ).expect("failed to find morphism");
|
||||||
println!("{}", crate::c_gen::generate_main(&mut type_dict, m).expect("failed to generate main function"));
|
println!("{}", crate::c_gen::gen_main::generate_main(&mut type_dict, m).expect("failed to generate main function"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
use laddertypes::{morphism_path::ShortestPathProblem, morphism::{Morphism, MorphismType}, StructMember};
|
use laddertypes::morphism::{Morphism, MorphismType};
|
||||||
use crate::{c_gen_types::get_c_repr_type, struct_layout::StructLayout};
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||||
pub struct LdmcPrimMorph {
|
pub struct LdmcPrimMorph {
|
||||||
|
|
|
@ -19,7 +19,7 @@ pub fn morphism_base_parser(
|
||||||
just("```")
|
just("```")
|
||||||
.then(take_until(just("```")))
|
.then(take_until(just("```")))
|
||||||
.map(
|
.map(
|
||||||
move |(a, (b, c))| {
|
move |(_a, (b, _c))| {
|
||||||
b.iter().collect()
|
b.iter().collect()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
43
src/platform/x86.rs
Normal file
43
src/platform/x86.rs
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
pub fn example_substitution() {
|
||||||
|
let mut γ = HashMap::new();
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"Byte"),
|
||||||
|
type_dict.parse("<Seq~<StaticLength 8> Bit>").expect("parse")
|
||||||
|
.apply_subst(&γ)
|
||||||
|
.clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.UInt8"),
|
||||||
|
type_dict.parse("ℤ_2^8 ~ <PosInt 2 LittleEndian> ~ <Seq~<StaticLength 8> <Digit 2> ~ Bit>").expect("parse")
|
||||||
|
.apply_subst(&γ)
|
||||||
|
.clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.UInt16"),
|
||||||
|
type_dict.parse("ℤ_2^16 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 2> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
||||||
|
.apply_subst(&γ)
|
||||||
|
.clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.UInt32"),
|
||||||
|
type_dict.parse("ℤ_2^32 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 4> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
||||||
|
.apply_subst(&γ).clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.UInt64"),
|
||||||
|
type_dict.parse("ℤ_2^64 ~ <PosInt 256 LittleEndian> ~ <Seq~<StaticLength 8> <Digit 256> ~ x86.UInt8 >").expect("parse")
|
||||||
|
.apply_subst(&γ).clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.Float32"),
|
||||||
|
type_dict.parse("ℝ ~ IEEE-754.Float32 ~ <Seq~<StaticLength 4> Byte>").expect("parse")
|
||||||
|
.apply_subst(&γ).clone()
|
||||||
|
);
|
||||||
|
γ.insert(
|
||||||
|
type_dict.get_typeid_creat(&"x86.Float64"),
|
||||||
|
type_dict.parse("ℝ ~ IEEE-754.Float64 ~ <Seq~<StaticLength 4> Byte>").expect("parse")
|
||||||
|
.apply_subst(&γ).clone()
|
||||||
|
);
|
||||||
|
}
|
|
@ -1,7 +1,6 @@
|
||||||
|
|
||||||
use std::ops::Deref;
|
|
||||||
|
|
||||||
use laddertypes::{parser::*, unparser::*, StructMember, TypeTerm, TypeDict, DesugaredTypeTerm};
|
use laddertypes::{parser::*, StructMember, TypeTerm, TypeDict, DesugaredTypeTerm};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug)]
|
#[derive(Clone, Copy, Debug)]
|
||||||
pub enum ObjectSize {
|
pub enum ObjectSize {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue