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; }
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--; }
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; }
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; }
void su_cons(su_state *s) { s->stack[s->stack_top - 2] = cell_create(s, STK(-2), STK(-1)); s->stack_top--; }