aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-10-22 15:54:46 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2020-10-22 15:54:46 -0300
commitd742a193e57029d973aff0a5eb04d8ddd03fa0ff (patch)
treef0850c8f60997909952cbb1db3f499f066fb1188
parente4a38eb0e828e9589c391171e2e1904a3b9698e7 (diff)
downloadlua-d742a193e57029d973aff0a5eb04d8ddd03fa0ff.tar.gz
lua-d742a193e57029d973aff0a5eb04d8ddd03fa0ff.tar.bz2
lua-d742a193e57029d973aff0a5eb04d8ddd03fa0ff.zip
Comments
-rw-r--r--llex.c25
-rw-r--r--lparser.c8
-rw-r--r--ltable.c27
3 files changed, 34 insertions, 26 deletions
diff --git a/llex.c b/llex.c
index 3d6b2b97..4b8dec99 100644
--- a/llex.c
+++ b/llex.c
@@ -254,9 +254,10 @@ static int read_numeral (LexState *ls, SemInfo *seminfo) {
254 254
255 255
256/* 256/*
257** reads a sequence '[=*[' or ']=*]', leaving the last bracket. 257** read a sequence '[=*[' or ']=*]', leaving the last bracket. If
258** If sequence is well formed, return its number of '='s + 2; otherwise, 258** sequence is well formed, return its number of '='s + 2; otherwise,
259** return 1 if there is no '='s or 0 otherwise (an unfinished '[==...'). 259** return 1 if it is a single bracket (no '='s and no 2nd bracket);
260** otherwise (an unfinished '[==...') return 0.
260*/ 261*/
261static size_t skip_sep (LexState *ls) { 262static size_t skip_sep (LexState *ls) {
262 size_t count = 0; 263 size_t count = 0;
@@ -481,34 +482,34 @@ static int llex (LexState *ls, SemInfo *seminfo) {
481 } 482 }
482 case '=': { 483 case '=': {
483 next(ls); 484 next(ls);
484 if (check_next1(ls, '=')) return TK_EQ; 485 if (check_next1(ls, '=')) return TK_EQ; /* '==' */
485 else return '='; 486 else return '=';
486 } 487 }
487 case '<': { 488 case '<': {
488 next(ls); 489 next(ls);
489 if (check_next1(ls, '=')) return TK_LE; 490 if (check_next1(ls, '=')) return TK_LE; /* '<=' */
490 else if (check_next1(ls, '<')) return TK_SHL; 491 else if (check_next1(ls, '<')) return TK_SHL; /* '<<' */
491 else return '<'; 492 else return '<';
492 } 493 }
493 case '>': { 494 case '>': {
494 next(ls); 495 next(ls);
495 if (check_next1(ls, '=')) return TK_GE; 496 if (check_next1(ls, '=')) return TK_GE; /* '>=' */
496 else if (check_next1(ls, '>')) return TK_SHR; 497 else if (check_next1(ls, '>')) return TK_SHR; /* '>>' */
497 else return '>'; 498 else return '>';
498 } 499 }
499 case '/': { 500 case '/': {
500 next(ls); 501 next(ls);
501 if (check_next1(ls, '/')) return TK_IDIV; 502 if (check_next1(ls, '/')) return TK_IDIV; /* '//' */
502 else return '/'; 503 else return '/';
503 } 504 }
504 case '~': { 505 case '~': {
505 next(ls); 506 next(ls);
506 if (check_next1(ls, '=')) return TK_NE; 507 if (check_next1(ls, '=')) return TK_NE; /* '~=' */
507 else return '~'; 508 else return '~';
508 } 509 }
509 case ':': { 510 case ':': {
510 next(ls); 511 next(ls);
511 if (check_next1(ls, ':')) return TK_DBCOLON; 512 if (check_next1(ls, ':')) return TK_DBCOLON; /* '::' */
512 else return ':'; 513 else return ':';
513 } 514 }
514 case '"': case '\'': { /* short literal strings */ 515 case '"': case '\'': { /* short literal strings */
@@ -547,7 +548,7 @@ static int llex (LexState *ls, SemInfo *seminfo) {
547 return TK_NAME; 548 return TK_NAME;
548 } 549 }
549 } 550 }
550 else { /* single-char tokens (+ - / ...) */ 551 else { /* single-char tokens ('+', '*', '%', '{', '}', ...) */
551 int c = ls->current; 552 int c = ls->current;
552 next(ls); 553 next(ls);
553 return c; 554 return c;
diff --git a/lparser.c b/lparser.c
index bcdcfb6d..fb7a1264 100644
--- a/lparser.c
+++ b/lparser.c
@@ -945,7 +945,7 @@ static void setvararg (FuncState *fs, int nparams) {
945 945
946 946
947static void parlist (LexState *ls) { 947static void parlist (LexState *ls) {
948 /* parlist -> [ param { ',' param } ] */ 948 /* parlist -> [ {NAME ','} (NAME | '...') ] */
949 FuncState *fs = ls->fs; 949 FuncState *fs = ls->fs;
950 Proto *f = fs->f; 950 Proto *f = fs->f;
951 int nparams = 0; 951 int nparams = 0;
@@ -953,12 +953,12 @@ static void parlist (LexState *ls) {
953 if (ls->t.token != ')') { /* is 'parlist' not empty? */ 953 if (ls->t.token != ')') { /* is 'parlist' not empty? */
954 do { 954 do {
955 switch (ls->t.token) { 955 switch (ls->t.token) {
956 case TK_NAME: { /* param -> NAME */ 956 case TK_NAME: {
957 new_localvar(ls, str_checkname(ls)); 957 new_localvar(ls, str_checkname(ls));
958 nparams++; 958 nparams++;
959 break; 959 break;
960 } 960 }
961 case TK_DOTS: { /* param -> '...' */ 961 case TK_DOTS: {
962 luaX_next(ls); 962 luaX_next(ls);
963 isvararg = 1; 963 isvararg = 1;
964 break; 964 break;
@@ -1752,7 +1752,7 @@ static void checktoclose (LexState *ls, int level) {
1752 1752
1753 1753
1754static void localstat (LexState *ls) { 1754static void localstat (LexState *ls) {
1755 /* stat -> LOCAL ATTRIB NAME {',' ATTRIB NAME} ['=' explist] */ 1755 /* stat -> LOCAL NAME ATTRIB { ',' NAME ATTRIB } ['=' explist] */
1756 FuncState *fs = ls->fs; 1756 FuncState *fs = ls->fs;
1757 int toclose = -1; /* index of to-be-closed variable (if any) */ 1757 int toclose = -1; /* index of to-be-closed variable (if any) */
1758 Vardesc *var; /* last variable */ 1758 Vardesc *var; /* last variable */
diff --git a/ltable.c b/ltable.c
index 38bee1dc..7e7cbed9 100644
--- a/ltable.c
+++ b/ltable.c
@@ -166,17 +166,24 @@ static Node *mainpositionTV (const Table *t, const TValue *key) {
166 166
167 167
168/* 168/*
169** Check whether key 'k1' is equal to the key in node 'n2'. 169** Check whether key 'k1' is equal to the key in node 'n2'. This
170** This equality is raw, so there are no metamethods. Floats 170** equality is raw, so there are no metamethods. Floats with integer
171** with integer values have been normalized, so integers cannot 171** values have been normalized, so integers cannot be equal to
172** be equal to floats. It is assumed that 'eqshrstr' is simply 172** floats. It is assumed that 'eqshrstr' is simply pointer equality, so
173** pointer equality, so that short strings are handled in the 173** that short strings are handled in the default case.
174** default case.
175** A true 'deadok' means to accept dead keys as equal to their original 174** A true 'deadok' means to accept dead keys as equal to their original
176** values, which can only happen if the original key was collectable. 175** values. All dead keys are compared in the default case, by pointer
177** All dead values are compared in the default case, by pointer 176** identity. (Only collectable objects can produce dead keys.) Note that
178** identity. (Note that dead long strings are also compared by 177** dead long strings are also compared by identity.
179** identity). 178** Once a key is dead, its corresponding value may be collected, and
179** then another value can be created with the same address. If this
180** other value is given to 'next', 'equalkey' will signal a false
181** positive. In a regular traversal, this situation should never happen,
182** as all keys given to 'next' came from the table itself, and therefore
183** could not have been collected. Outside a regular traversal, we
184** have garbage in, garbage out. What is relevant is that this false
185** positive does not break anything. (In particular, 'next' will return
186** some other valid item on the table or nil.)
180*/ 187*/
181static int equalkey (const TValue *k1, const Node *n2, int deadok) { 188static int equalkey (const TValue *k1, const Node *n2, int deadok) {
182 if ((rawtt(k1) != keytt(n2)) && /* not the same variants? */ 189 if ((rawtt(k1) != keytt(n2)) && /* not the same variants? */