Get inner arrays working
This commit is contained in:
parent
a62f9db422
commit
c723ba7b4a
@ -392,7 +392,6 @@ impl Builder {
|
|||||||
Instr::Alloca(_, _) => Ok(()),
|
Instr::Alloca(_, _) => Ok(()),
|
||||||
Instr::Load(ptr, load_ty) => {
|
Instr::Load(ptr, load_ty) => {
|
||||||
let ptr_ty = ptr.get_type(&self)?;
|
let ptr_ty = ptr.get_type(&self)?;
|
||||||
dbg!(&ptr_ty, &load_ty);
|
|
||||||
if let Type::Ptr(ptr_ty_inner) = ptr_ty {
|
if let Type::Ptr(ptr_ty_inner) = ptr_ty {
|
||||||
if *ptr_ty_inner == load_ty {
|
if *ptr_ty_inner == load_ty {
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -414,11 +413,9 @@ impl Builder {
|
|||||||
Instr::ArrayAlloca(_, _) => Ok(()),
|
Instr::ArrayAlloca(_, _) => Ok(()),
|
||||||
Instr::GetElemPtr(ptr_val, _) => {
|
Instr::GetElemPtr(ptr_val, _) => {
|
||||||
let ptr_ty = ptr_val.get_type(&self)?;
|
let ptr_ty = ptr_val.get_type(&self)?;
|
||||||
|
dbg!(&ptr_ty);
|
||||||
match ptr_ty {
|
match ptr_ty {
|
||||||
Type::Ptr(inner) => match *inner {
|
Type::Ptr(_) => Ok(()),
|
||||||
Type::Array(_, _) => Ok(()),
|
|
||||||
_ => Err(()),
|
|
||||||
},
|
|
||||||
_ => Err(()),
|
_ => Err(()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -411,10 +411,10 @@ impl InstructionValue {
|
|||||||
let Type::Ptr(inner_ty) = instr_ty else {
|
let Type::Ptr(inner_ty) = instr_ty else {
|
||||||
panic!("GetStructElemPtr on non-pointer! ({:?})", &instr_ty)
|
panic!("GetStructElemPtr on non-pointer! ({:?})", &instr_ty)
|
||||||
};
|
};
|
||||||
let Type::Array(elem_ty, _) = *inner_ty else {
|
match *inner_ty {
|
||||||
panic!("GetStructElemPtr on non-struct! ({:?})", &inner_ty)
|
Type::Array(elem_ty, _) => Ok(Type::Ptr(Box::new(*elem_ty.clone()))),
|
||||||
};
|
_ => Ok(*inner_ty),
|
||||||
Ok(Type::Ptr(Box::new(*elem_ty.clone())))
|
}
|
||||||
}
|
}
|
||||||
GetStructElemPtr(instr, idx) => {
|
GetStructElemPtr(instr, idx) => {
|
||||||
let instr_ty = instr.get_type(builder)?;
|
let instr_ty = instr.get_type(builder)?;
|
||||||
|
@ -645,7 +645,7 @@ impl mir::Expression {
|
|||||||
}
|
}
|
||||||
mir::ExprKind::Indexed(expression, val_t, idx_expr) => {
|
mir::ExprKind::Indexed(expression, val_t, idx_expr) => {
|
||||||
let StackValue(kind, array_ty) = expression
|
let StackValue(kind, array_ty) = expression
|
||||||
.codegen(scope, &state.load(true))
|
.codegen(scope, &state.load(false))
|
||||||
.expect("array returned none!");
|
.expect("array returned none!");
|
||||||
let idx = idx_expr
|
let idx = idx_expr
|
||||||
.codegen(scope, &state.load(true))
|
.codegen(scope, &state.load(true))
|
||||||
@ -657,6 +657,7 @@ impl mir::Expression {
|
|||||||
.build(Instr::Constant(ConstValue::U32(0)))
|
.build(Instr::Constant(ConstValue::U32(0)))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
|
dbg!(&self, &val_t);
|
||||||
let ptr = scope
|
let ptr = scope
|
||||||
.block
|
.block
|
||||||
.build(Instr::GetElemPtr(kind.instr(), vec![first, idx]))
|
.build(Instr::GetElemPtr(kind.instr(), vec![first, idx]))
|
||||||
@ -667,14 +668,18 @@ impl mir::Expression {
|
|||||||
panic!();
|
panic!();
|
||||||
};
|
};
|
||||||
|
|
||||||
let elem_value = scope
|
let elem_value = if state.should_load {
|
||||||
.block
|
scope
|
||||||
.build(Instr::Load(
|
.block
|
||||||
ptr,
|
.build(Instr::Load(
|
||||||
val_t.get_type(scope.type_values, scope.types),
|
ptr,
|
||||||
))
|
val_t.get_type(scope.type_values, scope.types),
|
||||||
.unwrap()
|
))
|
||||||
.maybe_location(&mut scope.block, location);
|
.unwrap()
|
||||||
|
.maybe_location(&mut scope.block, location)
|
||||||
|
} else {
|
||||||
|
ptr
|
||||||
|
};
|
||||||
|
|
||||||
Some(StackValue(kind.derive(elem_value), *elem_ty))
|
Some(StackValue(kind.derive(elem_value), *elem_ty))
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Arithmetic, function calls and imports!
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
fn main() -> u16 {
|
fn main() -> u16 {
|
||||||
let a = [ 5, 3, 2 ];
|
let a = [[ 5, 3, 2 ]];
|
||||||
|
|
||||||
return a[1];
|
return a[0][1];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user