Get borrow to work, somewhat
This commit is contained in:
parent
c8d6566489
commit
7b11951209
@ -18,7 +18,7 @@ use crate::{
|
|||||||
error_raporting::ModuleMap,
|
error_raporting::ModuleMap,
|
||||||
lexer::{FullToken, Position},
|
lexer::{FullToken, Position},
|
||||||
mir::{
|
mir::{
|
||||||
self, Metadata, NamedVariableRef, StructField, StructType, TypeDefinition,
|
self, ExprKind, Metadata, NamedVariableRef, StructField, StructType, TypeDefinition,
|
||||||
TypeDefinitionKind, TypeKind, VagueLiteral,
|
TypeDefinitionKind, TypeKind, VagueLiteral,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -479,33 +479,37 @@ impl mir::Statement {
|
|||||||
mir::StmtKind::Let(NamedVariableRef(ty, name, _), mutable, expression) => {
|
mir::StmtKind::Let(NamedVariableRef(ty, name, _), mutable, expression) => {
|
||||||
let value = expression.codegen(scope, &state).unwrap();
|
let value = expression.codegen(scope, &state).unwrap();
|
||||||
|
|
||||||
let alloca = scope
|
let stack_value = if let mir::Expression(ExprKind::Borrow(_), _) = expression {
|
||||||
.block
|
value
|
||||||
.build(
|
} else {
|
||||||
name,
|
let alloca = scope
|
||||||
Instr::Alloca(ty.get_type(scope.type_values, scope.types)),
|
.block
|
||||||
)
|
.build(
|
||||||
.unwrap()
|
name,
|
||||||
.maybe_location(&mut scope.block, location);
|
Instr::Alloca(ty.get_type(scope.type_values, scope.types)),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
let store = scope
|
scope
|
||||||
.block
|
.block
|
||||||
.build(
|
.build(
|
||||||
format!("{}.store", name),
|
format!("{}.store", name),
|
||||||
Instr::Store(alloca, value.instr()),
|
Instr::Store(alloca, value.instr()),
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
|
|
||||||
let stack_value = match mutable {
|
StackValue(
|
||||||
true => StackValueKind::Mutable(alloca),
|
match mutable {
|
||||||
false => StackValueKind::Immutable(alloca),
|
true => StackValueKind::Mutable(alloca),
|
||||||
|
false => StackValueKind::Immutable(alloca),
|
||||||
|
},
|
||||||
|
TypeKind::Ptr(Box::new(value.clone().1)),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
scope.stack_values.insert(
|
scope.stack_values.insert(name.clone(), stack_value.clone());
|
||||||
name.clone(),
|
|
||||||
StackValue(stack_value, TypeKind::Ptr(Box::new(value.clone().1))),
|
|
||||||
);
|
|
||||||
if let Some(debug) = &scope.debug {
|
if let Some(debug) = &scope.debug {
|
||||||
let location = self.1.into_debug(scope.tokens).unwrap();
|
let location = self.1.into_debug(scope.tokens).unwrap();
|
||||||
let var = debug.info.metadata(
|
let var = debug.info.metadata(
|
||||||
@ -518,15 +522,15 @@ impl mir::Statement {
|
|||||||
flags: DwarfFlags,
|
flags: DwarfFlags,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
store.add_record(
|
// value.instr().add_record(
|
||||||
&mut scope.block,
|
// &mut scope.block,
|
||||||
InstructionDebugRecordData {
|
// InstructionDebugRecordData {
|
||||||
variable: var,
|
// variable: var,
|
||||||
location,
|
// location,
|
||||||
kind: DebugRecordKind::Declare(value.instr()),
|
// kind: DebugRecordKind::Declare(value.instr()),
|
||||||
scope: debug.scope,
|
// scope: debug.scope,
|
||||||
},
|
// },
|
||||||
);
|
// );
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
@ -934,8 +938,47 @@ impl mir::Expression {
|
|||||||
TypeKind::CustomType(name.clone()),
|
TypeKind::CustomType(name.clone()),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
mir::ExprKind::Borrow(named_variable_ref) => todo!(),
|
mir::ExprKind::Borrow(varref) => {
|
||||||
mir::ExprKind::Deref(named_variable_ref) => todo!(),
|
varref.0.known().expect("variable type unknown");
|
||||||
|
let v = scope
|
||||||
|
.stack_values
|
||||||
|
.get(&varref.1)
|
||||||
|
.expect("Variable reference not found?!");
|
||||||
|
Some(v.clone())
|
||||||
|
}
|
||||||
|
mir::ExprKind::Deref(varref) => {
|
||||||
|
varref.0.known().expect("variable type unknown");
|
||||||
|
let v = scope
|
||||||
|
.stack_values
|
||||||
|
.get(&varref.1)
|
||||||
|
.expect("Variable reference not found?!");
|
||||||
|
|
||||||
|
Some({
|
||||||
|
if state.should_load {
|
||||||
|
if let TypeKind::Ptr(inner) = &v.1 {
|
||||||
|
StackValue(
|
||||||
|
v.0.derive(
|
||||||
|
scope
|
||||||
|
.block
|
||||||
|
.build(
|
||||||
|
format!("{}.load2", varref.1),
|
||||||
|
Instr::Load(
|
||||||
|
v.instr(),
|
||||||
|
inner.get_type(scope.type_values, scope.types),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
|
),
|
||||||
|
*inner.clone(),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
panic!("Variable was not a pointer?!?")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
v.clone()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
};
|
};
|
||||||
if let Some(value) = &value {
|
if let Some(value) = &value {
|
||||||
value.instr().maybe_location(&mut scope.block, location);
|
value.instr().maybe_location(&mut scope.block, location);
|
||||||
@ -1159,18 +1202,20 @@ impl TypeKind {
|
|||||||
),
|
),
|
||||||
size_bits: self.size_of(),
|
size_bits: self.size_of(),
|
||||||
}),
|
}),
|
||||||
TypeKind::Ptr(inner) => DebugTypeData::Pointer(DebugPointerType {
|
TypeKind::Ptr(inner) | TypeKind::Borrow(inner) => {
|
||||||
name,
|
DebugTypeData::Pointer(DebugPointerType {
|
||||||
pointee: inner.get_debug_type_hard(
|
name,
|
||||||
scope,
|
pointee: inner.get_debug_type_hard(
|
||||||
debug_info,
|
scope,
|
||||||
debug_types,
|
debug_info,
|
||||||
type_values,
|
debug_types,
|
||||||
types,
|
type_values,
|
||||||
tokens,
|
types,
|
||||||
),
|
tokens,
|
||||||
size_bits: self.size_of(),
|
),
|
||||||
}),
|
size_bits: self.size_of(),
|
||||||
|
})
|
||||||
|
}
|
||||||
TypeKind::Array(elem_ty, len) => {
|
TypeKind::Array(elem_ty, len) => {
|
||||||
let elem_ty = elem_ty.clone().get_debug_type_hard(
|
let elem_ty = elem_ty.clone().get_debug_type_hard(
|
||||||
scope,
|
scope,
|
||||||
|
@ -7,5 +7,5 @@ fn main() -> u32 {
|
|||||||
let mut borrow = &value;
|
let mut borrow = &value;
|
||||||
*borrow = 17;
|
*borrow = 17;
|
||||||
|
|
||||||
return *borrow;
|
return value;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user