Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}