From 87a9573b2eb3f1da8e438f92ade994160d930b09 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Mon, 11 Oct 2021 13:49:13 -0300 Subject: Documentation Better explanation about the guaranties of multiple assignment in the manual. --- ldebug.c | 2 +- lstrlib.c | 2 +- lvm.c | 2 +- manual/manual.of | 12 ++++++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/ldebug.c b/ldebug.c index 433a8759..dde4669e 100644 --- a/ldebug.c +++ b/ldebug.c @@ -64,7 +64,7 @@ static int getbaseline (const Proto *f, int pc, int *basepc) { } else { int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ - /* estimate must be a lower bond of the correct base */ + /* estimate must be a lower bound of the correct base */ lua_assert(i < 0 || (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) diff --git a/lstrlib.c b/lstrlib.c index e3b8df0f..0b4fdbb7 100644 --- a/lstrlib.c +++ b/lstrlib.c @@ -1217,7 +1217,7 @@ static const char *get2digits (const char *s) { /* -** Chech whether a conversion specification is valid. When called, +** Check whether a conversion specification is valid. When called, ** first character in 'form' must be '%' and last character must ** be a valid conversion specifier. 'flags' are the accepted flags; ** 'precision' signals whether to accept a precision. diff --git a/lvm.c b/lvm.c index bdc8e677..49ed3ddf 100644 --- a/lvm.c +++ b/lvm.c @@ -1109,7 +1109,7 @@ void luaV_finishOp (lua_State *L) { #define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) /* -** Protect code that can only raise errors. (That is, it cannnot change +** Protect code that can only raise errors. (That is, it cannot change ** the stack or hooks.) */ #define halfProtect(exp) (savestate(L,ci), (exp)) diff --git a/manual/manual.of b/manual/manual.of index ea9a0302..9e0b8835 100644 --- a/manual/manual.of +++ b/manual/manual.of @@ -1346,8 +1346,10 @@ then all values returned by that call enter the list of values, before the adjustment (except when the call is enclosed in parentheses; see @See{expressions}). -The assignment statement first evaluates all its expressions -and only then the assignments are performed. +If a variable is both assigned and read +inside a multiple assignment, +Lua ensures all reads get the value of the variable +before the assignment. Thus the code @verbatim{ i = 3 @@ -1367,6 +1369,12 @@ x, y, z = y, z, x } cyclically permutes the values of @id{x}, @id{y}, and @id{z}. +Note that this guarantee covers only accesses +syntactically inside the assignment statement. +If a function or a metamethod called during the assignment +changes the value of a variable, +Lua gives no guarantees about the order of that access. + An assignment to a global name @T{x = val} is equivalent to the assignment @T{_ENV.x = val} @see{globalenv}. -- cgit v1.2.1