Fix castfromData in record access cases
This commit is contained in:
		
							parent
							
								
									00d1927dad
								
							
						
					
					
						commit
						41b941e0e3
					
				| 
						 | 
				
			
			@ -901,7 +901,7 @@ impl<'a> CodeGenerator<'a> {
 | 
			
		|||
 | 
			
		||||
        // Cast value to or from data so we don't have to worry from this point onward
 | 
			
		||||
        if props.value_type.is_data() && props.kind.is_expect() && !tipo.is_data() {
 | 
			
		||||
            value = AirTree::cast_from_data(value, tipo.clone(), props.otherwise.clone());
 | 
			
		||||
            value = AirTree::cast_from_data(value, tipo.clone(), props.otherwise.clone(), true);
 | 
			
		||||
        } else if !props.value_type.is_data() && tipo.is_data() {
 | 
			
		||||
            value = AirTree::cast_to_data(value, props.value_type.clone());
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1648,6 +1648,7 @@ impl<'a> CodeGenerator<'a> {
 | 
			
		|||
                            AirTree::local_var(&item_name, data()),
 | 
			
		||||
                            inner_list_type.clone(),
 | 
			
		||||
                            otherwise.clone(),
 | 
			
		||||
                            true,
 | 
			
		||||
                        ),
 | 
			
		||||
                        defined_data_types,
 | 
			
		||||
                        location,
 | 
			
		||||
| 
						 | 
				
			
			@ -4766,11 +4767,20 @@ impl<'a> CodeGenerator<'a> {
 | 
			
		|||
 | 
			
		||||
                Some(term)
 | 
			
		||||
            }
 | 
			
		||||
            Air::CastFromData { tipo, .. } => {
 | 
			
		||||
            Air::CastFromData { tipo, full_cast } => {
 | 
			
		||||
                let mut term = arg_stack.pop().unwrap();
 | 
			
		||||
                let otherwise = arg_stack.pop().unwrap();
 | 
			
		||||
 | 
			
		||||
                term = convert_data_to_type(term, &tipo, otherwise);
 | 
			
		||||
                let otherwise = if full_cast {
 | 
			
		||||
                    arg_stack.pop().unwrap()
 | 
			
		||||
                } else {
 | 
			
		||||
                    Term::Error
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                term = if full_cast {
 | 
			
		||||
                    convert_data_to_type(term, &tipo, otherwise)
 | 
			
		||||
                } else {
 | 
			
		||||
                    known_data_to_type(term, &tipo)
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
                if extract_constant(&term).is_some() {
 | 
			
		||||
                    let mut program: Program<Name> = Program {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,6 +102,7 @@ pub enum Air {
 | 
			
		|||
    },
 | 
			
		||||
    CastFromData {
 | 
			
		||||
        tipo: Rc<Type>,
 | 
			
		||||
        full_cast: bool,
 | 
			
		||||
    },
 | 
			
		||||
    CastToData {
 | 
			
		||||
        tipo: Rc<Type>,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -298,6 +298,7 @@ pub enum AirTree {
 | 
			
		|||
        tipo: Rc<Type>,
 | 
			
		||||
        value: Box<AirTree>,
 | 
			
		||||
        otherwise: Box<AirTree>,
 | 
			
		||||
        full_cast: bool,
 | 
			
		||||
    },
 | 
			
		||||
    CastToData {
 | 
			
		||||
        tipo: Rc<Type>,
 | 
			
		||||
| 
						 | 
				
			
			@ -566,11 +567,17 @@ impl AirTree {
 | 
			
		|||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn cast_from_data(value: AirTree, tipo: Rc<Type>, otherwise: AirTree) -> AirTree {
 | 
			
		||||
    pub fn cast_from_data(
 | 
			
		||||
        value: AirTree,
 | 
			
		||||
        tipo: Rc<Type>,
 | 
			
		||||
        otherwise: AirTree,
 | 
			
		||||
        full_cast: bool,
 | 
			
		||||
    ) -> AirTree {
 | 
			
		||||
        AirTree::CastFromData {
 | 
			
		||||
            tipo,
 | 
			
		||||
            value: value.into(),
 | 
			
		||||
            otherwise: otherwise.into(),
 | 
			
		||||
            full_cast,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -837,6 +844,7 @@ impl AirTree {
 | 
			
		|||
            ),
 | 
			
		||||
            tipo.clone(),
 | 
			
		||||
            AirTree::error(void(), false),
 | 
			
		||||
            false,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -942,6 +950,7 @@ impl AirTree {
 | 
			
		|||
            ),
 | 
			
		||||
            tipo.clone(),
 | 
			
		||||
            AirTree::error(void(), false),
 | 
			
		||||
            false,
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1406,12 +1415,18 @@ impl AirTree {
 | 
			
		|||
                tipo,
 | 
			
		||||
                value,
 | 
			
		||||
                otherwise,
 | 
			
		||||
                full_cast,
 | 
			
		||||
            } => {
 | 
			
		||||
                air_vec.push(Air::CastFromData { tipo: tipo.clone() });
 | 
			
		||||
                air_vec.push(Air::CastFromData {
 | 
			
		||||
                    tipo: tipo.clone(),
 | 
			
		||||
                    full_cast: *full_cast,
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                value.create_air_vec(air_vec);
 | 
			
		||||
                if *full_cast {
 | 
			
		||||
                    otherwise.create_air_vec(air_vec);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            AirTree::CastToData { tipo, value } => {
 | 
			
		||||
                air_vec.push(Air::CastToData { tipo: tipo.clone() });
 | 
			
		||||
                value.create_air_vec(air_vec);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue