diff options
author | Mike Pall <mike> | 2024-03-10 17:26:03 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2024-03-10 17:26:03 +0100 |
commit | 913df6a94517d31c7be1a6133b8f35a62e51ff7a (patch) | |
tree | 43b24744216c5d60fc4832f513fbba2966ad3ff7 | |
parent | 0d313b243194a0b8d2399d8b549ca5a0ff234db5 (diff) | |
parent | cae361187e7e1e3545353fb560c032cdace32d5f (diff) | |
download | luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.gz luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.bz2 luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.zip |
Merge branch 'master' into v2.1
-rw-r--r-- | src/lj_api.c | 1 | ||||
-rw-r--r-- | src/lj_gc.c | 3 | ||||
-rw-r--r-- | src/lj_record.c | 4 |
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)); |