diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-10-11 13:49:13 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2021-10-11 13:49:13 -0300 |
commit | 87a9573b2eb3f1da8e438f92ade994160d930b09 (patch) | |
tree | a935872e61f23c81b430dd867c98329b8782a907 | |
parent | deac067ed39a44c001599c0d15de09872496b2aa (diff) | |
download | lua-87a9573b2eb3f1da8e438f92ade994160d930b09.tar.gz lua-87a9573b2eb3f1da8e438f92ade994160d930b09.tar.bz2 lua-87a9573b2eb3f1da8e438f92ade994160d930b09.zip |
Documentation
Better explanation about the guaranties of multiple assignment in
the manual.
-rw-r--r-- | ldebug.c | 2 | ||||
-rw-r--r-- | lstrlib.c | 2 | ||||
-rw-r--r-- | lvm.c | 2 | ||||
-rw-r--r-- | manual/manual.of | 12 |
4 files changed, 13 insertions, 5 deletions
@@ -64,7 +64,7 @@ static int getbaseline (const Proto *f, int pc, int *basepc) { | |||
64 | } | 64 | } |
65 | else { | 65 | else { |
66 | int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ | 66 | int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ |
67 | /* estimate must be a lower bond of the correct base */ | 67 | /* estimate must be a lower bound of the correct base */ |
68 | lua_assert(i < 0 || | 68 | lua_assert(i < 0 || |
69 | (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); | 69 | (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); |
70 | while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) | 70 | while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc) |
@@ -1217,7 +1217,7 @@ static const char *get2digits (const char *s) { | |||
1217 | 1217 | ||
1218 | 1218 | ||
1219 | /* | 1219 | /* |
1220 | ** Chech whether a conversion specification is valid. When called, | 1220 | ** Check whether a conversion specification is valid. When called, |
1221 | ** first character in 'form' must be '%' and last character must | 1221 | ** first character in 'form' must be '%' and last character must |
1222 | ** be a valid conversion specifier. 'flags' are the accepted flags; | 1222 | ** be a valid conversion specifier. 'flags' are the accepted flags; |
1223 | ** 'precision' signals whether to accept a precision. | 1223 | ** 'precision' signals whether to accept a precision. |
@@ -1109,7 +1109,7 @@ void luaV_finishOp (lua_State *L) { | |||
1109 | #define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) | 1109 | #define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) |
1110 | 1110 | ||
1111 | /* | 1111 | /* |
1112 | ** Protect code that can only raise errors. (That is, it cannnot change | 1112 | ** Protect code that can only raise errors. (That is, it cannot change |
1113 | ** the stack or hooks.) | 1113 | ** the stack or hooks.) |
1114 | */ | 1114 | */ |
1115 | #define halfProtect(exp) (savestate(L,ci), (exp)) | 1115 | #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, | |||
1346 | before the adjustment | 1346 | before the adjustment |
1347 | (except when the call is enclosed in parentheses; see @See{expressions}). | 1347 | (except when the call is enclosed in parentheses; see @See{expressions}). |
1348 | 1348 | ||
1349 | The assignment statement first evaluates all its expressions | 1349 | If a variable is both assigned and read |
1350 | and only then the assignments are performed. | 1350 | inside a multiple assignment, |
1351 | Lua ensures all reads get the value of the variable | ||
1352 | before the assignment. | ||
1351 | Thus the code | 1353 | Thus the code |
1352 | @verbatim{ | 1354 | @verbatim{ |
1353 | i = 3 | 1355 | i = 3 |
@@ -1367,6 +1369,12 @@ x, y, z = y, z, x | |||
1367 | } | 1369 | } |
1368 | cyclically permutes the values of @id{x}, @id{y}, and @id{z}. | 1370 | cyclically permutes the values of @id{x}, @id{y}, and @id{z}. |
1369 | 1371 | ||
1372 | Note that this guarantee covers only accesses | ||
1373 | syntactically inside the assignment statement. | ||
1374 | If a function or a metamethod called during the assignment | ||
1375 | changes the value of a variable, | ||
1376 | Lua gives no guarantees about the order of that access. | ||
1377 | |||
1370 | An assignment to a global name @T{x = val} | 1378 | An assignment to a global name @T{x = val} |
1371 | is equivalent to the assignment | 1379 | is equivalent to the assignment |
1372 | @T{_ENV.x = val} @see{globalenv}. | 1380 | @T{_ENV.x = val} @see{globalenv}. |