static void spawn_init_start(int8_t *cmd_line) { proc_t *init_proc = proc_make(noval); // group leader set later assert(init_proc != 0); init_proc->cap.regs[0] = parse_cmd_line(&init_proc->hp, cmd_line); assert(init_proc->cap.regs[0] != noval); init_proc->cap.live = 1; init_proc->init_call_mod = A_INIT; init_proc->init_call_func = A_BOOT; init_proc->init_call_arity = 1; export_t *exp = code_base_lookup(A_INIT, A_BOOT, 1); assert(exp != 0); init_proc->cap.ip = exp->entry; module_info_t *mi = code_base_module_by_name(A_INIT, 0); assert(mi != 0); init_proc->cap.cp = mi->code_starts + mi->code_size-1; scheduler_enlist0(init_proc); // pid assigned init_proc->group_leader = init_proc->pid; // init is its own leader proc_main(init_proc); /* UNREACHANBLE */ }
static void proc_apply(process_t *proc, term_t mod, term_t fun, term_t args) { celem_t *ip; int arity = lst_len(args); term_t mdi = intnum(proc->mod_index); term_t off = intnum(proc->ip - proc->code); ip = code_base_lookup(proc->base, mod, fun, arity, &proc->mod_index, &proc->code); if (ip == 0) { *(term_t *)apr_array_push(proc->cstack) = args; *(term_t *)apr_array_push(proc->cstack) = fun; *(term_t *)apr_array_push(proc->cstack) = mod; ip = code_base_lookup(proc->base, A_ERROR_HANDLER, A_UNDEFINED_FUNCTION, 3, &proc->mod_index, &proc->code); } else { // pushing args in reverse order: kludgy term_t l; int i; for (i = 0; i < arity; i++) *(term_t *)apr_array_push(proc->cstack) = AI_UNDEFINED; l = args; i = 0; while (l != nil) { (((term_t *)proc->cstack->elts)[proc->cstack->nelts-i-1]) = lst_value(l); l = lst_next(l); i++; } } *(term_t *)apr_array_push(proc->cstack) = mdi; *(term_t *)apr_array_push(proc->cstack) = off; proc->ip = ip; }