jl_struct_type_t *jl_new_struct_type(jl_sym_t *name, jl_tag_type_t *super, jl_tuple_t *parameters, jl_tuple_t *fnames, jl_tuple_t *ftypes) { jl_typename_t *tn = jl_new_typename(name); JL_GC_PUSH(&tn); jl_struct_type_t *t = (jl_struct_type_t*)newobj((jl_type_t*)jl_struct_kind, STRUCT_TYPE_NW); t->name = tn; t->name->primary = (jl_value_t*)t; t->super = super; t->parameters = parameters; t->names = fnames; t->types = ftypes; t->fptr = jl_f_ctor_trampoline; t->env = (jl_value_t*)t; t->linfo = NULL; t->ctor_factory = (jl_value_t*)jl_null; t->instance = NULL; if (!jl_is_leaf_type((jl_value_t*)t)) t->uid = 0; else t->uid = jl_assign_type_uid(); JL_GC_POP(); return t; }
jl_struct_type_t *jl_new_struct_type(jl_sym_t *name, jl_tag_type_t *super, jl_tuple_t *parameters, jl_tuple_t *fnames, jl_tuple_t *ftypes) { jl_typename_t *tn = jl_new_typename(name); JL_GC_PUSH(&tn); jl_struct_type_t *t = jl_new_uninitialized_struct_type(fnames->length); t->name = tn; t->name->primary = (jl_value_t*)t; t->super = super; t->parameters = parameters; t->names = fnames; t->types = ftypes; t->fptr = jl_f_ctor_trampoline; t->env = (jl_value_t*)t; t->linfo = NULL; t->ctor_factory = (jl_value_t*)jl_null; t->instance = NULL; if (!jl_is_leaf_type((jl_value_t*)t)) { t->uid = 0; } else { t->uid = jl_assign_type_uid(); if (t->types != NULL) jl_compute_struct_offsets(t); } JL_GC_POP(); return t; }
jl_datatype_t *jl_new_datatype(jl_sym_t *name, jl_datatype_t *super, jl_tuple_t *parameters, jl_tuple_t *fnames, jl_tuple_t *ftypes, int abstract, int mutabl) { jl_datatype_t *t=NULL; jl_typename_t *tn=NULL; JL_GC_PUSH2(&t, &tn); if (!jl_boot_file_loaded && jl_is_symbol(name)) { // hack to avoid making two versions of basic types needed // during bootstrapping if (!strcmp(((jl_sym_t*)name)->name, "Int32")) t = jl_int32_type; else if (!strcmp(((jl_sym_t*)name)->name, "Int64")) t = jl_int64_type; else if (!strcmp(((jl_sym_t*)name)->name, "Bool")) t = jl_bool_type; } if (t == NULL) t = jl_new_uninitialized_datatype(jl_tuple_len(fnames)); else tn = t->name; // init before possibly calling jl_new_typename t->super = super; t->parameters = parameters; t->names = fnames; t->types = ftypes; t->abstract = abstract; t->mutabl = mutabl; t->pointerfree = 0; t->instance = NULL; t->struct_decl = NULL; t->size = 0; t->alignment = 0; if (tn == NULL) { t->name = NULL; if (jl_is_typename(name)) tn = (jl_typename_t*)name; else tn = jl_new_typename((jl_sym_t*)name); t->name = tn; } if (t->name->primary == NULL) t->name->primary = (jl_value_t*)t; if (abstract || jl_tuple_len(parameters) > 0) { t->uid = 0; } else { t->uid = jl_assign_type_uid(); if (t->types != NULL) jl_compute_field_offsets(t); } JL_GC_POP(); return t; }
jl_bits_type_t *jl_new_bitstype(jl_value_t *name, jl_tag_type_t *super, jl_tuple_t *parameters, size_t nbits) { jl_bits_type_t *t=NULL; jl_typename_t *tn=NULL; JL_GC_PUSH(&t, &tn); if (!jl_boot_file_loaded && jl_is_symbol(name)) { // hack to avoid making two versions of basic types needed // during bootstrapping if (!strcmp(((jl_sym_t*)name)->name, "Int32")) t = jl_int32_type; else if (!strcmp(((jl_sym_t*)name)->name, "Int64")) t = jl_int64_type; else if (!strcmp(((jl_sym_t*)name)->name, "Bool")) t = jl_bool_type; } int makenew = (t==NULL); if (makenew) { t = (jl_bits_type_t*)newobj((jl_type_t*)jl_bits_kind, BITS_TYPE_NW); if (jl_is_typename(name)) tn = (jl_typename_t*)name; else tn = jl_new_typename((jl_sym_t*)name); t->name = tn; } t->super = super; unbind_tvars(parameters); t->parameters = parameters; if (jl_int32_type != NULL) t->bnbits = jl_box_int32(nbits); else t->bnbits = (jl_value_t*)jl_null; t->nbits = nbits; if (!jl_is_leaf_type((jl_value_t*)t)) t->uid = 0; else if (makenew) t->uid = jl_assign_type_uid(); t->fptr = NULL; t->env = NULL; t->linfo = NULL; if (t->name->primary == NULL) t->name->primary = (jl_value_t*)t; JL_GC_POP(); return t; }
jl_tag_type_t *jl_new_tagtype(jl_value_t *name, jl_tag_type_t *super, jl_tuple_t *parameters) { jl_typename_t *tn=NULL; JL_GC_PUSH(&tn); if (jl_is_typename(name)) tn = (jl_typename_t*)name; else tn = jl_new_typename((jl_sym_t*)name); jl_tag_type_t *t = (jl_tag_type_t*)newobj((jl_type_t*)jl_tag_kind, TAG_TYPE_NW); t->name = tn; t->super = super; t->parameters = parameters; t->fptr = NULL; t->env = NULL; t->linfo = NULL; if (t->name->primary == NULL) t->name->primary = (jl_value_t*)t; JL_GC_POP(); return t; }
JL_DLLEXPORT jl_datatype_t *jl_new_datatype(jl_sym_t *name, jl_datatype_t *super, jl_svec_t *parameters, jl_svec_t *fnames, jl_svec_t *ftypes, int abstract, int mutabl, int ninitialized) { jl_datatype_t *t=NULL; jl_typename_t *tn=NULL; JL_GC_PUSH2(&t, &tn); if (!jl_boot_file_loaded && jl_is_symbol(name)) { // hack to avoid making two versions of basic types needed // during bootstrapping if (!strcmp(jl_symbol_name((jl_sym_t*)name), "Int32")) t = jl_int32_type; else if (!strcmp(jl_symbol_name((jl_sym_t*)name), "Int64")) t = jl_int64_type; else if (!strcmp(jl_symbol_name((jl_sym_t*)name), "Bool")) t = jl_bool_type; else if (!strcmp(jl_symbol_name((jl_sym_t*)name), "UInt8")) t = jl_uint8_type; } if (t == NULL) t = jl_new_uninitialized_datatype(jl_svec_len(fnames), 2); // TODO else tn = t->name; // init before possibly calling jl_new_typename t->super = super; if (super != NULL) jl_gc_wb(t, t->super); t->parameters = parameters; jl_gc_wb(t, t->parameters); t->types = ftypes; if (ftypes != NULL) jl_gc_wb(t, t->types); t->abstract = abstract; t->mutabl = mutabl; t->pointerfree = 0; t->ninitialized = ninitialized; t->instance = NULL; t->struct_decl = NULL; t->ditype = NULL; t->size = 0; t->alignment = 1; t->haspadding = 0; if (tn == NULL) { t->name = NULL; if (jl_is_typename(name)) { tn = (jl_typename_t*)name; } else { tn = jl_new_typename((jl_sym_t*)name); if (!abstract) { tn->mt = jl_new_method_table(name, jl_current_module); jl_gc_wb(tn, tn->mt); } } t->name = tn; jl_gc_wb(t, t->name); } t->name->names = fnames; jl_gc_wb(t->name, t->name->names); if (t->name->primary == NULL) { t->name->primary = (jl_value_t*)t; jl_gc_wb(t->name, t); } jl_precompute_memoized_dt(t); if (abstract || jl_svec_len(parameters) > 0) { t->uid = 0; } else { t->uid = jl_assign_type_uid(); if (t->types != NULL) jl_compute_field_offsets(t); } JL_GC_POP(); return t; }