diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-02-29 11:27:14 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-02-29 11:27:14 -0300 |
commit | 03ca6385dc426fefabe9204037fc76ebf0627a11 (patch) | |
tree | ab3e0f36557840bbd7736c4d9649204096cb77cb | |
parent | 7777b412deb46d051967b699697d1d6e6286a7b6 (diff) | |
download | lua-03ca6385dc426fefabe9204037fc76ebf0627a11.tar.gz lua-03ca6385dc426fefabe9204037fc76ebf0627a11.tar.bz2 lua-03ca6385dc426fefabe9204037fc76ebf0627a11.zip |
call 'checkGC' *after* creating new objects (this is how 'execute'
does it)
(It increases the changes that 'allgc' start with a non-white
object, which helps 'entersweep')
-rw-r--r-- | lapi.c | 20 |
1 files changed, 10 insertions, 10 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lapi.c,v 2.257 2015/11/02 18:48:07 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.258 2016/01/05 16:07:21 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 | */ |
@@ -378,9 +378,9 @@ LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { | |||
378 | return NULL; | 378 | return NULL; |
379 | } | 379 | } |
380 | lua_lock(L); /* 'luaO_tostring' may create a new string */ | 380 | lua_lock(L); /* 'luaO_tostring' may create a new string */ |
381 | luaO_tostring(L, o); | ||
381 | luaC_checkGC(L); | 382 | luaC_checkGC(L); |
382 | o = index2addr(L, idx); /* previous call may reallocate the stack */ | 383 | o = index2addr(L, idx); /* previous call may reallocate the stack */ |
383 | luaO_tostring(L, o); | ||
384 | lua_unlock(L); | 384 | lua_unlock(L); |
385 | } | 385 | } |
386 | if (len != NULL) | 386 | if (len != NULL) |
@@ -479,10 +479,10 @@ LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { | |||
479 | LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { | 479 | LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { |
480 | TString *ts; | 480 | TString *ts; |
481 | lua_lock(L); | 481 | lua_lock(L); |
482 | luaC_checkGC(L); | ||
483 | ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); | 482 | ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); |
484 | setsvalue2s(L, L->top, ts); | 483 | setsvalue2s(L, L->top, ts); |
485 | api_incr_top(L); | 484 | api_incr_top(L); |
485 | luaC_checkGC(L); | ||
486 | lua_unlock(L); | 486 | lua_unlock(L); |
487 | return getstr(ts); | 487 | return getstr(ts); |
488 | } | 488 | } |
@@ -494,12 +494,12 @@ LUA_API const char *lua_pushstring (lua_State *L, const char *s) { | |||
494 | setnilvalue(L->top); | 494 | setnilvalue(L->top); |
495 | else { | 495 | else { |
496 | TString *ts; | 496 | TString *ts; |
497 | luaC_checkGC(L); | ||
498 | ts = luaS_new(L, s); | 497 | ts = luaS_new(L, s); |
499 | setsvalue2s(L, L->top, ts); | 498 | setsvalue2s(L, L->top, ts); |
500 | s = getstr(ts); /* internal copy's address */ | 499 | s = getstr(ts); /* internal copy's address */ |
501 | } | 500 | } |
502 | api_incr_top(L); | 501 | api_incr_top(L); |
502 | luaC_checkGC(L); | ||
503 | lua_unlock(L); | 503 | lua_unlock(L); |
504 | return s; | 504 | return s; |
505 | } | 505 | } |
@@ -509,8 +509,8 @@ LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, | |||
509 | va_list argp) { | 509 | va_list argp) { |
510 | const char *ret; | 510 | const char *ret; |
511 | lua_lock(L); | 511 | lua_lock(L); |
512 | luaC_checkGC(L); | ||
513 | ret = luaO_pushvfstring(L, fmt, argp); | 512 | ret = luaO_pushvfstring(L, fmt, argp); |
513 | luaC_checkGC(L); | ||
514 | lua_unlock(L); | 514 | lua_unlock(L); |
515 | return ret; | 515 | return ret; |
516 | } | 516 | } |
@@ -520,10 +520,10 @@ LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { | |||
520 | const char *ret; | 520 | const char *ret; |
521 | va_list argp; | 521 | va_list argp; |
522 | lua_lock(L); | 522 | lua_lock(L); |
523 | luaC_checkGC(L); | ||
524 | va_start(argp, fmt); | 523 | va_start(argp, fmt); |
525 | ret = luaO_pushvfstring(L, fmt, argp); | 524 | ret = luaO_pushvfstring(L, fmt, argp); |
526 | va_end(argp); | 525 | va_end(argp); |
526 | luaC_checkGC(L); | ||
527 | lua_unlock(L); | 527 | lua_unlock(L); |
528 | return ret; | 528 | return ret; |
529 | } | 529 | } |
@@ -538,7 +538,6 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | |||
538 | CClosure *cl; | 538 | CClosure *cl; |
539 | api_checknelems(L, n); | 539 | api_checknelems(L, n); |
540 | api_check(L, n <= MAXUPVAL, "upvalue index too large"); | 540 | api_check(L, n <= MAXUPVAL, "upvalue index too large"); |
541 | luaC_checkGC(L); | ||
542 | cl = luaF_newCclosure(L, n); | 541 | cl = luaF_newCclosure(L, n); |
543 | cl->f = fn; | 542 | cl->f = fn; |
544 | L->top -= n; | 543 | L->top -= n; |
@@ -549,6 +548,7 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | |||
549 | setclCvalue(L, L->top, cl); | 548 | setclCvalue(L, L->top, cl); |
550 | } | 549 | } |
551 | api_incr_top(L); | 550 | api_incr_top(L); |
551 | luaC_checkGC(L); | ||
552 | lua_unlock(L); | 552 | lua_unlock(L); |
553 | } | 553 | } |
554 | 554 | ||
@@ -683,12 +683,12 @@ LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { | |||
683 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { | 683 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { |
684 | Table *t; | 684 | Table *t; |
685 | lua_lock(L); | 685 | lua_lock(L); |
686 | luaC_checkGC(L); | ||
687 | t = luaH_new(L); | 686 | t = luaH_new(L); |
688 | sethvalue(L, L->top, t); | 687 | sethvalue(L, L->top, t); |
689 | api_incr_top(L); | 688 | api_incr_top(L); |
690 | if (narray > 0 || nrec > 0) | 689 | if (narray > 0 || nrec > 0) |
691 | luaH_resize(L, t, narray, nrec); | 690 | luaH_resize(L, t, narray, nrec); |
691 | luaC_checkGC(L); | ||
692 | lua_unlock(L); | 692 | lua_unlock(L); |
693 | } | 693 | } |
694 | 694 | ||
@@ -1140,7 +1140,6 @@ LUA_API void lua_concat (lua_State *L, int n) { | |||
1140 | lua_lock(L); | 1140 | lua_lock(L); |
1141 | api_checknelems(L, n); | 1141 | api_checknelems(L, n); |
1142 | if (n >= 2) { | 1142 | if (n >= 2) { |
1143 | luaC_checkGC(L); | ||
1144 | luaV_concat(L, n); | 1143 | luaV_concat(L, n); |
1145 | } | 1144 | } |
1146 | else if (n == 0) { /* push empty string */ | 1145 | else if (n == 0) { /* push empty string */ |
@@ -1148,6 +1147,7 @@ LUA_API void lua_concat (lua_State *L, int n) { | |||
1148 | api_incr_top(L); | 1147 | api_incr_top(L); |
1149 | } | 1148 | } |
1150 | /* else n == 1; nothing to do */ | 1149 | /* else n == 1; nothing to do */ |
1150 | luaC_checkGC(L); | ||
1151 | lua_unlock(L); | 1151 | lua_unlock(L); |
1152 | } | 1152 | } |
1153 | 1153 | ||
@@ -1183,10 +1183,10 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { | |||
1183 | LUA_API void *lua_newuserdata (lua_State *L, size_t size) { | 1183 | LUA_API void *lua_newuserdata (lua_State *L, size_t size) { |
1184 | Udata *u; | 1184 | Udata *u; |
1185 | lua_lock(L); | 1185 | lua_lock(L); |
1186 | luaC_checkGC(L); | ||
1187 | u = luaS_newudata(L, size); | 1186 | u = luaS_newudata(L, size); |
1188 | setuvalue(L, L->top, u); | 1187 | setuvalue(L, L->top, u); |
1189 | api_incr_top(L); | 1188 | api_incr_top(L); |
1189 | luaC_checkGC(L); | ||
1190 | lua_unlock(L); | 1190 | lua_unlock(L); |
1191 | return getudatamem(u); | 1191 | return getudatamem(u); |
1192 | } | 1192 | } |