Ejemplo n.º 1
0
struct cell *
cell_new(lua_State *L, const char * mainfile) {
	hive_getenv(L, "cell_map");
	int cell_map = lua_absindex(L,-1);	// cell_map
	luaL_requiref(L, "cell.c", cell_lib, 0);	// cell_map cell_lib
	struct cell * c = cell_create();
	c->L = L;
	cell_touserdata(L, cell_map, c);	// cell_map cell_lib cell_ud

	lua_setfield(L, -2, "self");	// cell_map cell_lib

	hive_getenv(L, "system_pointer");
	struct cell * sys = lua_touserdata(L, -1);	// cell_map cell_lib system_cell
	lua_pop(L, 1);	
	if (sys) {
		cell_touserdata(L, cell_map, sys);
		lua_setfield(L, -2, "system");
	}

	lua_pop(L,2);
	lua_pushlightuserdata(L, c);
	hive_setenv(L, "cell_pointer");
	
	int err = luaL_loadfile(L, mainfile);
	if (err) {
		printf("%d : %s\n", err, lua_tostring(L,-1));
		lua_pop(L,1);
		goto _error;
	}

	err = lua_pcall(L, 0, 0, 0);
	if (err) {
		printf("%d : %s\n", err, lua_tostring(L,-1));
		lua_pop(L,1);
		goto _error;
	}
	lua_pushcfunction(L, traceback);	// upvalue 1
	lua_pushcfunction(L, data_unpack); // upvalue 2
	hive_getenv(L, "dispatcher");	// upvalue 3
	if (!lua_isfunction(L, -1)) {
		printf("set dispatcher first\n");
		goto _error;
	}
	hive_getenv(L, "cell_map");	// upvalue 4
	lua_pushcclosure(L, lcallback, 4);
	return c;
_error:
	scheduler_deletetask(L);
	c->L = NULL;
	cell_destroy(c);

	return NULL;
}
Ejemplo n.º 2
0
void su_cat_seq(su_state *s) {
	value_t v, f, r;
	v = *STK(-1);
	su_seq_reverse(s, -2);
	r = *STK(-1);
	
	while (v.type != SU_NIL) {
		f = seq_first(s, v.obj.q);
		r = cell_create(s, &f, &r);
		v = seq_rest(s, v.obj.q);
	}
	
	s->stack[s->stack_top - 3] = r;
	s->stack_top -= 2;
	su_seq_reverse(s, -1);
	s->stack[s->stack_top - 2] = s->stack[s->stack_top - 1];
	s->stack_top--;
}
Ejemplo n.º 3
0
static int cell_management(int argc, char *argv[])
{
	int err;

	if (argc < 3) {
		help(argv[0]);
		exit(1);
	}

	if (strcmp(argv[2], "create") == 0)
		err = cell_create(argc, argv);
	else if (strcmp(argv[2], "destroy") == 0)
		err = cell_destroy(argc, argv);
	else {
		help(argv[0]);
		exit(1);
	}

	return err;
}
Ejemplo n.º 4
0
static int cell_management(int argc, char *argv[])
{
	int err;

	if (argc < 3)
		help(argv[0], 1);

	if (strcmp(argv[2], "create") == 0)
		err = cell_create(argc, argv);
	else if (strcmp(argv[2], "load") == 0)
		err = cell_shutdown_load(argc, argv, LOAD);
	else if (strcmp(argv[2], "start") == 0)
		err = cell_simple_cmd(argc, argv, JAILHOUSE_CELL_START);
	else if (strcmp(argv[2], "shutdown") == 0)
		err = cell_shutdown_load(argc, argv, SHUTDOWN);
	else if (strcmp(argv[2], "destroy") == 0)
		err = cell_simple_cmd(argc, argv, JAILHOUSE_CELL_DESTROY);
	else if (strcmp(argv[2], "list") == 0)
		err = cell_list(argc, argv);
	else
		help(argv[0], 1);

	return err;
}
Ejemplo n.º 5
0
void su_cons(su_state *s) {
	s->stack[s->stack_top - 2] = cell_create(s, STK(-2), STK(-1));
	s->stack_top--;
}