Commit 182a9fad2d

Alexandros Naskos <alex_naskos@hotmail.com>
2018-04-24 16:38:30
Added ArrayInfo, NullableInfo, PromiseInfo generation
1 parent 09d7033
Changed files (2)
src/codegen.cpp
@@ -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"
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();
     }