diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-11-07 17:26:15 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2023-11-07 17:26:15 -0300 |
commit | 37c215b43f27a1c41e8a920987e1c3bd7b34330d (patch) | |
tree | f14f4417384cffb9d2e5ef3c09621555a5d1e9a2 /lapi.c | |
parent | 9e99f3071d07767f9e882c4abf3537f75ce2d161 (diff) | |
parent | fa075b79530af1cbc977349f2e467d69ce01202c (diff) | |
download | lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.gz lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.tar.bz2 lua-37c215b43f27a1c41e8a920987e1c3bd7b34330d.zip |
Merge branch 'newarray' into nextversion
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 110 |
1 files changed, 52 insertions, 58 deletions
@@ -637,50 +637,44 @@ LUA_API int lua_pushthread (lua_State *L) { | |||
637 | 637 | ||
638 | 638 | ||
639 | l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) { | 639 | l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) { |
640 | const TValue *slot; | 640 | int hres; |
641 | TString *str = luaS_new(L, k); | 641 | TString *str = luaS_new(L, k); |
642 | if (luaV_fastget(L, t, str, slot, luaH_getstr)) { | 642 | luaV_fastget(t, str, s2v(L->top.p), luaH_getstr, hres); |
643 | setobj2s(L, L->top.p, slot); | 643 | if (hres == HOK) { |
644 | api_incr_top(L); | 644 | api_incr_top(L); |
645 | } | 645 | } |
646 | else { | 646 | else { |
647 | setsvalue2s(L, L->top.p, str); | 647 | setsvalue2s(L, L->top.p, str); |
648 | api_incr_top(L); | 648 | api_incr_top(L); |
649 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); | 649 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, hres); |
650 | } | 650 | } |
651 | lua_unlock(L); | 651 | lua_unlock(L); |
652 | return ttype(s2v(L->top.p - 1)); | 652 | return ttype(s2v(L->top.p - 1)); |
653 | } | 653 | } |
654 | 654 | ||
655 | 655 | ||
656 | /* | 656 | static void getGlobalTable (lua_State *L, TValue *gt) { |
657 | ** Get the global table in the registry. Since all predefined | 657 | Table *registry = hvalue(&G(L)->l_registry); |
658 | ** indices in the registry were inserted right when the registry | 658 | luaH_getint(registry, LUA_RIDX_GLOBALS, gt); |
659 | ** was created and never removed, they must always be in the array | 659 | } |
660 | ** part of the registry. | ||
661 | */ | ||
662 | #define getGtable(L) \ | ||
663 | (&hvalue(&G(L)->l_registry)->array[LUA_RIDX_GLOBALS - 1]) | ||
664 | 660 | ||
665 | 661 | ||
666 | LUA_API int lua_getglobal (lua_State *L, const char *name) { | 662 | LUA_API int lua_getglobal (lua_State *L, const char *name) { |
667 | const TValue *G; | 663 | TValue gt; |
668 | lua_lock(L); | 664 | lua_lock(L); |
669 | G = getGtable(L); | 665 | getGlobalTable(L, >); |
670 | return auxgetstr(L, G, name); | 666 | return auxgetstr(L, >, name); |
671 | } | 667 | } |
672 | 668 | ||
673 | 669 | ||
674 | LUA_API int lua_gettable (lua_State *L, int idx) { | 670 | LUA_API int lua_gettable (lua_State *L, int idx) { |
675 | const TValue *slot; | 671 | int hres; |
676 | TValue *t; | 672 | TValue *t; |
677 | lua_lock(L); | 673 | lua_lock(L); |
678 | t = index2value(L, idx); | 674 | t = index2value(L, idx); |
679 | if (luaV_fastget(L, t, s2v(L->top.p - 1), slot, luaH_get)) { | 675 | luaV_fastget(t, s2v(L->top.p - 1), s2v(L->top.p - 1), luaH_get, hres); |
680 | setobj2s(L, L->top.p - 1, slot); | 676 | if (hres != HOK) |
681 | } | 677 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, hres); |
682 | else | ||
683 | luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); | ||
684 | lua_unlock(L); | 678 | lua_unlock(L); |
685 | return ttype(s2v(L->top.p - 1)); | 679 | return ttype(s2v(L->top.p - 1)); |
686 | } | 680 | } |
@@ -694,16 +688,14 @@ LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { | |||
694 | 688 | ||
695 | LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | 689 | LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { |
696 | TValue *t; | 690 | TValue *t; |
697 | const TValue *slot; | 691 | int hres; |
698 | lua_lock(L); | 692 | lua_lock(L); |
699 | t = index2value(L, idx); | 693 | t = index2value(L, idx); |
700 | if (luaV_fastgeti(L, t, n, slot)) { | 694 | luaV_fastgeti(t, n, s2v(L->top.p), hres); |
701 | setobj2s(L, L->top.p, slot); | 695 | if (hres != HOK) { |
702 | } | 696 | TValue key; |
703 | else { | 697 | setivalue(&key, n); |
704 | TValue aux; | 698 | luaV_finishget(L, t, &key, L->top.p, hres); |
705 | setivalue(&aux, n); | ||
706 | luaV_finishget(L, t, &aux, L->top.p, slot); | ||
707 | } | 699 | } |
708 | api_incr_top(L); | 700 | api_incr_top(L); |
709 | lua_unlock(L); | 701 | lua_unlock(L); |
@@ -711,11 +703,9 @@ LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { | |||
711 | } | 703 | } |
712 | 704 | ||
713 | 705 | ||
714 | l_sinline int finishrawget (lua_State *L, const TValue *val) { | 706 | l_sinline int finishrawget (lua_State *L, int hres) { |
715 | if (isempty(val)) /* avoid copying empty items to the stack */ | 707 | if (hres != HOK) /* avoid copying empty items to the stack */ |
716 | setnilvalue(s2v(L->top.p)); | 708 | setnilvalue(s2v(L->top.p)); |
717 | else | ||
718 | setobj2s(L, L->top.p, val); | ||
719 | api_incr_top(L); | 709 | api_incr_top(L); |
720 | lua_unlock(L); | 710 | lua_unlock(L); |
721 | return ttype(s2v(L->top.p - 1)); | 711 | return ttype(s2v(L->top.p - 1)); |
@@ -731,13 +721,13 @@ static Table *gettable (lua_State *L, int idx) { | |||
731 | 721 | ||
732 | LUA_API int lua_rawget (lua_State *L, int idx) { | 722 | LUA_API int lua_rawget (lua_State *L, int idx) { |
733 | Table *t; | 723 | Table *t; |
734 | const TValue *val; | 724 | int hres; |
735 | lua_lock(L); | 725 | lua_lock(L); |
736 | api_checknelems(L, 1); | 726 | api_checknelems(L, 1); |
737 | t = gettable(L, idx); | 727 | t = gettable(L, idx); |
738 | val = luaH_get(t, s2v(L->top.p - 1)); | 728 | hres = luaH_get(t, s2v(L->top.p - 1), s2v(L->top.p - 1)); |
739 | L->top.p--; /* remove key */ | 729 | L->top.p--; /* remove key */ |
740 | return finishrawget(L, val); | 730 | return finishrawget(L, hres); |
741 | } | 731 | } |
742 | 732 | ||
743 | 733 | ||
@@ -745,7 +735,7 @@ LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { | |||
745 | Table *t; | 735 | Table *t; |
746 | lua_lock(L); | 736 | lua_lock(L); |
747 | t = gettable(L, idx); | 737 | t = gettable(L, idx); |
748 | return finishrawget(L, luaH_getint(t, n)); | 738 | return finishrawget(L, luaH_getint(t, n, s2v(L->top.p))); |
749 | } | 739 | } |
750 | 740 | ||
751 | 741 | ||
@@ -755,7 +745,7 @@ LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { | |||
755 | lua_lock(L); | 745 | lua_lock(L); |
756 | t = gettable(L, idx); | 746 | t = gettable(L, idx); |
757 | setpvalue(&k, cast_voidp(p)); | 747 | setpvalue(&k, cast_voidp(p)); |
758 | return finishrawget(L, luaH_get(t, &k)); | 748 | return finishrawget(L, luaH_get(t, &k, s2v(L->top.p))); |
759 | } | 749 | } |
760 | 750 | ||
761 | 751 | ||
@@ -827,17 +817,18 @@ LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { | |||
827 | ** t[k] = value at the top of the stack (where 'k' is a string) | 817 | ** t[k] = value at the top of the stack (where 'k' is a string) |
828 | */ | 818 | */ |
829 | static void auxsetstr (lua_State *L, const TValue *t, const char *k) { | 819 | static void auxsetstr (lua_State *L, const TValue *t, const char *k) { |
830 | const TValue *slot; | 820 | int hres; |
831 | TString *str = luaS_new(L, k); | 821 | TString *str = luaS_new(L, k); |
832 | api_checknelems(L, 1); | 822 | api_checknelems(L, 1); |
833 | if (luaV_fastget(L, t, str, slot, luaH_getstr)) { | 823 | luaV_fastset(t, str, s2v(L->top.p - 1), hres, luaH_psetstr); |
834 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 824 | if (hres == HOK) { |
825 | luaV_finishfastset(L, t, s2v(L->top.p - 1)); | ||
835 | L->top.p--; /* pop value */ | 826 | L->top.p--; /* pop value */ |
836 | } | 827 | } |
837 | else { | 828 | else { |
838 | setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ | 829 | setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ |
839 | api_incr_top(L); | 830 | api_incr_top(L); |
840 | luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), slot); | 831 | luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), hres); |
841 | L->top.p -= 2; /* pop value and key */ | 832 | L->top.p -= 2; /* pop value and key */ |
842 | } | 833 | } |
843 | lua_unlock(L); /* lock done by caller */ | 834 | lua_unlock(L); /* lock done by caller */ |
@@ -845,24 +836,25 @@ static void auxsetstr (lua_State *L, const TValue *t, const char *k) { | |||
845 | 836 | ||
846 | 837 | ||
847 | LUA_API void lua_setglobal (lua_State *L, const char *name) { | 838 | LUA_API void lua_setglobal (lua_State *L, const char *name) { |
848 | const TValue *G; | 839 | TValue gt; |
849 | lua_lock(L); /* unlock done in 'auxsetstr' */ | 840 | lua_lock(L); /* unlock done in 'auxsetstr' */ |
850 | G = getGtable(L); | 841 | getGlobalTable(L, >); |
851 | auxsetstr(L, G, name); | 842 | auxsetstr(L, >, name); |
852 | } | 843 | } |
853 | 844 | ||
854 | 845 | ||
855 | LUA_API void lua_settable (lua_State *L, int idx) { | 846 | LUA_API void lua_settable (lua_State *L, int idx) { |
856 | TValue *t; | 847 | TValue *t; |
857 | const TValue *slot; | 848 | int hres; |
858 | lua_lock(L); | 849 | lua_lock(L); |
859 | api_checknelems(L, 2); | 850 | api_checknelems(L, 2); |
860 | t = index2value(L, idx); | 851 | t = index2value(L, idx); |
861 | if (luaV_fastget(L, t, s2v(L->top.p - 2), slot, luaH_get)) { | 852 | luaV_fastset(t, s2v(L->top.p - 2), s2v(L->top.p - 1), hres, luaH_pset); |
862 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 853 | if (hres == HOK) { |
854 | luaV_finishfastset(L, t, s2v(L->top.p - 1)); | ||
863 | } | 855 | } |
864 | else | 856 | else |
865 | luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), slot); | 857 | luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), hres); |
866 | L->top.p -= 2; /* pop index and value */ | 858 | L->top.p -= 2; /* pop index and value */ |
867 | lua_unlock(L); | 859 | lua_unlock(L); |
868 | } | 860 | } |
@@ -876,17 +868,18 @@ LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { | |||
876 | 868 | ||
877 | LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { | 869 | LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { |
878 | TValue *t; | 870 | TValue *t; |
879 | const TValue *slot; | 871 | int hres; |
880 | lua_lock(L); | 872 | lua_lock(L); |
881 | api_checknelems(L, 1); | 873 | api_checknelems(L, 1); |
882 | t = index2value(L, idx); | 874 | t = index2value(L, idx); |
883 | if (luaV_fastgeti(L, t, n, slot)) { | 875 | luaV_fastseti(t, n, s2v(L->top.p - 1), hres); |
884 | luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); | 876 | if (hres == HOK) { |
877 | luaV_finishfastset(L, t, s2v(L->top.p - 1)); | ||
885 | } | 878 | } |
886 | else { | 879 | else { |
887 | TValue aux; | 880 | TValue temp; |
888 | setivalue(&aux, n); | 881 | setivalue(&temp, n); |
889 | luaV_finishset(L, t, &aux, s2v(L->top.p - 1), slot); | 882 | luaV_finishset(L, t, &temp, s2v(L->top.p - 1), hres); |
890 | } | 883 | } |
891 | L->top.p--; /* pop value */ | 884 | L->top.p--; /* pop value */ |
892 | lua_unlock(L); | 885 | lua_unlock(L); |
@@ -1096,10 +1089,11 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, | |||
1096 | LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ | 1089 | LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ |
1097 | if (f->nupvalues >= 1) { /* does it have an upvalue? */ | 1090 | if (f->nupvalues >= 1) { /* does it have an upvalue? */ |
1098 | /* get global table from registry */ | 1091 | /* get global table from registry */ |
1099 | const TValue *gt = getGtable(L); | 1092 | TValue gt; |
1093 | getGlobalTable(L, >); | ||
1100 | /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ | 1094 | /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ |
1101 | setobj(L, f->upvals[0]->v.p, gt); | 1095 | setobj(L, f->upvals[0]->v.p, >); |
1102 | luaC_barrier(L, f->upvals[0], gt); | 1096 | luaC_barrier(L, f->upvals[0], >); |
1103 | } | 1097 | } |
1104 | } | 1098 | } |
1105 | lua_unlock(L); | 1099 | lua_unlock(L); |