shithub: rgbds

Download patch

ref: 20b2f5ee2f7cfe8f100c30b6ff6236e63daf76be
parent: 9b40663d543db447e2790fb41761626be651233e
author: ISSOtm <[email protected]>
date: Sat Aug 31 23:42:50 EDT 2019

Fix incorrect line numbers with some IF blocks
If a line ended with a string's closing quote, or a newline escape, then
skipping over that line via IF/ELIF/ELSE would fail to count that line,
offsetting the rest of the file.
I have no idea why but for some reason 9829be1 changed *specifically*
`if_skip_to_else` to have incorrect behavior on string endings. The incorrect
behavior on newline escapes seems to have been here since the beginning.
Also added a test to check for both of those behaviors in both functions.

Honestly, it baffles me that nobody ever noticed. I didn't until I started
working on #395.

--- a/src/asm/asmy.y
+++ b/src/asm/asmy.y
@@ -354,20 +354,14 @@
 				src++;
 			}
 		} else {
-			switch (*src) {
-			case '\\':
-				src += 2;
-				break;
-
-			case '\"':
-				src += 2;
+			if (*src == '\"') {
 				inString = false;
-				break;
-
-			default:
-				src++;
-				break;
+			} else if (*src == '\\') {
+				/* Escaped quotes don't end the string */
+				if (*++src != '\"')
+					src--;
 			}
+			src++;
 		}
 	}
 
@@ -405,21 +399,14 @@
 				src++;
 			}
 		} else {
-			switch (*src) {
-
-			case '\\':
-				src += 2;
-				break;
-
-			case '\"':
-				src++;
+			if (*src == '\"') {
 				inString = false;
-				break;
-
-			default:
-				src++;
-				break;
+			} else if (*src == '\\') {
+				/* Escaped quotes don't end the string */
+				if (*++src != '\"')
+					src--;
 			}
+			src++;
 		}
 	}
 
--- /dev/null
+++ b/test/asm/correct-line-number.asm
@@ -1,0 +1,11 @@
+IF 0
+	"\
+	"
+ELIF 1
+	WARN "Am I geting ahead of myself?"
+ELSE
+	"\
+	"
+ENDC
+
+WARN "Hopefully not."
\ No newline at end of file
--- /dev/null
+++ b/test/asm/correct-line-number.out
@@ -1,0 +1,4 @@
+warning: correct-line-number.asm(5):
+    Am I geting ahead of myself?
+warning: correct-line-number.asm(11):
+    Hopefully not.
--- /dev/null
+++ b/test/asm/correct-line-number.out.pipe
@@ -1,0 +1,4 @@
+warning: -(5):
+    Am I geting ahead of myself?
+warning: -(11):
+    Hopefully not.
--- a/test/asm/multiple-charmaps.out
+++ b/test/asm/multiple-charmaps.out
@@ -1,6 +1,6 @@
 warning: multiple-charmaps.asm(75):
     Using 'charmap' within a section when the current charmap is 'main' is deprecated
-ERROR: multiple-charmaps.asm(100) -> new_(5):
+ERROR: multiple-charmaps.asm(100) -> new_(6):
     Charmap 'map1' already exists
 ERROR: multiple-charmaps.asm(102) -> set_(2):
     Charmap 'map5' doesn't exist
--- a/test/asm/multiple-charmaps.out.pipe
+++ b/test/asm/multiple-charmaps.out.pipe
@@ -1,6 +1,6 @@
 warning: -(75):
     Using 'charmap' within a section when the current charmap is 'main' is deprecated
-ERROR: -(100) -> new_(5):
+ERROR: -(100) -> new_(6):
     Charmap 'map1' already exists
 ERROR: -(102) -> set_(2):
     Charmap 'map5' doesn't exist