summaryrefslogtreecommitdiff
path: root/manual
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-14 15:53:42 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-03-14 15:53:42 -0300
commit8fa4f1380b9a203bfdf002c2e9e9e13ebb8384c1 (patch)
tree02cb0c4c19c563c5924b4faf7014812ea980b8c6 /manual
parentb56d4e570a60a8e84df8288c3122eb5bb5c20af6 (diff)
downloadlua-github-8fa4f1380b9a203bfdf002c2e9e9e13ebb8384c1.tar.gz
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.
Diffstat (limited to 'manual')
-rw-r--r--manual/manual.of23
1 files changed, 19 insertions, 4 deletions
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.)
+}
+
}
}