static sl_object_t* allocate_class(sl_vm_t* vm) { sl_class_t* klass = sl_alloc(vm->arena, sizeof(sl_class_t)); klass->base.primitive_type = SL_T_CLASS; klass->constants = sl_st_init_table(vm, &sl_id_hash_type); klass->class_variables = sl_st_init_table(vm, &sl_id_hash_type); klass->instance_methods = sl_st_init_table(vm, &sl_id_hash_type); klass->super = vm->lib.Object; klass->name.id = 0; klass->in = vm->lib.Object; return (sl_object_t*)klass; }
void sl_pre_init_class(sl_vm_t* vm) { sl_class_t* obj = sl_alloc(vm->arena, sizeof(sl_class_t)); vm->lib.Class = sl_make_ptr((sl_object_t*)obj); obj->name.id = 0; obj->super = vm->lib.Object; obj->in = vm->lib.Object; obj->constants = sl_st_init_table(vm, &sl_id_hash_type); obj->class_variables = sl_st_init_table(vm, &sl_id_hash_type); obj->instance_methods = sl_st_init_table(vm, &sl_id_hash_type); obj->allocator = allocate_class; obj->base.klass = vm->lib.Class; obj->base.primitive_type = SL_T_CLASS; obj->base.instance_variables = sl_st_init_table(vm, &sl_id_hash_type); }
static void init_compile_state(sl_compile_state_t* cs, sl_vm_t* vm, sl_compile_state_t* parent, size_t init_registers) { size_t i; cs->vm = vm; cs->vars = sl_st_init_table(vm, &sl_string_hash_type); cs->parent = parent; cs->section = sl_alloc(vm->arena, sizeof(sl_vm_section_t)); if(parent) { cs->section->filename = parent->section->filename; } cs->section->max_registers = init_registers; cs->section->req_registers = 0; cs->section->arg_registers = 0; cs->section->insns_cap = 16; cs->section->insns_count = 0; cs->section->insns = sl_alloc(vm->arena, sizeof(sl_vm_insn_t) * cs->section->insns_cap); cs->section->line_mappings_cap = 2; cs->section->line_mappings_count = 0; cs->section->line_mappings = sl_alloc_buffer(vm->arena, sizeof(sl_vm_line_mapping_t) * cs->section->line_mappings_cap); cs->section->can_stack_alloc_frame = true; cs->section->has_try_catch = false; cs->section->opt_skip = NULL; cs->registers = sl_alloc(vm->arena, cs->section->max_registers); for(i = 0; i < init_registers; i++) { cs->registers[i] = 1; } cs->next_last_frames = NULL; }