From 8fa4f1380b9a203bfdf002c2e9e9e13ebb8384c1 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 14 Mar 2019 15:53:42 -0300 Subject: Finalizers must be callable Non-function __gc metamethods are not ignored; if present, the metamethod will be called even if it is not a function. --- lgc.c | 2 +- manual/manual.of | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lgc.c b/lgc.c index c834319b..8cb3e9fa 100644 --- a/lgc.c +++ b/lgc.c @@ -832,7 +832,7 @@ static void GCTM (lua_State *L) { lua_assert(!g->gcemergency); setgcovalue(L, &v, udata2finalize(g)); tm = luaT_gettmbyobj(L, &v, TM_GC); - if (ttisfunction(tm)) { /* is the finalizer a function? */ + if (!notm(tm)) { /* is there a finalizer? */ int status; lu_byte oldah = L->allowhook; int running = g->gcrunning; diff --git a/manual/manual.of b/manual/manual.of index 63e78f95..1e4ca857 100644 --- a/manual/manual.of +++ b/manual/manual.of @@ -689,10 +689,8 @@ After the collection, Lua goes through that list. For each object in the list, it checks the object's @idx{__gc} metamethod: -If it is a function, -Lua calls it with the object as its single argument; -if the metamethod is not a function, -Lua simply ignores it. +If it is present, +Lua calls it with the object as its single argument. At the end of each garbage-collection cycle, the finalizers for objects are called in @@ -726,6 +724,9 @@ these marks have no effect. Finalizers cannot yield. +Any error while running a finalizer generates a warning; +it is not propagated. + } @sect3{weak-table| @title{Weak Tables} @@ -7279,6 +7280,11 @@ that is, with maximum alignment of 1 (no alignment) and native endianness. +Native endianness assumes that the whole system is +either big or little endian. +The packing functions will not emulate correctly the behavior +of mixed-endian formats. + Alignment works as follows: For each option, the format gets extra padding until the data starts @@ -7288,6 +7294,7 @@ this minimum must be a power of 2. Options @St{c} and @St{z} are not aligned; option @St{s} follows the alignment of its starting integer. + All padding is filled with zeros by @Lid{string.pack} (and ignored by @Lid{string.unpack}). @@ -8720,6 +8727,14 @@ name is visible, even if this other label is declared in an enclosing block. } +@item{ +When finalizing an object, +Lua does not ignore @idx{__gc} metamethods that are not functions. +Any value will be called, if present. +(Non-callable values will generate a warning, +like any other error when calling a finalizer.) +} + } } -- cgit v1.2.3-55-g6feb