ktap_closure *kp_load(ktap_state *ks, unsigned char *buff) { struct load_state S; ktap_closure *cl; int ret, i; S.ks = ks; S.buff = buff; S.pos = 0; ret = load_header(&S); if (ret) return NULL; cl = kp_newclosure(ks, 1); if (!cl) return cl; /* put closure on the top, prepare to run with this closure */ set_closure(ks->top, cl); incr_top(ks); cl->p = kp_newproto(ks); if (load_function(&S, cl->p)) return NULL; if (cl->p->sizeupvalues != 1) { ktap_proto *p = cl->p; cl = kp_newclosure(ks, cl->p->sizeupvalues); cl->p = p; set_closure(ks->top - 1, cl); } for (i = 0; i < cl->nupvalues; i++) { /* initialize upvalues */ ktap_upval *up = kp_newupval(ks); cl->upvals[i] = up; } /* set global table as 1st upvalue of 'f' */ if (cl->nupvalues == 1) { ktap_table *reg = hvalue(&G(ks)->registry); const ktap_value *gt = kp_table_getint(reg, KTAP_RIDX_GLOBALS); set_obj(cl->upvals[0]->v, gt); } verify_code(&S, cl->p); return cl; }
ktap_closure *ktapc_newclosure(int n) { return kp_newclosure(NULL, n); }