diff options
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 61 |
1 files changed, 30 insertions, 31 deletions
| @@ -666,47 +666,45 @@ LUA_API int lua_pushthread (lua_State *L) { | |||
| 666 | 666 | ||
| 667 | 667 | ||
| 668 | static int auxgetstr (lua_State *L, const TValue *t, const char *k) { | 668 | static int auxgetstr (lua_State *L, const TValue *t, const char *k) { |
| 669 | int hres; | 669 | TValue aux; |
| 670 | TString *str = luaS_new(L, k); | 670 | TString *str = luaS_new(L, k); |
| 671 | luaV_fastget(t, str, s2v(L->top.p), luaH_getstr, hres); | 671 | luaV_fastget(t, str, s2v(L->top.p), luaH_getstr, aux); |
| 672 | if (hres == HOK) { | 672 | if (!isemptyV(aux)) { |
| 673 | api_incr_top(L); | 673 | api_incr_top(L); |
| 674 | } | 674 | } |
| 675 | else { | 675 | else { |
| 676 | setsvalue2s(L, L->top.p, str); | 676 | setsvalue2s(L, L->top.p, str); |
| 677 | api_incr_top(L); | 677 | api_incr_top(L); |
| 678 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, hres); | 678 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, aux); |
| 679 | } | 679 | } |
| 680 | lua_unlock(L); | 680 | lua_unlock(L); |
| 681 | return ttype(s2v(L->top.p - 1)); | 681 | return ttype(s2v(L->top.p - 1)); |
| 682 | } | 682 | } |
| 683 | 683 | ||
| 684 | 684 | ||
| 685 | static void getGlobalTable (lua_State *L, TValue *gt) { | 685 | static TValue getGlobalTable (lua_State *L) { |
| 686 | Table *registry = hvalue(&G(L)->l_registry); | 686 | Table *registry = hvalue(&G(L)->l_registry); |
| 687 | int hres = luaH_getint(registry, LUA_RIDX_GLOBALS, gt); | 687 | return luaH_getint(registry, LUA_RIDX_GLOBALS); |
| 688 | (void)hres; /* avoid warnings (not used) when checks are off */ | ||
| 689 | api_check(L, hres == HOK, "global table must exist"); | ||
| 690 | } | 688 | } |
| 691 | 689 | ||
| 692 | 690 | ||
| 693 | LUA_API int lua_getglobal (lua_State *L, const char *name) { | 691 | LUA_API int lua_getglobal (lua_State *L, const char *name) { |
| 694 | TValue gt; | 692 | TValue gt; |
| 695 | lua_lock(L); | 693 | lua_lock(L); |
| 696 | getGlobalTable(L, >); | 694 | gt = getGlobalTable(L); |
| 697 | return auxgetstr(L, >, name); | 695 | return auxgetstr(L, >, name); |
| 698 | } | 696 | } |
| 699 | 697 | ||
| 700 | 698 | ||
| 701 | LUA_API int lua_gettable (lua_State *L, int idx) { | 699 | LUA_API int lua_gettable (lua_State *L, int idx) { |
| 702 | int hres; | 700 | TValue aux; |
| 703 | TValue *t; | 701 | TValue *t; |
| 704 | lua_lock(L); | 702 | lua_lock(L); |
| 705 | api_checkpop(L, 1); | 703 | api_checkpop(L, 1); |
| 706 | t = index2value(L, idx); | 704 | t = index2value(L, idx); |
| 707 | luaV_fastget(t, s2v(L->top.p - 1), s2v(L->top.p - 1), luaH_get, hres); | 705 | luaV_fastget(t, s2v(L->top.p - 1), s2v(L->top.p - 1), luaH_get, aux); |
| 708 | if (hres != HOK) | 706 | if (isemptyV(aux)) |
| 709 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, hres); | 707 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, aux); |
| 710 | lua_unlock(L); | 708 | lua_unlock(L); |
| 711 | return ttype(s2v(L->top.p - 1)); | 709 | return ttype(s2v(L->top.p - 1)); |
| 712 | } | 710 | } |
| @@ -720,14 +718,14 @@ LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { | |||
| 720 | 718 | ||
| 721 | LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | 719 | LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { |
| 722 | TValue *t; | 720 | TValue *t; |
| 723 | int hres; | 721 | TValue aux; |
| 724 | lua_lock(L); | 722 | lua_lock(L); |
| 725 | t = index2value(L, idx); | 723 | t = index2value(L, idx); |
| 726 | luaV_fastgeti(t, n, s2v(L->top.p), hres); | 724 | luaV_fastgeti(t, n, s2v(L->top.p), aux); |
| 727 | if (hres != HOK) { | 725 | if (isemptyV(aux)) { |
| 728 | TValue key; | 726 | TValue key; |
| 729 | setivalue(&key, n); | 727 | setivalue(&key, n); |
| 730 | luaV_finishget(L, t, &key, L->top.p, hres); | 728 | luaV_finishget(L, t, &key, L->top.p, aux); |
| 731 | } | 729 | } |
| 732 | api_incr_top(L); | 730 | api_incr_top(L); |
| 733 | lua_unlock(L); | 731 | lua_unlock(L); |
| @@ -735,12 +733,14 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | |||
| 735 | } | 733 | } |
| 736 | 734 | ||
| 737 | 735 | ||
| 738 | l_sinline int finishrawget (lua_State *L, int hres) { | 736 | l_sinline int finishrawget (lua_State *L, TValue res) { |
| 739 | if (hres != HOK) /* avoid copying empty items to the stack */ | 737 | if (isemptyV(res)) /* avoid copying empty items to the stack */ |
| 740 | setnilvalue(s2v(L->top.p)); | 738 | setnilvalue(s2v(L->top.p)); |
| 739 | else | ||
| 740 | setobjV(L, s2v(L->top.p), res); | ||
| 741 | api_incr_top(L); | 741 | api_incr_top(L); |
| 742 | lua_unlock(L); | 742 | lua_unlock(L); |
| 743 | return ttype(s2v(L->top.p - 1)); | 743 | return ttypeV(res); |
| 744 | } | 744 | } |
| 745 | 745 | ||
| 746 | 746 | ||
| @@ -753,23 +753,23 @@ l_sinline Table *gettable (lua_State *L, int idx) { | |||
| 753 | 753 | ||
| 754 | LUA_API int lua_rawget (lua_State *L, int idx) { | 754 | LUA_API int lua_rawget (lua_State *L, int idx) { |
| 755 | Table *t; | 755 | Table *t; |
| 756 | TValue res; | ||
| 756 | lua_lock(L); | 757 | lua_lock(L); |
| 757 | api_checkpop(L, 1); | 758 | api_checkpop(L, 1); |
| 758 | t = gettable(L, idx); | 759 | t = gettable(L, idx); |
| 759 | if (luaH_get(t, s2v(L->top.p - 1), s2v(L->top.p - 1)) != HOK) | 760 | res = luaH_get(t, s2v(L->top.p - 1)); |
| 760 | setnilvalue(s2v(L->top.p - 1)); | 761 | L->top.p--; /* pop key */ |
| 761 | lua_unlock(L); | 762 | return finishrawget(L, res); |
| 762 | return ttype(s2v(L->top.p - 1)); | ||
| 763 | } | 763 | } |
| 764 | 764 | ||
| 765 | 765 | ||
| 766 | LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { | 766 | LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { |
| 767 | Table *t; | 767 | Table *t; |
| 768 | int hres; | 768 | TValue aux; |
| 769 | lua_lock(L); | 769 | lua_lock(L); |
| 770 | t = gettable(L, idx); | 770 | t = gettable(L, idx); |
| 771 | luaH_fastgeti(t, n, s2v(L->top.p), hres); | 771 | luaH_fastgeti(t, n, s2v(L->top.p), aux); |
| 772 | return finishrawget(L, hres); | 772 | return finishrawget(L, aux); |
| 773 | } | 773 | } |
| 774 | 774 | ||
| 775 | 775 | ||
| @@ -779,7 +779,7 @@ LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { | |||
| 779 | lua_lock(L); | 779 | lua_lock(L); |
| 780 | t = gettable(L, idx); | 780 | t = gettable(L, idx); |
| 781 | setpvalue(&k, cast_voidp(p)); | 781 | setpvalue(&k, cast_voidp(p)); |
| 782 | return finishrawget(L, luaH_get(t, &k, s2v(L->top.p))); | 782 | return finishrawget(L, luaH_get(t, &k)); |
| 783 | } | 783 | } |
| 784 | 784 | ||
| 785 | 785 | ||
| @@ -872,7 +872,7 @@ static void auxsetstr (lua_State *L, const TValue *t, const char *k) { | |||
| 872 | LUA_API void lua_setglobal (lua_State *L, const char *name) { | 872 | LUA_API void lua_setglobal (lua_State *L, const char *name) { |
| 873 | TValue gt; | 873 | TValue gt; |
| 874 | lua_lock(L); /* unlock done in 'auxsetstr' */ | 874 | lua_lock(L); /* unlock done in 'auxsetstr' */ |
| 875 | getGlobalTable(L, >); | 875 | gt = getGlobalTable(L); |
| 876 | auxsetstr(L, >, name); | 876 | auxsetstr(L, >, name); |
| 877 | } | 877 | } |
| 878 | 878 | ||
| @@ -1122,8 +1122,7 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, | |||
| 1122 | LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ | 1122 | LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ |
| 1123 | if (f->nupvalues >= 1) { /* does it have an upvalue? */ | 1123 | if (f->nupvalues >= 1) { /* does it have an upvalue? */ |
| 1124 | /* get global table from registry */ | 1124 | /* get global table from registry */ |
| 1125 | TValue gt; | 1125 | TValue gt = getGlobalTable(L); |
| 1126 | getGlobalTable(L, >); | ||
| 1127 | /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ | 1126 | /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ |
| 1128 | setobj(L, f->upvals[0]->v.p, >); | 1127 | setobj(L, f->upvals[0]->v.p, >); |
| 1129 | luaC_barrier(L, f->upvals[0], >); | 1128 | luaC_barrier(L, f->upvals[0], >); |
