repl: backslash bug fix
authorSakthipriyan Vairamani <thechargingvolcano@gmail.com>
Sun, 20 Sep 2015 10:37:21 +0000 (16:07 +0530)
committerRod Vagg <rod@vagg.org>
Tue, 22 Sep 2015 22:39:33 +0000 (08:39 +1000)
The actual problem was with the line parsing logic for string literals.
When we use backslash in the string literals, it used to remember the
`\` as the previous character even after we parsed the character next
to it. This leads to REPL thinking that the end of string literals is
not reached.

This patch replaces the previous character with `null`, so that it will
properly skip the character next to it.

Previous Discussion: https://github.com/nodejs/node/pull/2952
Fixes: https://github.com/nodejs/node/issues/2749
PR-URL: https://github.com/nodejs/node/pull/2968
Reviewed-By: Roman Reiss <me@silverwind.io>
lib/repl.js
test/parallel/test-repl.js

index e61a5ed..81afd27 100644 (file)
@@ -288,8 +288,9 @@ function REPLServer(prompt,
 
     for (var i = 0; i < line.length; i += 1) {
       if (previous === '\\') {
-        // if it is a valid escaping, then skip processing
-        previous = current;
+        // if it is a valid escaping, then skip processing and the previous
+        // character doesn't matter anymore.
+        previous = null;
         continue;
       }
 
index ac890cf..e121cb7 100644 (file)
@@ -242,6 +242,13 @@ function error_test() {
             'RegExp.$6\nRegExp.$7\nRegExp.$8\nRegExp.$9\n',
       expect: ['\'1\'\n', '\'2\'\n', '\'3\'\n', '\'4\'\n', '\'5\'\n', '\'6\'\n',
                '\'7\'\n', '\'8\'\n', '\'9\'\n'].join(`${prompt_unix}`) },
+    // regression tests for https://github.com/nodejs/node/issues/2749
+    { client: client_unix, send: 'function x() {\nreturn \'\\n\';\n }',
+      expect: prompt_multiline + prompt_multiline +
+              'undefined\n' + prompt_unix },
+    { client: client_unix, send: 'function x() {\nreturn \'\\\\\';\n }',
+      expect: prompt_multiline + prompt_multiline +
+              'undefined\n' + prompt_unix },
   ]);
 }