aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2024-03-10 17:26:03 +0100
committerMike Pall <mike>2024-03-10 17:26:03 +0100
commit913df6a94517d31c7be1a6133b8f35a62e51ff7a (patch)
tree43b24744216c5d60fc4832f513fbba2966ad3ff7
parent0d313b243194a0b8d2399d8b549ca5a0ff234db5 (diff)
parentcae361187e7e1e3545353fb560c032cdace32d5f (diff)
downloadluajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.gz
luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.bz2
luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.zip
Merge branch 'master' into v2.1
-rw-r--r--src/lj_api.c1
-rw-r--r--src/lj_gc.c3
-rw-r--r--src/lj_record.c4
3 files changed, 7 insertions, 1 deletions
diff --git a/src/lj_api.c b/src/lj_api.c
index d4048d79..1ad71678 100644
--- a/src/lj_api.c
+++ b/src/lj_api.c
@@ -1052,6 +1052,7 @@ LUA_API int lua_setmetatable(lua_State *L, int idx)
1052 /* Flush cache, since traces specialize to basemt. But not during __gc. */ 1052 /* Flush cache, since traces specialize to basemt. But not during __gc. */
1053 if (lj_trace_flushall(L)) 1053 if (lj_trace_flushall(L))
1054 lj_err_caller(L, LJ_ERR_NOGCMM); 1054 lj_err_caller(L, LJ_ERR_NOGCMM);
1055 o = index2adr(L, idx); /* Stack may have been reallocated. */
1055 if (tvisbool(o)) { 1056 if (tvisbool(o)) {
1056 /* NOBARRIER: basemt is a GC root. */ 1057 /* NOBARRIER: basemt is a GC root. */
1057 setgcref(basemt_it(g, LJ_TTRUE), obj2gco(mt)); 1058 setgcref(basemt_it(g, LJ_TTRUE), obj2gco(mt));
diff --git a/src/lj_gc.c b/src/lj_gc.c
index c3a0c258..eebc751b 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -108,6 +108,9 @@ static void gc_mark_start(global_State *g)
108 gc_markobj(g, tabref(mainthread(g)->env)); 108 gc_markobj(g, tabref(mainthread(g)->env));
109 gc_marktv(g, &g->registrytv); 109 gc_marktv(g, &g->registrytv);
110 gc_mark_gcroot(g); 110 gc_mark_gcroot(g);
111#if LJ_HASFFI
112 if (ctype_ctsG(g)) gc_markobj(g, ctype_ctsG(g)->finalizer);
113#endif
111 g->gc.state = GCSpropagate; 114 g->gc.state = GCSpropagate;
112} 115}
113 116
diff --git a/src/lj_record.c b/src/lj_record.c
index b7af5896..a9092d92 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -948,7 +948,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
948 if ((pt->flags & PROTO_NOJIT)) 948 if ((pt->flags & PROTO_NOJIT))
949 lj_trace_err(J, LJ_TRERR_CJITOFF); 949 lj_trace_err(J, LJ_TRERR_CJITOFF);
950 if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) { 950 if (J->framedepth == 0 && J->pt && frame == J->L->base - 1) {
951 if (check_downrec_unroll(J, pt)) { 951 if (!J->cur.root && check_downrec_unroll(J, pt)) {
952 J->maxslot = (BCReg)(rbase + gotresults); 952 J->maxslot = (BCReg)(rbase + gotresults);
953 lj_snap_purge(J); 953 lj_snap_purge(J);
954 lj_record_stop(J, LJ_TRLINK_DOWNREC, J->cur.traceno); /* Down-rec. */ 954 lj_record_stop(J, LJ_TRLINK_DOWNREC, J->cur.traceno); /* Down-rec. */
@@ -970,6 +970,8 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults)
970 lj_trace_err(J, LJ_TRERR_LLEAVE); 970 lj_trace_err(J, LJ_TRERR_LLEAVE);
971 } else if (J->needsnap) { /* Tailcalled to ff with side-effects. */ 971 } else if (J->needsnap) { /* Tailcalled to ff with side-effects. */
972 lj_trace_err(J, LJ_TRERR_NYIRETL); /* No way to insert snapshot here. */ 972 lj_trace_err(J, LJ_TRERR_NYIRETL); /* No way to insert snapshot here. */
973 } else if (1 + pt->framesize >= LJ_MAX_JSLOTS) {
974 lj_trace_err(J, LJ_TRERR_STACKOV);
973 } else { /* Return to lower frame. Guard for the target we return to. */ 975 } else { /* Return to lower frame. Guard for the target we return to. */
974 TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO); 976 TRef trpt = lj_ir_kgc(J, obj2gco(pt), IRT_PROTO);
975 TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame)); 977 TRef trpc = lj_ir_kptr(J, (void *)frame_pc(frame));