diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-03-12 17:57:40 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-03-12 17:57:40 -0300 |
commit | a3addae03634794b841b6c8c4dd8ff83542d8896 (patch) | |
tree | 66695864f7bd56c295ad7cd6a6465845103cd424 | |
parent | ad40bb1181d08821af6789147a28aa8370533d11 (diff) | |
download | lua-a3addae03634794b841b6c8c4dd8ff83542d8896.tar.gz lua-a3addae03634794b841b6c8c4dd8ff83542d8896.tar.bz2 lua-a3addae03634794b841b6c8c4dd8ff83542d8896.zip |
lua_gettable and similars return type of gotten value
-rw-r--r-- | lapi.c | 20 | ||||
-rw-r--r-- | lauxlib.c | 18 | ||||
-rw-r--r-- | lbaselib.c | 5 | ||||
-rw-r--r-- | ldblib.c | 5 | ||||
-rw-r--r-- | loadlib.c | 16 | ||||
-rw-r--r-- | loslib.c | 5 | ||||
-rw-r--r-- | lua.h | 15 |
7 files changed, 40 insertions, 44 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 2.199 2014/02/25 14:30:21 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.200 2014/02/26 12:39:30 roberto Exp roberto $ |
3 | ** Lua API | 3 | ** Lua API |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -628,7 +628,7 @@ LUA_API int lua_pushthread (lua_State *L) { | |||
628 | */ | 628 | */ |
629 | 629 | ||
630 | 630 | ||
631 | LUA_API void lua_getglobal (lua_State *L, const char *var) { | 631 | LUA_API int lua_getglobal (lua_State *L, const char *var) { |
632 | Table *reg = hvalue(&G(L)->l_registry); | 632 | Table *reg = hvalue(&G(L)->l_registry); |
633 | const TValue *gt; /* global table */ | 633 | const TValue *gt; /* global table */ |
634 | lua_lock(L); | 634 | lua_lock(L); |
@@ -636,19 +636,21 @@ LUA_API void lua_getglobal (lua_State *L, const char *var) { | |||
636 | setsvalue2s(L, L->top++, luaS_new(L, var)); | 636 | setsvalue2s(L, L->top++, luaS_new(L, var)); |
637 | luaV_gettable(L, gt, L->top - 1, L->top - 1); | 637 | luaV_gettable(L, gt, L->top - 1, L->top - 1); |
638 | lua_unlock(L); | 638 | lua_unlock(L); |
639 | return ttnov(L->top - 1); | ||
639 | } | 640 | } |
640 | 641 | ||
641 | 642 | ||
642 | LUA_API void lua_gettable (lua_State *L, int idx) { | 643 | LUA_API int lua_gettable (lua_State *L, int idx) { |
643 | StkId t; | 644 | StkId t; |
644 | lua_lock(L); | 645 | lua_lock(L); |
645 | t = index2addr(L, idx); | 646 | t = index2addr(L, idx); |
646 | luaV_gettable(L, t, L->top - 1, L->top - 1); | 647 | luaV_gettable(L, t, L->top - 1, L->top - 1); |
647 | lua_unlock(L); | 648 | lua_unlock(L); |
649 | return ttnov(L->top - 1); | ||
648 | } | 650 | } |
649 | 651 | ||
650 | 652 | ||
651 | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { | 653 | LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { |
652 | StkId t; | 654 | StkId t; |
653 | lua_lock(L); | 655 | lua_lock(L); |
654 | t = index2addr(L, idx); | 656 | t = index2addr(L, idx); |
@@ -656,20 +658,22 @@ LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { | |||
656 | api_incr_top(L); | 658 | api_incr_top(L); |
657 | luaV_gettable(L, t, L->top - 1, L->top - 1); | 659 | luaV_gettable(L, t, L->top - 1, L->top - 1); |
658 | lua_unlock(L); | 660 | lua_unlock(L); |
661 | return ttnov(L->top - 1); | ||
659 | } | 662 | } |
660 | 663 | ||
661 | 664 | ||
662 | LUA_API void lua_rawget (lua_State *L, int idx) { | 665 | LUA_API int lua_rawget (lua_State *L, int idx) { |
663 | StkId t; | 666 | StkId t; |
664 | lua_lock(L); | 667 | lua_lock(L); |
665 | t = index2addr(L, idx); | 668 | t = index2addr(L, idx); |
666 | api_check(L, ttistable(t), "table expected"); | 669 | api_check(L, ttistable(t), "table expected"); |
667 | setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); | 670 | setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); |
668 | lua_unlock(L); | 671 | lua_unlock(L); |
672 | return ttnov(L->top - 1); | ||
669 | } | 673 | } |
670 | 674 | ||
671 | 675 | ||
672 | LUA_API void lua_rawgeti (lua_State *L, int idx, lua_Integer n) { | 676 | LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { |
673 | StkId t; | 677 | StkId t; |
674 | lua_lock(L); | 678 | lua_lock(L); |
675 | t = index2addr(L, idx); | 679 | t = index2addr(L, idx); |
@@ -677,10 +681,11 @@ LUA_API void lua_rawgeti (lua_State *L, int idx, lua_Integer n) { | |||
677 | setobj2s(L, L->top, luaH_getint(hvalue(t), n)); | 681 | setobj2s(L, L->top, luaH_getint(hvalue(t), n)); |
678 | api_incr_top(L); | 682 | api_incr_top(L); |
679 | lua_unlock(L); | 683 | lua_unlock(L); |
684 | return ttnov(L->top - 1); | ||
680 | } | 685 | } |
681 | 686 | ||
682 | 687 | ||
683 | LUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) { | 688 | LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { |
684 | StkId t; | 689 | StkId t; |
685 | TValue k; | 690 | TValue k; |
686 | lua_lock(L); | 691 | lua_lock(L); |
@@ -690,6 +695,7 @@ LUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) { | |||
690 | setobj2s(L, L->top, luaH_get(hvalue(t), &k)); | 695 | setobj2s(L, L->top, luaH_get(hvalue(t), &k)); |
691 | api_incr_top(L); | 696 | api_incr_top(L); |
692 | lua_unlock(L); | 697 | lua_unlock(L); |
698 | return ttnov(L->top - 1); | ||
693 | } | 699 | } |
694 | 700 | ||
695 | 701 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lauxlib.c,v 1.258 2014/02/11 17:39:15 roberto Exp roberto $ | 2 | ** $Id: lauxlib.c,v 1.259 2014/02/19 13:48:53 roberto Exp roberto $ |
3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -172,8 +172,7 @@ static int typeerror (lua_State *L, int arg, const char *tname) { | |||
172 | const char *msg; | 172 | const char *msg; |
173 | const char *typearg = luaL_typename(L, arg); | 173 | const char *typearg = luaL_typename(L, arg); |
174 | if (lua_getmetatable(L, arg)) { | 174 | if (lua_getmetatable(L, arg)) { |
175 | lua_getfield(L, -1, "__name"); | 175 | if (lua_getfield(L, -1, "__name") == LUA_TSTRING) |
176 | if (lua_isstring(L, -1)) | ||
177 | typearg = lua_tostring(L, -1); | 176 | typearg = lua_tostring(L, -1); |
178 | } | 177 | } |
179 | else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) | 178 | else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) |
@@ -719,8 +718,7 @@ LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { | |||
719 | if (!lua_getmetatable(L, obj)) /* no metatable? */ | 718 | if (!lua_getmetatable(L, obj)) /* no metatable? */ |
720 | return 0; | 719 | return 0; |
721 | lua_pushstring(L, event); | 720 | lua_pushstring(L, event); |
722 | lua_rawget(L, -2); | 721 | if (lua_rawget(L, -2) == LUA_TNIL) { /* is metafield nil? */ |
723 | if (lua_isnil(L, -1)) { | ||
724 | lua_pop(L, 2); /* remove metatable and metafield */ | 722 | lua_pop(L, 2); /* remove metatable and metafield */ |
725 | return 0; | 723 | return 0; |
726 | } | 724 | } |
@@ -802,8 +800,7 @@ static const char *luaL_findtable (lua_State *L, int idx, | |||
802 | e = strchr(fname, '.'); | 800 | e = strchr(fname, '.'); |
803 | if (e == NULL) e = fname + strlen(fname); | 801 | if (e == NULL) e = fname + strlen(fname); |
804 | lua_pushlstring(L, fname, e - fname); | 802 | lua_pushlstring(L, fname, e - fname); |
805 | lua_rawget(L, -2); | 803 | if (lua_rawget(L, -2) == LUA_TNIL) { /* no such field? */ |
806 | if (lua_isnil(L, -1)) { /* no such field? */ | ||
807 | lua_pop(L, 1); /* remove this nil */ | 804 | lua_pop(L, 1); /* remove this nil */ |
808 | lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ | 805 | lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ |
809 | lua_pushlstring(L, fname, e - fname); | 806 | lua_pushlstring(L, fname, e - fname); |
@@ -840,8 +837,7 @@ static int libsize (const luaL_Reg *l) { | |||
840 | LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, | 837 | LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, |
841 | int sizehint) { | 838 | int sizehint) { |
842 | luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ | 839 | luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ |
843 | lua_getfield(L, -1, modname); /* get _LOADED[modname] */ | 840 | if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no _LOADED[modname]? */ |
844 | if (!lua_istable(L, -1)) { /* not found? */ | ||
845 | lua_pop(L, 1); /* remove previous result */ | 841 | lua_pop(L, 1); /* remove previous result */ |
846 | /* try global variable (and create one if it does not exist) */ | 842 | /* try global variable (and create one if it does not exist) */ |
847 | lua_pushglobaltable(L); | 843 | lua_pushglobaltable(L); |
@@ -893,8 +889,8 @@ LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { | |||
893 | ** into the stack | 889 | ** into the stack |
894 | */ | 890 | */ |
895 | LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { | 891 | LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { |
896 | lua_getfield(L, idx, fname); | 892 | if (lua_getfield(L, idx, fname) == LUA_TTABLE) |
897 | if (lua_istable(L, -1)) return 1; /* table already there */ | 893 | return 1; /* table already there */ |
898 | else { | 894 | else { |
899 | lua_pop(L, 1); /* remove previous result */ | 895 | lua_pop(L, 1); /* remove previous result */ |
900 | idx = lua_absindex(L, idx); | 896 | idx = lua_absindex(L, idx); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lbaselib.c,v 1.283 2014/02/13 12:11:34 roberto Exp roberto $ | 2 | ** $Id: lbaselib.c,v 1.284 2014/02/14 16:45:38 roberto Exp roberto $ |
3 | ** Basic library | 3 | ** Basic library |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -246,8 +246,7 @@ static int ipairsaux (lua_State *L) { | |||
246 | luaL_checktype(L, 1, LUA_TTABLE); | 246 | luaL_checktype(L, 1, LUA_TTABLE); |
247 | i++; /* next value */ | 247 | i++; /* next value */ |
248 | lua_pushinteger(L, i); | 248 | lua_pushinteger(L, i); |
249 | lua_rawgeti(L, 1, i); | 249 | return (lua_rawgeti(L, 1, i) == LUA_TNIL) ? 1 : 2; |
250 | return (lua_isnil(L, -1)) ? 1 : 2; | ||
251 | } | 250 | } |
252 | 251 | ||
253 | 252 | ||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ldblib.c,v 1.135 2013/07/22 16:05:53 roberto Exp roberto $ | 2 | ** $Id: ldblib.c,v 1.136 2014/02/19 13:51:09 roberto Exp roberto $ |
3 | ** Interface from Lua to its debug API | 3 | ** Interface from Lua to its debug API |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -270,8 +270,7 @@ static void hookf (lua_State *L, lua_Debug *ar) { | |||
270 | {"call", "return", "line", "count", "tail call"}; | 270 | {"call", "return", "line", "count", "tail call"}; |
271 | gethooktable(L); | 271 | gethooktable(L); |
272 | lua_pushthread(L); | 272 | lua_pushthread(L); |
273 | lua_rawget(L, -2); | 273 | if (lua_rawget(L, -2) == LUA_TFUNCTION) { |
274 | if (lua_isfunction(L, -1)) { | ||
275 | lua_pushstring(L, hooknames[(int)ar->event]); | 274 | lua_pushstring(L, hooknames[(int)ar->event]); |
276 | if (ar->currentline >= 0) | 275 | if (ar->currentline >= 0) |
277 | lua_pushinteger(L, ar->currentline); | 276 | lua_pushinteger(L, ar->currentline); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: loadlib.c,v 1.111 2012/05/30 12:33:44 roberto Exp roberto $ | 2 | ** $Id: loadlib.c,v 1.112 2013/10/07 14:20:31 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 | ** |
@@ -468,8 +468,7 @@ static int searcher_Croot (lua_State *L) { | |||
468 | static int searcher_preload (lua_State *L) { | 468 | static int searcher_preload (lua_State *L) { |
469 | const char *name = luaL_checkstring(L, 1); | 469 | const char *name = luaL_checkstring(L, 1); |
470 | lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD"); | 470 | lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD"); |
471 | lua_getfield(L, -1, name); | 471 | if (lua_getfield(L, -1, name) == LUA_TNIL) /* not found? */ |
472 | if (lua_isnil(L, -1)) /* not found? */ | ||
473 | lua_pushfstring(L, "\n\tno field package.preload['%s']", name); | 472 | lua_pushfstring(L, "\n\tno field package.preload['%s']", name); |
474 | return 1; | 473 | return 1; |
475 | } | 474 | } |
@@ -484,8 +483,7 @@ static void findloader (lua_State *L, const char *name) { | |||
484 | luaL_error(L, LUA_QL("package.searchers") " must be a table"); | 483 | luaL_error(L, LUA_QL("package.searchers") " must be a table"); |
485 | /* iterate over available searchers to find a loader */ | 484 | /* iterate over available searchers to find a loader */ |
486 | for (i = 1; ; i++) { | 485 | for (i = 1; ; i++) { |
487 | lua_rawgeti(L, 3, i); /* get a searcher */ | 486 | if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */ |
488 | if (lua_isnil(L, -1)) { /* no more searchers? */ | ||
489 | lua_pop(L, 1); /* remove nil */ | 487 | lua_pop(L, 1); /* remove nil */ |
490 | luaL_pushresult(&msg); /* create error message */ | 488 | luaL_pushresult(&msg); /* create error message */ |
491 | luaL_error(L, "module " LUA_QS " not found:%s", | 489 | luaL_error(L, "module " LUA_QS " not found:%s", |
@@ -520,8 +518,7 @@ static int ll_require (lua_State *L) { | |||
520 | lua_call(L, 2, 1); /* run loader to load module */ | 518 | lua_call(L, 2, 1); /* run loader to load module */ |
521 | if (!lua_isnil(L, -1)) /* non-nil return? */ | 519 | if (!lua_isnil(L, -1)) /* non-nil return? */ |
522 | lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ | 520 | lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ |
523 | lua_getfield(L, 2, name); | 521 | if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */ |
524 | if (lua_isnil(L, -1)) { /* module did not set a value? */ | ||
525 | lua_pushboolean(L, 1); /* use true as result */ | 522 | lua_pushboolean(L, 1); /* use true as result */ |
526 | lua_pushvalue(L, -1); /* extra copy to be returned */ | 523 | lua_pushvalue(L, -1); /* extra copy to be returned */ |
527 | lua_setfield(L, 2, name); /* _LOADED[name] = true */ | 524 | lua_setfield(L, 2, name); /* _LOADED[name] = true */ |
@@ -587,9 +584,8 @@ static int ll_module (lua_State *L) { | |||
587 | int lastarg = lua_gettop(L); /* last parameter */ | 584 | int lastarg = lua_gettop(L); /* last parameter */ |
588 | luaL_pushmodule(L, modname, 1); /* get/create module table */ | 585 | luaL_pushmodule(L, modname, 1); /* get/create module table */ |
589 | /* check whether table already has a _NAME field */ | 586 | /* check whether table already has a _NAME field */ |
590 | lua_getfield(L, -1, "_NAME"); | 587 | if (lua_getfield(L, -1, "_NAME") != LUA_TNIL) |
591 | if (!lua_isnil(L, -1)) /* is table an initialized module? */ | 588 | lua_pop(L, 1); /* table is an initialized module */ |
592 | lua_pop(L, 1); | ||
593 | else { /* no; initialize it */ | 589 | else { /* no; initialize it */ |
594 | lua_pop(L, 1); | 590 | lua_pop(L, 1); |
595 | modinit(L, modname); | 591 | modinit(L, modname); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: loslib.c,v 1.42 2014/02/26 15:27:56 roberto Exp roberto $ | 2 | ** $Id: loslib.c,v 1.43 2014/02/26 15:55:58 roberto Exp roberto $ |
3 | ** Standard Operating System library | 3 | ** Standard Operating System library |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -158,8 +158,7 @@ static void setboolfield (lua_State *L, const char *key, int value) { | |||
158 | 158 | ||
159 | static int getboolfield (lua_State *L, const char *key) { | 159 | static int getboolfield (lua_State *L, const char *key) { |
160 | int res; | 160 | int res; |
161 | lua_getfield(L, -1, key); | 161 | res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); |
162 | res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); | ||
163 | lua_pop(L, 1); | 162 | lua_pop(L, 1); |
164 | return res; | 163 | return res; |
165 | } | 164 | } |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lua.h,v 1.299 2014/02/13 12:11:34 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.300 2014/02/25 14:30:21 roberto Exp roberto $ |
3 | ** Lua - A Scripting Language | 3 | ** Lua - A Scripting Language |
4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) | 4 | ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) |
5 | ** See Copyright Notice at the end of this file | 5 | ** See Copyright Notice at the end of this file |
@@ -228,12 +228,13 @@ LUA_API int (lua_pushthread) (lua_State *L); | |||
228 | /* | 228 | /* |
229 | ** get functions (Lua -> stack) | 229 | ** get functions (Lua -> stack) |
230 | */ | 230 | */ |
231 | LUA_API void (lua_getglobal) (lua_State *L, const char *var); | 231 | LUA_API int (lua_getglobal) (lua_State *L, const char *var); |
232 | LUA_API void (lua_gettable) (lua_State *L, int idx); | 232 | LUA_API int (lua_gettable) (lua_State *L, int idx); |
233 | LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); | 233 | LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); |
234 | LUA_API void (lua_rawget) (lua_State *L, int idx); | 234 | LUA_API int (lua_rawget) (lua_State *L, int idx); |
235 | LUA_API void (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); | 235 | LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); |
236 | LUA_API void (lua_rawgetp) (lua_State *L, int idx, const void *p); | 236 | LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); |
237 | |||
237 | LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); | 238 | LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); |
238 | LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); | 239 | LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); |
239 | LUA_API int (lua_getmetatable) (lua_State *L, int objindex); | 240 | LUA_API int (lua_getmetatable) (lua_State *L, int objindex); |