summaryrefslogtreecommitdiff
path: root/apps/plugins/lua/ldo.c
diff options
context:
space:
mode:
authorWilliam Wilgus <me.theuser@yahoo.com>2019-07-12 05:23:52 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2019-07-28 15:17:48 +0200
commit45bd14b392622cb58e967a24e4652c510b3d43e4 (patch)
tree22bd2e5cafc2d82ecc4773f83de7f86515b4db43 /apps/plugins/lua/ldo.c
parent4beafe16fafc2e5c59734ef065a6f8d23766520d (diff)
downloadrockbox-45bd14b392622cb58e967a24e4652c510b3d43e4.tar.gz
rockbox-45bd14b392622cb58e967a24e4652c510b3d43e4.zip
Lua Add Emergency Garbage Collector
Derivative of work by RobertGabrielJakabosky http://lua-users.org/wiki/EmergencyGarbageCollector I've only implemented the not enough memory part and expanded this idea to adding a mechanism to signal the OOM condition of the plugin buffer which allows us to only grab the playback buffer after garbage collection fails (SO THE MUSIC KEEPS PLAYING AS LONG AS POSSIBLE) Change-Id: I684fb98b540ffc01f7ba324ab5b761ceb59b9f9b
Diffstat (limited to 'apps/plugins/lua/ldo.c')
-rw-r--r--apps/plugins/lua/ldo.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/apps/plugins/lua/ldo.c b/apps/plugins/lua/ldo.c
index 43266de95e..7eccc54480 100644
--- a/apps/plugins/lua/ldo.c
+++ b/apps/plugins/lua/ldo.c
@@ -51,11 +51,13 @@ struct lua_longjmp {
51void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { 51void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) {
52 switch (errcode) { 52 switch (errcode) {
53 case LUA_ERRMEM: { 53 case LUA_ERRMEM: {
54 setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG)); 54 ptrdiff_t oldtopr = savestack(L, oldtop);
55 setsvalue2s(L, restorestack(L, oldtopr), luaS_newliteral(L, MEMERRMSG));
55 break; 56 break;
56 } 57 }
57 case LUA_ERRERR: { 58 case LUA_ERRERR: {
58 setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); 59 ptrdiff_t oldtopr = savestack(L, oldtop);
60 setsvalue2s(L, restorestack(L, oldtopr), luaS_newliteral(L, "error in error handling"));
59 break; 61 break;
60 } 62 }
61 case LUA_ERRSYNTAX: 63 case LUA_ERRSYNTAX:
@@ -92,6 +94,8 @@ static void resetstack (lua_State *L, int status) {
92 94
93 95
94void luaD_throw (lua_State *L, int errcode) { 96void luaD_throw (lua_State *L, int errcode) {
97 unfixedstack(L); /* make sure the fixedstack & block_gc flags get reset. */
98 unset_block_gc(L);
95 if (L->errorJmp) { 99 if (L->errorJmp) {
96 L->errorJmp->status = errcode; 100 L->errorJmp->status = errcode;
97 LUAI_THROW(L, L->errorJmp); 101 LUAI_THROW(L, L->errorJmp);
@@ -208,7 +212,9 @@ void luaD_callhook (lua_State *L, int event, int line) {
208static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { 212static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
209 int i; 213 int i;
210 int nfixargs = p->numparams; 214 int nfixargs = p->numparams;
215#if defined(LUA_COMPAT_VARARG)
211 Table *htab = NULL; 216 Table *htab = NULL;
217#endif
212 StkId base, fixed; 218 StkId base, fixed;
213 for (; actual < nfixargs; ++actual) 219 for (; actual < nfixargs; ++actual)
214 setnilvalue(L->top++); 220 setnilvalue(L->top++);
@@ -219,10 +225,15 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
219 luaC_checkGC(L); 225 luaC_checkGC(L);
220 luaD_checkstack(L, p->maxstacksize); 226 luaD_checkstack(L, p->maxstacksize);
221 htab = luaH_new(L, nvar, 1); /* create `arg' table */ 227 htab = luaH_new(L, nvar, 1); /* create `arg' table */
228 sethvalue2s(L, L->top, htab); /* put table on stack */
229 incr_top(L);
230 fixedstack(L);
222 for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ 231 for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
223 setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i); 232 setobj2n(L, luaH_setnum(L, htab, i+1), L->top - 1 - nvar + i);
233 unfixedstack(L);
224 /* store counter in field `n' */ 234 /* store counter in field `n' */
225 setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); 235 setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar));
236 L->top--; /* remove table from stack */
226 } 237 }
227#endif 238#endif
228 /* move fixed parameters to final position */ 239 /* move fixed parameters to final position */
@@ -232,11 +243,13 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
232 setobjs2s(L, L->top++, fixed+i); 243 setobjs2s(L, L->top++, fixed+i);
233 setnilvalue(fixed+i); 244 setnilvalue(fixed+i);
234 } 245 }
246#if defined(LUA_COMPAT_VARARG)
235 /* add `arg' parameter */ 247 /* add `arg' parameter */
236 if (htab) { 248 if (htab) {
237 sethvalue(L, L->top++, htab); 249 sethvalue(L, L->top++, htab);
238 lua_assert(iswhite(obj2gco(htab))); 250 lua_assert(iswhite(obj2gco(htab)));
239 } 251 }
252#endif
240 return base; 253 return base;
241} 254}
242 255
@@ -495,6 +508,7 @@ static void f_parser (lua_State *L, void *ud) {
495 struct SParser *p = cast(struct SParser *, ud); 508 struct SParser *p = cast(struct SParser *, ud);
496 int c = luaZ_lookahead(p->z); 509 int c = luaZ_lookahead(p->z);
497 luaC_checkGC(L); 510 luaC_checkGC(L);
511 set_block_gc(L); /* stop collector during parsing */
498 tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, 512 tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z,
499 &p->buff, p->name); 513 &p->buff, p->name);
500 cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); 514 cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L)));
@@ -503,6 +517,7 @@ static void f_parser (lua_State *L, void *ud) {
503 cl->l.upvals[i] = luaF_newupval(L); 517 cl->l.upvals[i] = luaF_newupval(L);
504 setclvalue(L, L->top, cl); 518 setclvalue(L, L->top, cl);
505 incr_top(L); 519 incr_top(L);
520 unset_block_gc(L);
506} 521}
507 522
508 523