Changeset a2b666a8ab8d7131bde0c3d600c5f4b8d7fa2709

Show
Ignore:
Timestamp:
06/06/08 03:32:29 (6 years ago)
Author:
Theo Schlossnagle <jesus@omniti.com>
git-committer:
Theo Schlossnagle <jesus@omniti.com> 1212723149 +0000
git-parent:

[fc9516a2d8a7585aaaffbaab77009199ca907c90]

git-author:
Theo Schlossnagle <jesus@omniti.com> 1212723149 +0000
Message:

make modules actually be lua modules

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • src/modules/lua.c

    rfc9516a ra2b666a  
    8383} 
    8484 
     85static void 
     86noit_lua_pushmodule(lua_State *L, const char *m) { 
     87  int stack_pos = LUA_GLOBALSINDEX; 
     88  char *copy, *part, *brkt; 
     89  copy = alloca(strlen(m)+1); 
     90  assert(copy); 
     91  memcpy(copy,m,strlen(m)+1); 
     92 
     93  for(part = strtok_r(copy, ".", &brkt); 
     94      part; 
     95      part = strtok_r(NULL, ".", &brkt)) { 
     96    lua_getfield(L, stack_pos, part); 
     97    if(stack_pos == -1) lua_remove(L, -2); 
     98    else stack_pos = -1; 
     99  } 
     100} 
    85101static void 
    86102noit_lua_hash_to_table(lua_State *L, 
     
    314330static int 
    315331noit_lua_module_onload(noit_image_t *i) { 
     332  int rv; 
    316333  lua_State *L; 
    317334  lua_module_closure_t *lmc; 
     335 
    318336  lmc = noit_image_get_userdata(i); 
    319337  L = lmc->lua_state; 
    320   if(luaL_dofile(L, lmc->script)) { 
     338  lua_getglobal(L, "require"); 
     339  lua_pushstring(L, lmc->object); 
     340  rv = lua_pcall(L, 1, 1, 0); 
     341  if(rv) { 
    321342    int i; 
    322343    noitL(nlerr, "lua: %s.onload failed\n", lmc->object); 
     
    330351      } 
    331352    } 
     353    lua_pop(L,i); 
    332354    return -1; 
    333355  } 
    334  
    335   lua_getfield(L, LUA_GLOBALSINDEX, lmc->object); 
     356  lua_pop(L, lua_gettop(L)); 
     357 
     358  noit_lua_pushmodule(L, lmc->object); 
    336359  if(lua_isnil(L, -1)) { 
    337360    lua_pop(L, 1); 
     
    366389  L = lmc->lua_state 
    367390#define SETUP_CALL(L, func, failure) do { \ 
    368   lua_getfield(L, LUA_GLOBALSINDEX, lmc->object); \ 
     391  noit_lua_pushmodule(L, lmc->object); \ 
    369392  lua_getfield(L, -1, func); \ 
    370393  lua_remove(L, -2); \ 
     
    375398} while(0) 
    376399#define RETURN_INT(L, func) do { \ 
     400  int base = lua_gettop(L); \ 
     401  assert(base == 1); \ 
    377402  if(lua_isnumber(L, -1)) { \ 
    378403    int rv; \ 
     
    463488       * to wake up the coro... 
    464489       */ 
    465       lua_gc(ci->lmc->lua_state, LUA_GCCOLLECT, 0); 
    466490      goto done; 
    467491    default: /* Errors */ 
     
    486510  lua_getglobal(ci->lmc->lua_state, "noit_coros"); 
    487511  luaL_unref(ci->lmc->lua_state, -1, ci->coro_state_ref); 
    488   lua_pop(ci->lmc->lua_state, 2); 
     512  lua_pop(ci->lmc->lua_state, 1); 
    489513 
    490514 done: 
     
    507531    lua_getglobal(ci->lmc->lua_state, "noit_coros"); 
    508532    luaL_unref(ci->lmc->lua_state, -1, ci->coro_state_ref); 
    509     lua_pop(ci->lmc->lua_state, 2); 
     533    lua_pop(ci->lmc->lua_state, 1); 
    510534    lua_gc(ci->lmc->lua_state, LUA_GCCOLLECT, 0); 
    511535    assert(2 == noit_lua_resume(ci, 0)); 
     
    549573  eventer_add(e); 
    550574 
     575  noitL(nlerr, "initiate gettop => %d\n", lua_gettop(L)); 
    551576  ci->lmc = lmc; 
    552577  lua_getglobal(L, "noit_coros"); 
    553578  ci->coro_state = lua_newthread(L); 
     579  ci->coro_state_ref = luaL_ref(L, -2); 
     580  lua_pop(L, 1); /* pops noit_coros */ 
    554581  noit_hash_store(&noit_coros, 
    555582                  (const char *)&ci->coro_state, sizeof(ci->coro_state), 
    556583                  ci); 
    557   ci->coro_state_ref = luaL_ref(L, -2); 
    558   lua_pop(L, 1); /* pops noit_coros */ 
    559584 
    560585  SETUP_CALL(ci->coro_state, "initiate", goto fail); 
     
    586611  lua_State *L; 
    587612  lua_module_closure_t *lmc; 
    588   char *script; 
    589613  char *object; 
    590   char scriptfile[MAXPATHLEN]; 
    591614   
    592615  noitL(nldeb, "Loading lua module: %s\n", module_name); 
     
    595618    return NULL; 
    596619  } 
    597   if(noit_conf_get_string(section, "@script", &script) == 0) { 
    598     noitL(nlerr, "Lua module %s require script attribute.\n", module_name); 
    599     free(object); 
    600     return NULL; 
    601   } 
    602   snprintf(scriptfile, sizeof(scriptfile), "%s/%s", 
    603            noit_lua_loader_get_directory(loader), script); 
    604   free(script); 
    605620 
    606621  m = noit_blank_module(); 
     
    612627  lmc = calloc(1, sizeof(*lmc)); 
    613628  lmc->object = object; 
    614   lmc->script = strdup(scriptfile); 
    615629 
    616630  L = lmc->lua_state = lua_open(); 
     631 
     632 
    617633  lua_gc(L, LUA_GCSTOP, 0);  /* stop collector during initialization */ 
    618634  luaL_openlibs(L);  /* open libraries */ 
     
    620636  lua_newtable(L); 
    621637  lua_setglobal(L, "noit_coros"); 
     638 
     639  lua_getfield(L, LUA_GLOBALSINDEX, "package"); 
     640  lua_pushfstring(L, "%s", noit_lua_loader_get_directory(loader)); 
     641  lua_setfield(L, -2, "path"); 
     642  lua_pop(L, 1); 
     643 
    622644  lua_gc(L, LUA_GCRESTART, 0); 
    623645 
     
    627649    free(m->hdr.description); 
    628650    free(lmc->object); 
    629     free(lmc->script); 
    630651    free(lmc); 
    631652    /* FIXME: We leak the opaque_handler in the module here... */ 
  • src/modules/lua_noit.h

    rdb9f2be ra2b666a  
    2323typedef struct lua_module_closure { 
    2424  char *object; 
    25   char *script; 
    2625  lua_State *lua_state; 
     26  int object_ref; 
    2727} lua_module_closure_t; 
    2828