/* This creates a new class based off of a given seed. The name is copied over from the seed given. If the given class does not take generics, this will also set the default type of the newly-made class. */ lily_class *lily_new_class_by_seed(lily_symtab *symtab, const void *seed) { lily_class_seed *class_seed = (lily_class_seed *)seed; lily_class *new_class = lily_new_class(symtab, class_seed->name); lily_type *type; /* If a class doesn't take generics (or isn't the generic class), then give it a default type. */ if (class_seed->generic_count != 0) type = NULL; else { /* A basic class? Make a quick default type for it. */ type = make_new_type(new_class); new_class->type = type; new_class->all_subtypes = type; } new_class->type = type; new_class->is_builtin = 1; new_class->generic_count = class_seed->generic_count; new_class->flags = 0; new_class->is_refcounted = class_seed->is_refcounted; new_class->import = symtab->active_import; new_class->dynaload_table = class_seed->dynaload_table; return new_class; }
/* Use this to create a new class that represents an enum. */ lily_class *lily_new_enum(lily_symtab *symtab, const char *name) { lily_class *new_class = lily_new_class(symtab, name); new_class->flags |= CLS_IS_ENUM; new_class->move_flags = VAL_IS_ENUM; return new_class; }
/* This creates a new class based off of a given seed. The name is copied over from the seed given. If the given class does not take generics, this will also set the default type of the newly-made class. */ lily_class *lily_new_raw_class(lily_symtab *symtab, const char *name) { lily_class *new_class = lily_new_class(symtab, name); new_class->flags |= CLS_IS_BUILTIN; new_class->id = 0; symtab->next_class_id--; return new_class; }