diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-03-01 14:01:53 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2011-03-01 14:01:53 -0300 |
| commit | e049abb69a45e06ca5769a3956a0ba36a959d29e (patch) | |
| tree | 6071757e921764d1823135fa8292151d0c9beaf4 | |
| parent | 98816d0ce58db9e817129b076723187d690501df (diff) | |
| download | lua-e049abb69a45e06ca5769a3956a0ba36a959d29e.tar.gz lua-e049abb69a45e06ca5769a3956a0ba36a959d29e.tar.bz2 lua-e049abb69a45e06ca5769a3956a0ba36a959d29e.zip | |
loaders receive an extra argument returned by the searcher
(typically the file name)
| -rw-r--r-- | loadlib.c | 55 |
1 files changed, 32 insertions, 23 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: loadlib.c,v 1.95 2011/01/07 18:54:49 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.96 2011/02/07 19:15:24 roberto Exp roberto $ |
| 3 | ** Dynamic library loader for Lua | 3 | ** Dynamic library loader for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | ** | 5 | ** |
| @@ -364,9 +364,15 @@ static const char *findfile (lua_State *L, const char *name, | |||
| 364 | } | 364 | } |
| 365 | 365 | ||
| 366 | 366 | ||
| 367 | static void loaderror (lua_State *L, const char *filename) { | 367 | static int checkload (lua_State *L, int stat, const char *filename) { |
| 368 | luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", | 368 | if (stat) { /* module loaded successfully? */ |
| 369 | lua_tostring(L, 1), filename, lua_tostring(L, -1)); | 369 | lua_pushstring(L, filename); /* will be 2nd argument to module */ |
| 370 | return 2; /* return open function and file name */ | ||
| 371 | } | ||
| 372 | else | ||
| 373 | return luaL_error(L, "error loading module " LUA_QS | ||
| 374 | " from file " LUA_QS ":\n\t%s", | ||
| 375 | lua_tostring(L, 1), filename, lua_tostring(L, -1)); | ||
| 370 | } | 376 | } |
| 371 | 377 | ||
| 372 | 378 | ||
| @@ -374,10 +380,8 @@ static int loader_Lua (lua_State *L) { | |||
| 374 | const char *filename; | 380 | const char *filename; |
| 375 | const char *name = luaL_checkstring(L, 1); | 381 | const char *name = luaL_checkstring(L, 1); |
| 376 | filename = findfile(L, name, "path"); | 382 | filename = findfile(L, name, "path"); |
| 377 | if (filename == NULL) return 1; /* library not found in this path */ | 383 | if (filename == NULL) return 1; /* module not found in this path */ |
| 378 | if (luaL_loadfile(L, filename) != LUA_OK) | 384 | return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); |
| 379 | loaderror(L, filename); | ||
| 380 | return 1; /* library loaded successfully */ | ||
| 381 | } | 385 | } |
| 382 | 386 | ||
| 383 | 387 | ||
| @@ -402,10 +406,8 @@ static int loadfunc (lua_State *L, const char *filename, const char *modname) { | |||
| 402 | static int loader_C (lua_State *L) { | 406 | static int loader_C (lua_State *L) { |
| 403 | const char *name = luaL_checkstring(L, 1); | 407 | const char *name = luaL_checkstring(L, 1); |
| 404 | const char *filename = findfile(L, name, "cpath"); | 408 | const char *filename = findfile(L, name, "cpath"); |
| 405 | if (filename == NULL) return 1; /* library not found in this path */ | 409 | if (filename == NULL) return 1; /* module not found in this path */ |
| 406 | if (loadfunc(L, filename, name) != 0) | 410 | return checkload(L, (loadfunc(L, filename, name) == 0), filename); |
| 407 | loaderror(L, filename); | ||
| 408 | return 1; /* library loaded successfully */ | ||
| 409 | } | 411 | } |
| 410 | 412 | ||
| 411 | 413 | ||
| @@ -419,12 +421,16 @@ static int loader_Croot (lua_State *L) { | |||
| 419 | filename = findfile(L, lua_tostring(L, -1), "cpath"); | 421 | filename = findfile(L, lua_tostring(L, -1), "cpath"); |
| 420 | if (filename == NULL) return 1; /* root not found */ | 422 | if (filename == NULL) return 1; /* root not found */ |
| 421 | if ((stat = loadfunc(L, filename, name)) != 0) { | 423 | if ((stat = loadfunc(L, filename, name)) != 0) { |
| 422 | if (stat != ERRFUNC) loaderror(L, filename); /* real error */ | 424 | if (stat != ERRFUNC) |
| 423 | lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, | 425 | return checkload(L, 0, filename); /* real error */ |
| 424 | name, filename); | 426 | else { /* open function not found */ |
| 425 | return 1; /* function not found */ | 427 | lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, |
| 428 | name, filename); | ||
| 429 | return 1; | ||
| 430 | } | ||
| 426 | } | 431 | } |
| 427 | return 1; | 432 | lua_pushstring(L, filename); /* will be 2nd argument to module */ |
| 433 | return 2; | ||
| 428 | } | 434 | } |
| 429 | 435 | ||
| 430 | 436 | ||
| @@ -457,16 +463,19 @@ static int ll_require (lua_State *L) { | |||
| 457 | luaL_error(L, "module " LUA_QS " not found:%s", | 463 | luaL_error(L, "module " LUA_QS " not found:%s", |
| 458 | name, lua_tostring(L, -2)); | 464 | name, lua_tostring(L, -2)); |
| 459 | lua_pushstring(L, name); | 465 | lua_pushstring(L, name); |
| 460 | lua_call(L, 1, 1); /* call it */ | 466 | lua_call(L, 1, 2); /* call it */ |
| 461 | if (lua_isfunction(L, -1)) /* did it find module? */ | 467 | if (lua_isfunction(L, -2)) /* did it find module? */ |
| 462 | break; /* module loaded successfully */ | 468 | break; /* module loaded successfully */ |
| 463 | else if (lua_isstring(L, -1)) /* loader returned error message? */ | 469 | else if (lua_isstring(L, -2)) { /* loader returned error message? */ |
| 464 | lua_concat(L, 2); /* accumulate it */ | 470 | lua_pop(L, 1); /* remove extra return */ |
| 471 | lua_concat(L, 2); /* accumulate error message */ | ||
| 472 | } | ||
| 465 | else | 473 | else |
| 466 | lua_pop(L, 1); | 474 | lua_pop(L, 2); /* remove both returns */ |
| 467 | } | 475 | } |
| 468 | lua_pushstring(L, name); /* pass name as argument to module */ | 476 | lua_pushstring(L, name); /* pass name as argument to module */ |
| 469 | lua_call(L, 1, 1); /* run loaded module */ | 477 | lua_insert(L, -2); /* name is 1st argument (before search data) */ |
| 478 | lua_call(L, 2, 1); /* run loaded module */ | ||
| 470 | if (!lua_isnil(L, -1)) /* non-nil return? */ | 479 | if (!lua_isnil(L, -1)) /* non-nil return? */ |
| 471 | lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ | 480 | lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ |
| 472 | lua_getfield(L, 2, name); | 481 | lua_getfield(L, 2, name); |
