diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-05-28 15:46:49 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-05-28 15:46:49 -0300 |
commit | b293ae0577bebaca7169cb4f041b800641d5e2c4 (patch) | |
tree | bda609d72277433bda3537ac50ed8fecf9a73898 | |
parent | d9f40e3f6fb61650240c47d548bee69b24b07859 (diff) | |
download | lua-b293ae0577bebaca7169cb4f041b800641d5e2c4.tar.gz lua-b293ae0577bebaca7169cb4f041b800641d5e2c4.tar.bz2 lua-b293ae0577bebaca7169cb4f041b800641d5e2c4.zip |
Details
- new error message for "attempt to assign to const variable"
- note in the manual about compatibility options
- comments
- small changes in 'read_line' and 'pushstr'
-rw-r--r-- | liolib.c | 10 | ||||
-rw-r--r-- | lobject.c | 4 | ||||
-rw-r--r-- | lparser.c | 2 | ||||
-rw-r--r-- | lstate.h | 16 | ||||
-rw-r--r-- | luaconf.h | 14 | ||||
-rw-r--r-- | manual/manual.of | 13 | ||||
-rw-r--r-- | testes/constructs.lua | 6 | ||||
-rw-r--r-- | testes/locals.lua | 1 | ||||
-rw-r--r-- | testes/strings.lua | 3 |
9 files changed, 46 insertions, 23 deletions
@@ -504,17 +504,17 @@ static int test_eof (lua_State *L, FILE *f) { | |||
504 | 504 | ||
505 | static int read_line (lua_State *L, FILE *f, int chop) { | 505 | static int read_line (lua_State *L, FILE *f, int chop) { |
506 | luaL_Buffer b; | 506 | luaL_Buffer b; |
507 | int c = '\0'; | 507 | int c; |
508 | luaL_buffinit(L, &b); | 508 | luaL_buffinit(L, &b); |
509 | while (c != EOF && c != '\n') { /* repeat until end of line */ | 509 | do { /* may need to read several chunks to get whole line */ |
510 | char *buff = luaL_prepbuffer(&b); /* preallocate buffer */ | 510 | char *buff = luaL_prepbuffer(&b); /* preallocate buffer space */ |
511 | int i = 0; | 511 | int i = 0; |
512 | l_lockfile(f); /* no memory errors can happen inside the lock */ | 512 | l_lockfile(f); /* no memory errors can happen inside the lock */ |
513 | while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') | 513 | while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') |
514 | buff[i++] = c; | 514 | buff[i++] = c; /* read up to end of line or buffer limit */ |
515 | l_unlockfile(f); | 515 | l_unlockfile(f); |
516 | luaL_addsize(&b, i); | 516 | luaL_addsize(&b, i); |
517 | } | 517 | } while (c != EOF && c != '\n'); /* repeat until end of line */ |
518 | if (!chop && c == '\n') /* want a newline and have one? */ | 518 | if (!chop && c == '\n') /* want a newline and have one? */ |
519 | luaL_addchar(&b, c); /* add ending newline to result */ | 519 | luaL_addchar(&b, c); /* add ending newline to result */ |
520 | luaL_pushresult(&b); /* close buffer */ | 520 | luaL_pushresult(&b); /* close buffer */ |
@@ -419,9 +419,9 @@ typedef struct BuffFS { | |||
419 | static void pushstr (BuffFS *buff, const char *str, size_t l) { | 419 | static void pushstr (BuffFS *buff, const char *str, size_t l) { |
420 | lua_State *L = buff->L; | 420 | lua_State *L = buff->L; |
421 | setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); | 421 | setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); |
422 | L->top++; | 422 | L->top++; /* may use one extra slot */ |
423 | buff->pushed++; | 423 | buff->pushed++; |
424 | if (buff->pushed > 1 && L->top + 2 > L->stack_last) { | 424 | if (buff->pushed > 1 && L->top + 1 >= L->stack_last) { |
425 | luaV_concat(L, buff->pushed); /* join all partial results into one */ | 425 | luaV_concat(L, buff->pushed); /* join all partial results into one */ |
426 | buff->pushed = 1; | 426 | buff->pushed = 1; |
427 | } | 427 | } |
@@ -264,7 +264,7 @@ static void check_readonly (LexState *ls, expdesc *e) { | |||
264 | Vardesc *vardesc = getvardesc(ls->fs, e); | 264 | Vardesc *vardesc = getvardesc(ls->fs, e); |
265 | if (vardesc && vardesc->ro) { /* is variable local and const? */ | 265 | if (vardesc && vardesc->ro) { /* is variable local and const? */ |
266 | const char *msg = luaO_pushfstring(ls->L, | 266 | const char *msg = luaO_pushfstring(ls->L, |
267 | "assignment to const variable '%s'", getstr(vardesc->name)); | 267 | "attempt to assign to const variable '%s'", getstr(vardesc->name)); |
268 | luaK_semerror(ls, msg); /* error */ | 268 | luaK_semerror(ls, msg); /* error */ |
269 | } | 269 | } |
270 | } | 270 | } |
@@ -26,6 +26,22 @@ | |||
26 | ** 'fixedgc': all objects that are not to be collected (currently | 26 | ** 'fixedgc': all objects that are not to be collected (currently |
27 | ** only small strings, such as reserved words). | 27 | ** only small strings, such as reserved words). |
28 | ** | 28 | ** |
29 | ** For the generational collector, some of these lists have marks for | ||
30 | ** generations. Each mark points to the first element in the list for | ||
31 | ** that particular generation; that generation goes until the next mark. | ||
32 | ** | ||
33 | ** 'allgc' -> 'survival': new objects; | ||
34 | ** 'survival' -> 'old': objects that survived one collection; | ||
35 | ** 'old' -> 'reallyold': objects that became old in last collection; | ||
36 | ** 'reallyold' -> NULL: objects old for more than one cycle. | ||
37 | ** | ||
38 | ** 'finobj' -> 'finobjsur': new objects marked for finalization; | ||
39 | ** 'finobjsur' -> 'finobjold': survived """"; | ||
40 | ** 'finobjold' -> 'finobjrold': just old """"; | ||
41 | ** 'finobjrold' -> NULL: really old """". | ||
42 | */ | ||
43 | |||
44 | /* | ||
29 | ** Moreover, there is another set of lists that control gray objects. | 45 | ** Moreover, there is another set of lists that control gray objects. |
30 | ** These lists are linked by fields 'gclist'. (All objects that | 46 | ** These lists are linked by fields 'gclist'. (All objects that |
31 | ** can become gray have such a field. The field is not the same | 47 | ** can become gray have such a field. The field is not the same |
@@ -344,8 +344,8 @@ | |||
344 | /* | 344 | /* |
345 | @@ LUA_COMPAT_MATHLIB controls the presence of several deprecated | 345 | @@ LUA_COMPAT_MATHLIB controls the presence of several deprecated |
346 | ** functions in the mathematical library. | 346 | ** functions in the mathematical library. |
347 | ** (These functions were already officially removed in 5.3, but | 347 | ** (These functions were already officially removed in 5.3; |
348 | ** nevertheless they are available by default there.) | 348 | ** nevertheless they are still available here.) |
349 | */ | 349 | */ |
350 | #define LUA_COMPAT_MATHLIB | 350 | #define LUA_COMPAT_MATHLIB |
351 | 351 | ||
@@ -353,23 +353,25 @@ | |||
353 | @@ LUA_COMPAT_APIINTCASTS controls the presence of macros for | 353 | @@ LUA_COMPAT_APIINTCASTS controls the presence of macros for |
354 | ** manipulating other integer types (lua_pushunsigned, lua_tounsigned, | 354 | ** manipulating other integer types (lua_pushunsigned, lua_tounsigned, |
355 | ** luaL_checkint, luaL_checklong, etc.) | 355 | ** luaL_checkint, luaL_checklong, etc.) |
356 | ** (These macros were also officially removed in 5.3, but they are still | ||
357 | ** available here.) | ||
356 | */ | 358 | */ |
357 | #define LUA_COMPAT_APIINTCASTS | 359 | #define LUA_COMPAT_APIINTCASTS |
358 | 360 | ||
361 | |||
359 | /* | 362 | /* |
360 | @@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod | 363 | @@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod |
361 | ** using '__lt'. | 364 | ** using '__lt'. |
362 | */ | 365 | */ |
363 | #define LUA_COMPAT_LT_LE | 366 | #define LUA_COMPAT_LT_LE |
364 | 367 | ||
365 | #endif /* } */ | ||
366 | |||
367 | |||
368 | 368 | ||
369 | /* | 369 | /* |
370 | @@ The following macros supply trivial compatibility for some | 370 | @@ The following macros supply trivial compatibility for some |
371 | ** changes in the API. The macros themselves document how to | 371 | ** changes in the API. The macros themselves document how to |
372 | ** change your code to avoid using them. | 372 | ** change your code to avoid using them. |
373 | ** (Once more, these macros were officially removed in 5.3, but they are | ||
374 | ** still available here.) | ||
373 | */ | 375 | */ |
374 | #define lua_strlen(L,i) lua_rawlen(L, (i)) | 376 | #define lua_strlen(L,i) lua_rawlen(L, (i)) |
375 | 377 | ||
@@ -378,6 +380,8 @@ | |||
378 | #define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) | 380 | #define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) |
379 | #define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) | 381 | #define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) |
380 | 382 | ||
383 | #endif /* } */ | ||
384 | |||
381 | /* }================================================================== */ | 385 | /* }================================================================== */ |
382 | 386 | ||
383 | 387 | ||
diff --git a/manual/manual.of b/manual/manual.of index 6cac8c6c..ff69cd2c 100644 --- a/manual/manual.of +++ b/manual/manual.of | |||
@@ -8774,10 +8774,18 @@ is a more portable solution. | |||
8774 | 8774 | ||
8775 | Here we list the incompatibilities that you may find when moving a program | 8775 | Here we list the incompatibilities that you may find when moving a program |
8776 | from @N{Lua 5.3} to @N{Lua 5.4}. | 8776 | from @N{Lua 5.3} to @N{Lua 5.4}. |
8777 | |||
8777 | You can avoid some incompatibilities by compiling Lua with | 8778 | You can avoid some incompatibilities by compiling Lua with |
8778 | appropriate options (see file @id{luaconf.h}). | 8779 | appropriate options (see file @id{luaconf.h}). |
8779 | However, | 8780 | However, |
8780 | all these compatibility options will be removed in the future. | 8781 | all these compatibility options will be removed in the future. |
8782 | More often than not, | ||
8783 | compatibility issues arise when these compatibility options | ||
8784 | are removed. | ||
8785 | So, whenever you have the chance, | ||
8786 | you should try to test your code with a version of Lua compiled | ||
8787 | with all compatibility options turned off. | ||
8788 | That will ease transitions to newer versions of Lua. | ||
8781 | 8789 | ||
8782 | Lua versions can always change the C API in ways that | 8790 | Lua versions can always change the C API in ways that |
8783 | do not imply source-code changes in a program, | 8791 | do not imply source-code changes in a program, |
@@ -8826,11 +8834,6 @@ In particular, the control variable never wraps around. | |||
8826 | } | 8834 | } |
8827 | 8835 | ||
8828 | @item{ | 8836 | @item{ |
8829 | When a coroutine finishes with an error, | ||
8830 | its stack is unwound (to run any pending closing methods). | ||
8831 | } | ||
8832 | |||
8833 | @item{ | ||
8834 | A label for a @Rw{goto} cannot be declared where a label with the same | 8837 | A label for a @Rw{goto} cannot be declared where a label with the same |
8835 | name is visible, even if this other label is declared in an enclosing | 8838 | name is visible, even if this other label is declared in an enclosing |
8836 | block. | 8839 | block. |
diff --git a/testes/constructs.lua b/testes/constructs.lua index b91e0979..fe4db2cb 100644 --- a/testes/constructs.lua +++ b/testes/constructs.lua | |||
@@ -215,7 +215,7 @@ do -- testing constants | |||
215 | checkload(prog, "unknown attribute 'XXX'") | 215 | checkload(prog, "unknown attribute 'XXX'") |
216 | 216 | ||
217 | checkload([[local <const> xxx = 20; xxx = 10]], | 217 | checkload([[local <const> xxx = 20; xxx = 10]], |
218 | ":1: assignment to const variable 'xxx'") | 218 | ":1: attempt to assign to const variable 'xxx'") |
219 | 219 | ||
220 | checkload([[ | 220 | checkload([[ |
221 | local xx; | 221 | local xx; |
@@ -225,12 +225,12 @@ do -- testing constants | |||
225 | local abc = xx + yyy + xxx; | 225 | local abc = xx + yyy + xxx; |
226 | return function () return function () xxx = yyy end end | 226 | return function () return function () xxx = yyy end end |
227 | end | 227 | end |
228 | ]], ":6: assignment to const variable 'xxx'") | 228 | ]], ":6: attempt to assign to const variable 'xxx'") |
229 | 229 | ||
230 | checkload([[ | 230 | checkload([[ |
231 | local <toclose> x = nil | 231 | local <toclose> x = nil |
232 | x = io.open() | 232 | x = io.open() |
233 | ]], ":2: assignment to const variable 'x'") | 233 | ]], ":2: attempt to assign to const variable 'x'") |
234 | end | 234 | end |
235 | 235 | ||
236 | f = [[ | 236 | f = [[ |
diff --git a/testes/locals.lua b/testes/locals.lua index c176f506..e59ab95a 100644 --- a/testes/locals.lua +++ b/testes/locals.lua | |||
@@ -452,7 +452,6 @@ do | |||
452 | end) | 452 | end) |
453 | assert(co() == 100) | 453 | assert(co() == 100) |
454 | local st, msg = pcall(co) | 454 | local st, msg = pcall(co) |
455 | print(msg) | ||
456 | -- should get last error raised | 455 | -- should get last error raised |
457 | assert(not st and string.find(msg, "%w+%.%w+:%d+: XXX")) | 456 | assert(not st and string.find(msg, "%w+%.%w+:%d+: XXX")) |
458 | end | 457 | end |
diff --git a/testes/strings.lua b/testes/strings.lua index 3e32f2c4..1b2b570e 100644 --- a/testes/strings.lua +++ b/testes/strings.lua | |||
@@ -3,7 +3,8 @@ | |||
3 | 3 | ||
4 | print('testing strings and string library') | 4 | print('testing strings and string library') |
5 | 5 | ||
6 | local maxi, mini = math.maxinteger, math.mininteger | 6 | local <const> maxi = math.maxinteger |
7 | local <const> mini = math.mininteger | ||
7 | 8 | ||
8 | 9 | ||
9 | local function checkerror (msg, f, ...) | 10 | local function checkerror (msg, f, ...) |