| ... | @@ -25975,24 +25975,30 @@ static Error get_const_field_buf(IrAnalyze *ira, AstNode *source_node, ZigValue | ... | @@ -25975,24 +25975,30 @@ static Error get_const_field_buf(IrAnalyze *ira, AstNode *source_node, ZigValue |
| 25975 | ZigValue *ptr = slice->data.x_struct.fields[slice_ptr_index]; | 25975 | ZigValue *ptr = slice->data.x_struct.fields[slice_ptr_index]; |
| 25976 | ZigValue *len = slice->data.x_struct.fields[slice_len_index]; | 25976 | ZigValue *len = slice->data.x_struct.fields[slice_len_index]; |
| 25977 | assert(ptr->data.x_ptr.special == ConstPtrSpecialBaseArray); | 25977 | assert(ptr->data.x_ptr.special == ConstPtrSpecialBaseArray); |
| 25978 | assert(ptr->data.x_ptr.data.base_array.elem_index == 0); | | |
| 25979 | ZigValue *arr = ptr->data.x_ptr.data.base_array.array_val; | 25978 | ZigValue *arr = ptr->data.x_ptr.data.base_array.array_val; |
| 25980 | assert(arr->special == ConstValSpecialStatic); | 25979 | assert(arr->special == ConstValSpecialStatic); |
| | 25980 | |
| | 25981 | const size_t start_value = ptr->data.x_ptr.data.base_array.elem_index; |
| | 25982 | const size_t len_value = bigint_as_usize(&len->data.x_bigint); |
| | 25983 | |
| 25981 | switch (arr->data.x_array.special) { | 25984 | switch (arr->data.x_array.special) { |
| 25982 | case ConstArraySpecialUndef: | 25985 | case ConstArraySpecialUndef: |
| 25983 | return ErrorSemanticAnalyzeFail; | 25986 | return ErrorSemanticAnalyzeFail; |
| 25984 | case ConstArraySpecialNone: { | 25987 | case ConstArraySpecialNone: { |
| | 25988 | assert(start_value <= arr->type->data.array.len); |
| | 25989 | assert(start_value + len_value <= arr->type->data.array.len); |
| 25985 | buf_resize(out, 0); | 25990 | buf_resize(out, 0); |
| 25986 | size_t count = bigint_as_usize(&len->data.x_bigint); | 25991 | for (size_t j = 0; j < len_value; j++) { |
| 25987 | for (size_t j = 0; j < count; j++) { | 25992 | ZigValue *ch_val = &arr->data.x_array.data.s_none.elements[start_value + j]; |
| 25988 | ZigValue *ch_val = &arr->data.x_array.data.s_none.elements[j]; | | |
| 25989 | unsigned ch = bigint_as_u32(&ch_val->data.x_bigint); | 25993 | unsigned ch = bigint_as_u32(&ch_val->data.x_bigint); |
| 25990 | buf_append_char(out, ch); | 25994 | buf_append_char(out, ch); |
| 25991 | } | 25995 | } |
| 25992 | break; | 25996 | break; |
| 25993 | } | 25997 | } |
| 25994 | case ConstArraySpecialBuf: | 25998 | case ConstArraySpecialBuf: |
| 25995 | buf_init_from_buf(out, arr->data.x_array.data.s_buf); | 25999 | assert(start_value <= buf_len(arr->data.x_array.data.s_buf)); |
| | 26000 | assert(start_value + len_value <= buf_len(arr->data.x_array.data.s_buf)); |
| | 26001 | buf_init_from_mem(out, buf_ptr(arr->data.x_array.data.s_buf) + start_value, len_value); |
| 25996 | break; | 26002 | break; |
| 25997 | } | 26003 | } |
| 25998 | return ErrorNone; | 26004 | return ErrorNone; |