mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 21:08:36 +00:00
Added ArrayInfo, NullableInfo, PromiseInfo generation
This commit is contained in:
parent
09d7033d1d
commit
182a9fad2d
@ -6366,7 +6366,7 @@ static void define_builtin_compile_vars(CodeGen *g) {
|
||||
"};\n"
|
||||
"\n"
|
||||
"pub const ArrayInfo = struct {\n"
|
||||
" len: u64,\n"
|
||||
" len: usize,\n"
|
||||
" child: &TypeInfo,\n"
|
||||
"};\n"
|
||||
"\n"
|
||||
|
||||
145
src/ir.cpp
145
src/ir.cpp
@ -15875,6 +15875,151 @@ static ConstExprValue *ir_make_type_info_value(IrAnalyze *ira, ConstExprValue *p
|
||||
fields[3].data.x_ptr.data.ref.pointee = union_val;
|
||||
return payload;
|
||||
}
|
||||
case TypeTableEntryIdArray:
|
||||
{
|
||||
ConstExprValue *payload = create_const_vals(1);
|
||||
payload->special = ConstValSpecialStatic;
|
||||
|
||||
ConstExprValue *pointer_info_type = get_builtin_value(ira->codegen, "ArrayInfo");
|
||||
assert(pointer_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
payload->type = pointer_info_type->data.x_type;
|
||||
|
||||
ConstExprValue *fields = create_const_vals(2);
|
||||
payload->data.x_struct.fields = fields;
|
||||
|
||||
if (parent->type->id == TypeTableEntryIdStruct)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdStruct;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else if (parent->type->id == TypeTableEntryIdUnion)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdUnion;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdNone;
|
||||
}
|
||||
// len: usize
|
||||
fields[0].special = ConstValSpecialStatic;
|
||||
fields[0].type = ira->codegen->builtin_types.entry_usize;
|
||||
bigint_init_unsigned(&fields[0].data.x_bigint, type_entry->data.array.len);
|
||||
// child: &TypeInfo
|
||||
ConstExprValue *type_info_type = get_builtin_value(ira->codegen, "TypeInfo");
|
||||
assert(type_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
fields[1].special = ConstValSpecialStatic;
|
||||
fields[1].type = get_pointer_to_type(ira->codegen, type_info_type->data.x_type, false);
|
||||
fields[1].data.x_ptr.special = ConstPtrSpecialRef;
|
||||
fields[1].data.x_ptr.mut = ConstPtrMutComptimeVar;
|
||||
ConstExprValue *union_val = create_const_vals(1);
|
||||
union_val->special = ConstValSpecialStatic;
|
||||
union_val->type = type_info_type->data.x_type;
|
||||
bigint_init_unsigned(&union_val->data.x_union.tag, type_id_index(type_entry->data.array.child_type->id));
|
||||
union_val->data.x_union.payload = ir_make_type_info_value(ira, union_val, type_entry->data.array.child_type);
|
||||
fields[1].data.x_ptr.data.ref.pointee = union_val;
|
||||
return payload;
|
||||
}
|
||||
case TypeTableEntryIdMaybe:
|
||||
{
|
||||
ConstExprValue *payload = create_const_vals(1);
|
||||
payload->special = ConstValSpecialStatic;
|
||||
|
||||
ConstExprValue *pointer_info_type = get_builtin_value(ira->codegen, "NullableInfo");
|
||||
assert(pointer_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
payload->type = pointer_info_type->data.x_type;
|
||||
|
||||
ConstExprValue *fields = create_const_vals(1);
|
||||
payload->data.x_struct.fields = fields;
|
||||
|
||||
if (parent->type->id == TypeTableEntryIdStruct)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdStruct;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else if (parent->type->id == TypeTableEntryIdUnion)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdUnion;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdNone;
|
||||
}
|
||||
// child: &TypeInfo
|
||||
ConstExprValue *type_info_type = get_builtin_value(ira->codegen, "TypeInfo");
|
||||
assert(type_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
fields[0].special = ConstValSpecialStatic;
|
||||
fields[0].type = get_pointer_to_type(ira->codegen, type_info_type->data.x_type, false);
|
||||
fields[0].data.x_ptr.special = ConstPtrSpecialRef;
|
||||
fields[0].data.x_ptr.mut = ConstPtrMutComptimeVar;
|
||||
ConstExprValue *union_val = create_const_vals(1);
|
||||
union_val->special = ConstValSpecialStatic;
|
||||
union_val->type = type_info_type->data.x_type;
|
||||
bigint_init_unsigned(&union_val->data.x_union.tag, type_id_index(type_entry->data.maybe.child_type->id));
|
||||
union_val->data.x_union.payload = ir_make_type_info_value(ira, union_val, type_entry->data.maybe.child_type);
|
||||
fields[0].data.x_ptr.data.ref.pointee = union_val;
|
||||
return payload;
|
||||
}
|
||||
case TypeTableEntryIdPromise:
|
||||
{
|
||||
ConstExprValue *payload = create_const_vals(1);
|
||||
payload->special = ConstValSpecialStatic;
|
||||
|
||||
ConstExprValue *pointer_info_type = get_builtin_value(ira->codegen, "PromiseInfo");
|
||||
assert(pointer_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
payload->type = pointer_info_type->data.x_type;
|
||||
|
||||
ConstExprValue *fields = create_const_vals(1);
|
||||
payload->data.x_struct.fields = fields;
|
||||
|
||||
if (parent->type->id == TypeTableEntryIdStruct)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdStruct;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else if (parent->type->id == TypeTableEntryIdUnion)
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdUnion;
|
||||
payload->data.x_struct.parent.data.p_union.union_val = parent;
|
||||
}
|
||||
else
|
||||
{
|
||||
payload->data.x_struct.parent.id = ConstParentIdNone;
|
||||
}
|
||||
// child: ?&TypeInfo
|
||||
ConstExprValue *type_info_type = get_builtin_value(ira->codegen, "TypeInfo");
|
||||
assert(type_info_type->type->id == TypeTableEntryIdMetaType);
|
||||
|
||||
TypeTableEntry *type_info_ptr_type = get_pointer_to_type(ira->codegen, type_info_type->data.x_type, false);
|
||||
|
||||
fields[0].special = ConstValSpecialStatic;
|
||||
fields[0].type = get_maybe_type(ira->codegen, type_info_ptr_type);
|
||||
|
||||
if (type_entry->data.promise.result_type == nullptr)
|
||||
{
|
||||
fields[0].data.x_maybe = nullptr;
|
||||
}
|
||||
else
|
||||
{
|
||||
ConstExprValue *maybe_value = create_const_vals(1);
|
||||
maybe_value->special = ConstValSpecialStatic;
|
||||
maybe_value->type = type_info_ptr_type;
|
||||
|
||||
maybe_value->data.x_ptr.special = ConstPtrSpecialRef;
|
||||
maybe_value->data.x_ptr.mut = ConstPtrMutComptimeVar;
|
||||
|
||||
ConstExprValue *union_val = create_const_vals(1);
|
||||
union_val->special = ConstValSpecialStatic;
|
||||
union_val->type = type_info_type->data.x_type;
|
||||
bigint_init_unsigned(&union_val->data.x_union.tag, type_id_index(type_entry->data.promise.result_type->id));
|
||||
union_val->data.x_union.payload = ir_make_type_info_value(ira, union_val, type_entry->data.promise.result_type);
|
||||
|
||||
maybe_value->data.x_ptr.data.ref.pointee = union_val;
|
||||
fields[0].data.x_maybe = maybe_value;
|
||||
}
|
||||
return payload;
|
||||
}
|
||||
default:
|
||||
zig_unreachable();
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user