Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

repl: backslash bug fix #2952

Closed

Conversation

thefourtheye
Copy link
Contributor

1st commit:

When some string is copied and pasted in REPL, if it has a newline (\n)
in it, then it is considered as end of line and REPL throws a
SyntaxError, because a line cannot end with a unclosed string literal.
This behavior is because of the fact that readline module breaks at
all the \ns in the input string and treats them as a seperate line.
So whenever it encounters a new line character it will emit a line
event.

This commit basically reverts 81ea52a, which was an attempt to improve
the way string literals were handled by REPL.

Fixes: #2749

2nd commit

As it is, the trimWhitespace function will not remove the white sapce
characters at the end of the string, as the greedy capturing group .+
captures everything till end of the string, leaving \s* with nothing.

This patch replaces the buggy function with the built-in, String
prototype's trim function.

Note: The second commit is necessary because, the revert brings back the old buggy trimming function. So, I though we could fix it now itself.

cc @silverwind @Fishrock123

When some string is copied and pasted in REPL, if it has a newline (\n)
in it, then it is considered as end of line and REPL throws a
SyntaxError, because a line cannot end with a unclosed string literal.
This behavior is because of the fact that `readline` module breaks at
all the `\n`s in the input string and treats them as a seperate line.
So whenever it encounters a new line character it will emit a `line`
event.

This commit basically reverts
nodejs@81ea52a,
which was an attempt to improve the way string literals were handled
by REPL.

Fixes: nodejs#2749
As it is, the trimWhitespace function will not remove the white sapce
characters at the end of the string, as the greedy capturing group .+
captures everything till end of the string, leaving \s* with nothing.

This patch replaces the buggy function with the built-in, String
prototype's trim function.
@thefourtheye thefourtheye added the repl Issues and PRs related to the REPL subsystem. label Sep 18, 2015
@silverwind
Copy link
Contributor

LGTM, but your description regarding \n seems inaccurate, I see it happening with any backslash escape sequence:

> function x() {
...   return '\\';
SyntaxError: Unexpected end of input

@thefourtheye
Copy link
Contributor Author


```
➜  io.js git:(master) node      
> process.version
'v2.5.0'
> function x() {
... return '\\';
SyntaxError: Unexpected end of input
    at Object.exports.createScript (vm.js:24:10)
```

---

Edit: Sorry, just realized that this change landed in 2.5.0 only. It used to work fine in 2.4.0. Trying to find the actual problem now.

thefourtheye added a commit to thefourtheye/io.js that referenced this pull request Sep 20, 2015
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: nodejs#2952
Fixes: nodejs#2749
@thefourtheye
Copy link
Contributor Author

@silverwind I could not be more wrong. This problem has nothing to do with the readline module at all. Closing this, as I have opened a new PR with the proper fix. PTAL. Sorry for all the fuss.

@thefourtheye thefourtheye deleted the repl-backslash-bug-fix branch September 20, 2015 10:45
thefourtheye added a commit that referenced this pull request Sep 22, 2015
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: #2952
Fixes: #2749
PR-URL: #2968
Reviewed-By: Roman Reiss <me@silverwind.io>
thefourtheye added a commit that referenced this pull request Sep 22, 2015
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: #2952
Fixes: #2749
PR-URL: #2968
Reviewed-By: Roman Reiss <me@silverwind.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
repl Issues and PRs related to the REPL subsystem.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

repl: backslashes confuse the multiline parser
2 participants