mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 22:34:45 +00:00
add dict capacity to its stack size
This commit is contained in:
parent
ee21f86f8f
commit
ac78ed9dfc
2 changed files with 18 additions and 30 deletions
|
@ -336,35 +336,13 @@ fn zig_dict_to_struct<'a, 'ctx, 'env>(
|
|||
env: &Env<'a, 'ctx, 'env>,
|
||||
zig_dict: StructValue<'ctx>,
|
||||
) -> StructValue<'ctx> {
|
||||
let builder = env.builder;
|
||||
|
||||
// get the RocStr type defined by zig
|
||||
let zig_str_type = env.module.get_struct_type("dict.RocDict").unwrap();
|
||||
|
||||
let ret_type = BasicTypeEnum::StructType(collection(env.context, env.ptr_bytes));
|
||||
|
||||
// a roundabout way of casting (LLVM does not accept a standard bitcast)
|
||||
let allocation = builder.build_alloca(zig_str_type, "zig_result");
|
||||
|
||||
builder.build_store(allocation, zig_dict);
|
||||
|
||||
let ptr3 = builder
|
||||
.build_bitcast(
|
||||
allocation,
|
||||
env.context.i128_type().ptr_type(AddressSpace::Generic),
|
||||
"cast",
|
||||
)
|
||||
.into_pointer_value();
|
||||
|
||||
let ptr4 = builder
|
||||
.build_bitcast(
|
||||
ptr3,
|
||||
ret_type.into_struct_type().ptr_type(AddressSpace::Generic),
|
||||
"cast",
|
||||
)
|
||||
.into_pointer_value();
|
||||
|
||||
builder.build_load(ptr4, "load").into_struct_value()
|
||||
complex_bitcast(
|
||||
env.builder,
|
||||
zig_dict.into(),
|
||||
crate::llvm::convert::dict(env.context, env.ptr_bytes).into(),
|
||||
"to_zig_dict",
|
||||
)
|
||||
.into_struct_value()
|
||||
}
|
||||
|
||||
fn struct_to_zig_dict<'a, 'ctx, 'env>(
|
||||
|
|
|
@ -185,7 +185,7 @@ pub fn basic_type_from_builtin<'ctx>(
|
|||
Float64 => context.f64_type().as_basic_type_enum(),
|
||||
Float32 => context.f32_type().as_basic_type_enum(),
|
||||
Float16 => context.f16_type().as_basic_type_enum(),
|
||||
Dict(_, _) | EmptyDict => collection(context, ptr_bytes).into(),
|
||||
Dict(_, _) | EmptyDict => dict(context, ptr_bytes).into(),
|
||||
Set(_) | EmptySet => panic!("TODO layout_to_basic_type for Builtin::Set"),
|
||||
List(_, _) | Str | EmptyStr => collection(context, ptr_bytes).into(),
|
||||
EmptyList => BasicTypeEnum::StructType(collection(context, ptr_bytes)),
|
||||
|
@ -260,6 +260,16 @@ pub fn collection(ctx: &Context, ptr_bytes: u32) -> StructType<'_> {
|
|||
ctx.struct_type(&[u8_ptr.into(), usize_type.into()], false)
|
||||
}
|
||||
|
||||
pub fn dict(ctx: &Context, ptr_bytes: u32) -> StructType<'_> {
|
||||
let usize_type = ptr_int(ctx, ptr_bytes);
|
||||
let u8_ptr = ctx.i8_type().ptr_type(AddressSpace::Generic);
|
||||
|
||||
ctx.struct_type(
|
||||
&[u8_ptr.into(), usize_type.into(), usize_type.into()],
|
||||
false,
|
||||
)
|
||||
}
|
||||
|
||||
pub fn ptr_int(ctx: &Context, ptr_bytes: u32) -> IntType<'_> {
|
||||
match ptr_bytes {
|
||||
1 => ctx.i8_type(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue