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 /src | |
| parent | 0d313b243194a0b8d2399d8b549ca5a0ff234db5 (diff) | |
| parent | cae361187e7e1e3545353fb560c032cdace32d5f (diff) | |
| download | luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.gz luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.tar.bz2 luajit-913df6a94517d31c7be1a6133b8f35a62e51ff7a.zip | |
Merge branch 'master' into v2.1
Diffstat (limited to 'src')
| -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)); |
