diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-07-11 12:53:29 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2006-07-11 12:53:29 -0300 |
commit | 3ca9af51a4f060cf2178901a67a21f8269af3224 (patch) | |
tree | 4f1bb541280aa8b4960b16d0925eca60adb2b1a8 /lapi.c | |
parent | c7b89dd28097296bbc14d9b47b4cea72514b2b76 (diff) | |
download | lua-3ca9af51a4f060cf2178901a67a21f8269af3224.tar.gz lua-3ca9af51a4f060cf2178901a67a21f8269af3224.tar.bz2 lua-3ca9af51a4f060cf2178901a67a21f8269af3224.zip |
emergency garbage collector (core forces a GC when allocation fails)
Diffstat (limited to 'lapi.c')
-rw-r--r-- | lapi.c | 44 |
1 files changed, 12 insertions, 32 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 2.54 2006/06/02 15:34:00 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.55 2006/06/07 12:37:17 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 | */ |
@@ -42,9 +42,6 @@ const char lua_ident[] = | |||
42 | 42 | ||
43 | #define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) | 43 | #define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) |
44 | 44 | ||
45 | #define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} | ||
46 | |||
47 | |||
48 | 45 | ||
49 | static TValue *index2adr (lua_State *L, int idx) { | 46 | static TValue *index2adr (lua_State *L, int idx) { |
50 | if (idx > 0) { | 47 | if (idx > 0) { |
@@ -86,12 +83,6 @@ static Table *getcurrenv (lua_State *L) { | |||
86 | } | 83 | } |
87 | 84 | ||
88 | 85 | ||
89 | void luaA_pushobject (lua_State *L, const TValue *o) { | ||
90 | setobj2s(L, L->top, o); | ||
91 | api_incr_top(L); | ||
92 | } | ||
93 | |||
94 | |||
95 | LUA_API int lua_checkstack (lua_State *L, int size) { | 86 | LUA_API int lua_checkstack (lua_State *L, int size) { |
96 | int res; | 87 | int res; |
97 | lua_lock(L); | 88 | lua_lock(L); |
@@ -133,19 +124,6 @@ LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { | |||
133 | } | 124 | } |
134 | 125 | ||
135 | 126 | ||
136 | LUA_API lua_State *lua_newthread (lua_State *L) { | ||
137 | lua_State *L1; | ||
138 | lua_lock(L); | ||
139 | luaC_checkGC(L); | ||
140 | L1 = luaE_newthread(L); | ||
141 | setthvalue(L, L->top, L1); | ||
142 | api_incr_top(L); | ||
143 | lua_unlock(L); | ||
144 | luai_userstatethread(L, L1); | ||
145 | return L1; | ||
146 | } | ||
147 | |||
148 | |||
149 | 127 | ||
150 | /* | 128 | /* |
151 | ** basic stack manipulation | 129 | ** basic stack manipulation |
@@ -539,13 +517,12 @@ LUA_API void lua_gettable (lua_State *L, int idx) { | |||
539 | 517 | ||
540 | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { | 518 | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { |
541 | StkId t; | 519 | StkId t; |
542 | TValue key; | ||
543 | lua_lock(L); | 520 | lua_lock(L); |
544 | t = index2adr(L, idx); | 521 | t = index2adr(L, idx); |
545 | api_checkvalidindex(L, t); | 522 | api_checkvalidindex(L, t); |
546 | setsvalue(L, &key, luaS_new(L, k)); | 523 | setsvalue2s(L, L->top, luaS_new(L, k)); |
547 | luaV_gettable(L, t, &key, L->top); | ||
548 | api_incr_top(L); | 524 | api_incr_top(L); |
525 | luaV_gettable(L, t, L->top - 1, L->top - 1); | ||
549 | lua_unlock(L); | 526 | lua_unlock(L); |
550 | } | 527 | } |
551 | 528 | ||
@@ -572,10 +549,14 @@ LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { | |||
572 | 549 | ||
573 | 550 | ||
574 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { | 551 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { |
552 | Table *t; | ||
575 | lua_lock(L); | 553 | lua_lock(L); |
576 | luaC_checkGC(L); | 554 | luaC_checkGC(L); |
577 | sethvalue(L, L->top, luaH_new(L, narray, nrec)); | 555 | t = luaH_new(L); |
556 | sethvalue(L, L->top, t); | ||
578 | api_incr_top(L); | 557 | api_incr_top(L); |
558 | if (narray > 0 || nrec > 0) | ||
559 | luaH_resize(L, t, narray, nrec); | ||
579 | lua_unlock(L); | 560 | lua_unlock(L); |
580 | } | 561 | } |
581 | 562 | ||
@@ -652,14 +633,13 @@ LUA_API void lua_settable (lua_State *L, int idx) { | |||
652 | 633 | ||
653 | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { | 634 | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { |
654 | StkId t; | 635 | StkId t; |
655 | TValue key; | ||
656 | lua_lock(L); | 636 | lua_lock(L); |
657 | api_checknelems(L, 1); | 637 | api_checknelems(L, 1); |
658 | t = index2adr(L, idx); | 638 | t = index2adr(L, idx); |
659 | api_checkvalidindex(L, t); | 639 | api_checkvalidindex(L, t); |
660 | setsvalue(L, &key, luaS_new(L, k)); | 640 | setsvalue2s(L, L->top++, luaS_new(L, k)); |
661 | luaV_settable(L, t, &key, L->top - 1); | 641 | luaV_settable(L, t, L->top - 1, L->top - 2); |
662 | L->top--; /* pop value */ | 642 | L->top -= 2; /* pop value and key */ |
663 | lua_unlock(L); | 643 | lua_unlock(L); |
664 | } | 644 | } |
665 | 645 | ||
@@ -907,7 +887,7 @@ LUA_API int lua_gc (lua_State *L, int what, int data) { | |||
907 | break; | 887 | break; |
908 | } | 888 | } |
909 | case LUA_GCCOLLECT: { | 889 | case LUA_GCCOLLECT: { |
910 | luaC_fullgc(L); | 890 | luaC_fullgc(L, 0); |
911 | break; | 891 | break; |
912 | } | 892 | } |
913 | case LUA_GCCOUNT: { | 893 | case LUA_GCCOUNT: { |