| ... | ... | @@ -25678,37 +25678,20 @@ static Error ir_make_type_info_value(IrAnalyze *ira, IrInst* source_instr, ZigTy |
| 25678 | 25678 | struct_field_val->type = type_info_struct_field_type; |
| 25679 | 25679 | |
| 25680 | 25680 | ZigValue **inner_fields = alloc_const_vals_ptrs(ira->codegen, 4); |
| 25681 | | inner_fields[1]->special = ConstValSpecialStatic; |
| 25682 | | inner_fields[1]->type = get_optional_type(ira->codegen, ira->codegen->builtin_types.entry_num_lit_int); |
| 25683 | | |
| 25684 | | ZigType *field_type = resolve_struct_field_type(ira->codegen, struct_field); |
| 25685 | | if (field_type == nullptr) |
| 25686 | | return ErrorSemanticAnalyzeFail; |
| 25687 | | if ((err = type_resolve(ira->codegen, field_type, ResolveStatusZeroBitsKnown))) |
| 25688 | | return err; |
| 25689 | | if (!type_has_bits(ira->codegen, struct_field->type_entry)) { |
| 25690 | | inner_fields[1]->data.x_optional = nullptr; |
| 25691 | | } else { |
| 25692 | | size_t byte_offset = struct_field->offset; |
| 25693 | | inner_fields[1]->data.x_optional = ira->codegen->pass1_arena->create<ZigValue>(); |
| 25694 | | inner_fields[1]->data.x_optional->special = ConstValSpecialStatic; |
| 25695 | | inner_fields[1]->data.x_optional->type = ira->codegen->builtin_types.entry_num_lit_int; |
| 25696 | | bigint_init_unsigned(&inner_fields[1]->data.x_optional->data.x_bigint, byte_offset); |
| 25697 | | } |
| 25698 | 25681 | |
| 25699 | | inner_fields[2]->special = ConstValSpecialStatic; |
| 25700 | | inner_fields[2]->type = ira->codegen->builtin_types.entry_type; |
| 25701 | | inner_fields[2]->data.x_type = struct_field->type_entry; |
| 25682 | inner_fields[1]->special = ConstValSpecialStatic; |
| 25683 | inner_fields[1]->type = ira->codegen->builtin_types.entry_type; |
| 25684 | inner_fields[1]->data.x_type = struct_field->type_entry; |
| 25702 | 25685 | |
| 25703 | 25686 | // default_value: anytype |
| 25704 | | inner_fields[3]->special = ConstValSpecialStatic; |
| 25705 | | inner_fields[3]->type = get_optional_type2(ira->codegen, struct_field->type_entry); |
| 25706 | | if (inner_fields[3]->type == nullptr) return ErrorSemanticAnalyzeFail; |
| 25687 | inner_fields[2]->special = ConstValSpecialStatic; |
| 25688 | inner_fields[2]->type = get_optional_type2(ira->codegen, struct_field->type_entry); |
| 25689 | if (inner_fields[2]->type == nullptr) return ErrorSemanticAnalyzeFail; |
| 25707 | 25690 | memoize_field_init_val(ira->codegen, type_entry, struct_field); |
| 25708 | 25691 | if(struct_field->init_val != nullptr && type_is_invalid(struct_field->init_val->type)){ |
| 25709 | 25692 | return ErrorSemanticAnalyzeFail; |
| 25710 | 25693 | } |
| 25711 | | set_optional_payload(inner_fields[3], struct_field->init_val); |
| 25694 | set_optional_payload(inner_fields[2], struct_field->init_val); |
| 25712 | 25695 | |
| 25713 | 25696 | ZigValue *name = create_const_str_lit(ira->codegen, struct_field->name)->data.x_ptr.data.ref.pointee; |
| 25714 | 25697 | init_const_slice(ira->codegen, inner_fields[0], name, 0, buf_len(struct_field->name), true); |
| ... | ... | @@ -25959,6 +25942,36 @@ static ZigType *get_const_field_meta_type_optional(IrAnalyze *ira, AstNode *sour |
| 25959 | 25942 | return value->data.x_optional->data.x_type; |
| 25960 | 25943 | } |
| 25961 | 25944 | |
| 25945 | static Error get_const_field_buf(IrAnalyze *ira, AstNode *source_node, ZigValue *struct_value, |
| 25946 | const char *name, size_t field_index, Buf *out) |
| 25947 | { |
| 25948 | ZigValue *slice = get_const_field(ira, source_node, struct_value, name, field_index); |
| 25949 | ZigValue *ptr = slice->data.x_struct.fields[slice_ptr_index]; |
| 25950 | ZigValue *len = slice->data.x_struct.fields[slice_len_index]; |
| 25951 | assert(ptr->data.x_ptr.special == ConstPtrSpecialBaseArray); |
| 25952 | assert(ptr->data.x_ptr.data.base_array.elem_index == 0); |
| 25953 | ZigValue *arr = ptr->data.x_ptr.data.base_array.array_val; |
| 25954 | assert(arr->special == ConstValSpecialStatic); |
| 25955 | switch (arr->data.x_array.special) { |
| 25956 | case ConstArraySpecialUndef: |
| 25957 | return ErrorSemanticAnalyzeFail; |
| 25958 | case ConstArraySpecialNone: { |
| 25959 | buf_resize(out, 0); |
| 25960 | size_t count = bigint_as_usize(&len->data.x_bigint); |
| 25961 | for (size_t j = 0; j < count; j++) { |
| 25962 | ZigValue *ch_val = &arr->data.x_array.data.s_none.elements[j]; |
| 25963 | unsigned ch = bigint_as_u32(&ch_val->data.x_bigint); |
| 25964 | buf_append_char(out, ch); |
| 25965 | } |
| 25966 | break; |
| 25967 | } |
| 25968 | case ConstArraySpecialBuf: |
| 25969 | buf_init_from_buf(out, arr->data.x_array.data.s_buf); |
| 25970 | break; |
| 25971 | } |
| 25972 | return ErrorNone; |
| 25973 | } |
| 25974 | |
| 25962 | 25975 | static ZigType *type_info_to_type(IrAnalyze *ira, IrInst *source_instr, ZigTypeId tagTypeId, ZigValue *payload) { |
| 25963 | 25976 | Error err; |
| 25964 | 25977 | switch (tagTypeId) { |
| ... | ... | @@ -26162,30 +26175,9 @@ static ZigType *type_info_to_type(IrAnalyze *ira, IrInst *source_instr, ZigTypeI |
| 26162 | 26175 | assert(error->type == ir_type_info_get_type(ira, "Error", nullptr)); |
| 26163 | 26176 | ErrorTableEntry *err_entry = heap::c_allocator.create<ErrorTableEntry>(); |
| 26164 | 26177 | err_entry->decl_node = source_instr->source_node; |
| 26165 | | ZigValue *name_slice = get_const_field(ira, source_instr->source_node, error, "name", 0); |
| 26166 | | ZigValue *name_ptr = name_slice->data.x_struct.fields[slice_ptr_index]; |
| 26167 | | ZigValue *name_len = name_slice->data.x_struct.fields[slice_len_index]; |
| 26168 | | assert(name_ptr->data.x_ptr.special == ConstPtrSpecialBaseArray); |
| 26169 | | assert(name_ptr->data.x_ptr.data.base_array.elem_index == 0); |
| 26170 | | ZigValue *name_arr = name_ptr->data.x_ptr.data.base_array.array_val; |
| 26171 | | assert(name_arr->special == ConstValSpecialStatic); |
| 26172 | | switch (name_arr->data.x_array.special) { |
| 26173 | | case ConstArraySpecialUndef: |
| 26174 | | return ira->codegen->invalid_inst_gen->value->type; |
| 26175 | | case ConstArraySpecialNone: { |
| 26176 | | buf_resize(&err_entry->name, 0); |
| 26177 | | size_t name_count = bigint_as_usize(&name_len->data.x_bigint); |
| 26178 | | for (size_t j = 0; j < name_count; j++) { |
| 26179 | | ZigValue *ch_val = &name_arr->data.x_array.data.s_none.elements[j]; |
| 26180 | | unsigned ch = bigint_as_u32(&ch_val->data.x_bigint); |
| 26181 | | buf_append_char(&err_entry->name, ch); |
| 26182 | | } |
| 26183 | | break; |
| 26184 | | } |
| 26185 | | case ConstArraySpecialBuf: |
| 26186 | | buf_init_from_buf(&err_entry->name, name_arr->data.x_array.data.s_buf); |
| 26187 | | break; |
| 26188 | | } |
| 26178 | Error err; |
| 26179 | if ((err = get_const_field_buf(ira, source_instr->source_node, error, "name", 0, &err_entry->name))) |
| 26180 | return ira->codegen->invalid_inst_gen->value->type; |
| 26189 | 26181 | auto existing_entry = ira->codegen->error_table.put_unique(&err_entry->name, err_entry); |
| 26190 | 26182 | if (existing_entry) { |
| 26191 | 26183 | err_entry->value = existing_entry->value->value; |
| ... | ... | @@ -26205,14 +26197,92 @@ static ZigType *type_info_to_type(IrAnalyze *ira, IrInst *source_instr, ZigTypeI |
| 26205 | 26197 | } |
| 26206 | 26198 | return err_set_type; |
| 26207 | 26199 | } |
| 26200 | case ZigTypeIdStruct: { |
| 26201 | assert(payload->special == ConstValSpecialStatic); |
| 26202 | assert(payload->type == ir_type_info_get_type(ira, "Struct", nullptr)); |
| 26203 | |
| 26204 | ZigValue *layout_value = get_const_field(ira, source_instr->source_node, payload, "layout", 0); |
| 26205 | assert(layout_value->special == ConstValSpecialStatic); |
| 26206 | assert(layout_value->type == ir_type_info_get_type(ira, "ContainerLayout", nullptr)); |
| 26207 | ContainerLayout layout = (ContainerLayout)bigint_as_u32(&layout_value->data.x_enum_tag); |
| 26208 | |
| 26209 | ZigValue *fields_value = get_const_field(ira, source_instr->source_node, payload, "fields", 1); |
| 26210 | assert(fields_value->special == ConstValSpecialStatic); |
| 26211 | assert(is_slice(fields_value->type)); |
| 26212 | ZigValue *fields_ptr = fields_value->data.x_struct.fields[slice_ptr_index]; |
| 26213 | ZigValue *fields_len_value = fields_value->data.x_struct.fields[slice_len_index]; |
| 26214 | size_t fields_len = bigint_as_usize(&fields_len_value->data.x_bigint); |
| 26215 | |
| 26216 | ZigValue *decls_value = get_const_field(ira, source_instr->source_node, payload, "decls", 2); |
| 26217 | assert(decls_value->special == ConstValSpecialStatic); |
| 26218 | assert(is_slice(decls_value->type)); |
| 26219 | ZigValue *decls_len_value = decls_value->data.x_struct.fields[slice_len_index]; |
| 26220 | size_t decls_len = bigint_as_usize(&decls_len_value->data.x_bigint); |
| 26221 | if (decls_len != 0) { |
| 26222 | ir_add_error(ira, source_instr, buf_create_from_str("TypeInfo.Struct.decls must be empty for @Type")); |
| 26223 | return ira->codegen->invalid_inst_gen->value->type; |
| 26224 | } |
| 26225 | |
| 26226 | bool is_tuple; |
| 26227 | get_const_field_bool(ira, source_instr->source_node, payload, "is_tuple", 3, &is_tuple); |
| 26228 | |
| 26229 | ZigType *entry = new_type_table_entry(ZigTypeIdStruct); |
| 26230 | buf_init_from_buf(&entry->name, |
| 26231 | get_anon_type_name(ira->codegen, ira->old_irb.exec, "struct", source_instr->scope, source_instr->source_node, &entry->name)); |
| 26232 | entry->data.structure.decl_node = source_instr->source_node; |
| 26233 | entry->data.structure.fields = alloc_type_struct_fields(fields_len); |
| 26234 | entry->data.structure.fields_by_name.init(fields_len); |
| 26235 | entry->data.structure.src_field_count = fields_len; |
| 26236 | entry->data.structure.layout = layout; |
| 26237 | entry->data.structure.special = is_tuple ? StructSpecialInferredTuple : StructSpecialNone; |
| 26238 | entry->data.structure.created_by_at_type = true; |
| 26239 | entry->data.structure.decls_scope = create_decls_scope(ira->codegen, nullptr, nullptr, entry, entry, &entry->name); |
| 26240 | |
| 26241 | assert(fields_ptr->data.x_ptr.special == ConstPtrSpecialBaseArray); |
| 26242 | assert(fields_ptr->data.x_ptr.data.base_array.elem_index == 0); |
| 26243 | ZigValue *fields_arr = fields_ptr->data.x_ptr.data.base_array.array_val; |
| 26244 | assert(fields_arr->special == ConstValSpecialStatic); |
| 26245 | assert(fields_arr->data.x_array.special == ConstArraySpecialNone); |
| 26246 | for (size_t i = 0; i < fields_len; i++) { |
| 26247 | ZigValue *field_value = &fields_arr->data.x_array.data.s_none.elements[i]; |
| 26248 | assert(field_value->type == ir_type_info_get_type(ira, "StructField", nullptr)); |
| 26249 | TypeStructField *field = entry->data.structure.fields[i]; |
| 26250 | field->name = buf_alloc(); |
| 26251 | if ((err = get_const_field_buf(ira, source_instr->source_node, field_value, "name", 0, field->name))) |
| 26252 | return ira->codegen->invalid_inst_gen->value->type; |
| 26253 | field->decl_node = source_instr->source_node; |
| 26254 | ZigValue *type_value = get_const_field(ira, source_instr->source_node, field_value, "field_type", 1); |
| 26255 | field->type_val = type_value; |
| 26256 | field->type_entry = type_value->data.x_type; |
| 26257 | if (entry->data.structure.fields_by_name.put_unique(field->name, field) != nullptr) { |
| 26258 | ir_add_error(ira, source_instr, buf_sprintf("duplicate struct field '%s'", buf_ptr(field->name))); |
| 26259 | return ira->codegen->invalid_inst_gen->value->type; |
| 26260 | } |
| 26261 | ZigValue *default_value = get_const_field(ira, source_instr->source_node, field_value, "default_value", 2); |
| 26262 | if (default_value->type->id == ZigTypeIdNull) { |
| 26263 | field->init_val = nullptr; |
| 26264 | } else if (default_value->type->id == ZigTypeIdOptional && default_value->type->data.maybe.child_type == field->type_entry) { |
| 26265 | field->init_val = default_value->data.x_optional; |
| 26266 | } else if (default_value->type == field->type_entry) { |
| 26267 | field->init_val = default_value; |
| 26268 | } else { |
| 26269 | ir_add_error(ira, source_instr, |
| 26270 | buf_sprintf("default_value of field '%s' is of type '%s', expected '%s' or '?%s'", |
| 26271 | buf_ptr(field->name), buf_ptr(&default_value->type->name), |
| 26272 | buf_ptr(&field->type_entry->name), buf_ptr(&field->type_entry->name))); |
| 26273 | return ira->codegen->invalid_inst_gen->value->type; |
| 26274 | } |
| 26275 | } |
| 26276 | |
| 26277 | return entry; |
| 26278 | } |
| 26208 | 26279 | case ZigTypeIdEnum: |
| 26280 | case ZigTypeIdUnion: |
| 26209 | 26281 | ir_add_error(ira, source_instr, buf_sprintf( |
| 26210 | 26282 | "TODO implement @Type for 'TypeInfo.%s': see https://github.com/ziglang/zig/issues/2907", type_id_name(tagTypeId))); |
| 26211 | 26283 | return ira->codegen->invalid_inst_gen->value->type; |
| 26212 | | case ZigTypeIdUnion: |
| 26213 | 26284 | case ZigTypeIdFn: |
| 26214 | 26285 | case ZigTypeIdBoundFn: |
| 26215 | | case ZigTypeIdStruct: |
| 26216 | 26286 | ir_add_error(ira, source_instr, buf_sprintf( |
| 26217 | 26287 | "@Type not available for 'TypeInfo.%s'", type_id_name(tagTypeId))); |
| 26218 | 26288 | return ira->codegen->invalid_inst_gen->value->type; |