Module Name:    src
Committed By:   rillig
Date:           Sun Mar 13 15:20:50 UTC 2022

Modified Files:
        src/usr.bin/xlint/lint1: lex.c

Log Message:
lint: clean up comments, explain assertion in inssym


To generate a diff of this commit:
cvs rdiff -u -r1.112 -r1.113 src/usr.bin/xlint/lint1/lex.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.112 src/usr.bin/xlint/lint1/lex.c:1.113
--- src/usr.bin/xlint/lint1/lex.c:1.112	Sun Mar 13 15:17:08 2022
+++ src/usr.bin/xlint/lint1/lex.c	Sun Mar 13 15:20:50 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.112 2022/03/13 15:17:08 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.113 2022/03/13 15:20:50 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: lex.c,v 1.112 2022/03/13 15:17:08 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.113 2022/03/13 15:20:50 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -775,9 +775,7 @@ lex_operator(int t, op_t o)
 	return t;
 }
 
-/*
- * Called if lex found a leading \'.
- */
+/* Called if lex found a leading "'". */
 int
 lex_character_constant(void)
 {
@@ -1368,17 +1366,16 @@ lex_unknown_character(int c)
 }
 
 /*
- * As noted above, the scanner does not create new symbol table entries
- * for symbols it cannot find in the symbol table. This is to avoid
- * putting undeclared symbols into the symbol table if a syntax error
- * occurs.
+ * The scanner does not create new symbol table entries for symbols it cannot
+ * find in the symbol table. This is to avoid putting undeclared symbols into
+ * the symbol table if a syntax error occurs.
  *
- * getsym() is called as soon as it is probably ok to put the symbol in the
+ * getsym is called as soon as it is probably ok to put the symbol in the
  * symbol table. It is still possible that symbols are put in the symbol
  * table that are not completely declared due to syntax errors. To avoid too
- * many problems in this case, symbols get type 'int' in getsym().
+ * many problems in this case, symbols get type 'int' in getsym.
  *
- * XXX calls to getsym() should be delayed until decl1*() is called.
+ * XXX calls to getsym should be delayed until declare_1_* is called.
  */
 sym_t *
 getsym(sbuf_t *sb)
@@ -1490,14 +1487,15 @@ rmsym(sym_t *sym)
 }
 
 /*
- * Remove a list of symbols declared at one level from the symbol
- * table.
+ * Remove all symbols from the symbol table that have the same level as the
+ * given symbol.
  */
 void
 rmsyms(sym_t *syms)
 {
 	sym_t	*sym;
 
+	/* Note the use of s_level_next instead of s_symtab_next. */
 	for (sym = syms; sym != NULL; sym = sym->s_level_next) {
 		if (sym->s_block_level != -1) {
 			debug_step("rmsyms '%s' %s '%s'",
@@ -1513,15 +1511,22 @@ rmsyms(sym_t *syms)
  * Put a symbol into the symbol table.
  */
 void
-inssym(int bl, sym_t *sym)
+inssym(int level, sym_t *sym)
 {
 
 	debug_step("inssym '%s' %s '%s'",
 	    sym->s_name, symt_name(sym->s_kind), type_name(sym->s_type));
 	symtab_add(sym);
-	sym->s_block_level = bl;
-	lint_assert(sym->s_symtab_next == NULL ||
-		    sym->s_block_level >= sym->s_symtab_next->s_block_level);
+	sym->s_block_level = level;
+
+	/*
+	 * Placing the inner symbols to the beginning of the list ensures
+	 * that these symbols are preferred over symbols from the outer
+	 * blocks that happen to have the same name.
+	 */
+	lint_assert(sym->s_symtab_next != NULL
+	    ? sym->s_block_level >= sym->s_symtab_next->s_block_level
+	    : true);
 }
 
 /*
@@ -1541,9 +1546,7 @@ clean_up_after_error(void)
 		level_free_all(i);
 }
 
-/*
- * Create a new symbol with the name of an existing symbol.
- */
+/* Create a new symbol with the same name as an existing symbol. */
 sym_t *
 pushdown(const sym_t *sym)
 {

Reply via email to