Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
Archivo: main.c Proyecto: cfregly/ktap
ktap_closure *ktapc_newclosure(int n)
{
	return kp_newclosure(NULL, n);
}