Source code

Revision control

Copy as Markdown

Other Tools

/*
* Any copyright is dedicated to the Public Domain.
*/
//-----------------------------------------------------------------------------
var BUGNUMBER = 1476409;
var summary =
"Properly handle the case of U+005C REVERSE SOLIDUS U+000D CARRIAGE RETURN " +
"at the end of source text being tokenized, in the middle of a string or " +
"template literal, where the next code point in memory (outside the bounds " +
"of the source text) is U+000A LINE FEED";
print(BUGNUMBER + ": " + summary);
/**************
* BEGIN TEST *
**************/
function expectSyntaxError(code)
{
try
{
eval(code);
throw new Error("didn't throw");
}
catch (e)
{
assertEq(e instanceof SyntaxError, true,
"got " + e.name + ", expected SyntaxError");
}
}
// The fundamental requirements of this test:
//
// 1. The computed string that is eval'd must be a Script that ends in a string
// literal ending with the code points U+005C REVERSE SOLIDUS U+000D CARRIAGE
// RETURN.
// 2. The *memory* that is actually tokenized/parsed by eval must be
// immediately followed by U+000A LINE FEED.
//
// There's only one way to guarantee a U+000A LINE FEED after the source text:
// compute the source text as a dependent string, of a larger (linear) string.
// A simple substr will do the trick -- just as long as the substring can't fit
// in inline storage. 53 in the tests below comfortably exceeds all inline
// storage limits.
//
// One final wrinkle: because we only tokenize/parse two-byte source text right
// now, ensuring we directly tokenize/parse the dependent string's character
// data means the dependent string must have two-byte character data, hence the
// '\u1234' in the strings below.
function singleQuote()
{
var containsBadSingleQuoteLiteral =
"\u1234x'01234567890123456789012345678901234567890123456789\\\r\n0123456789";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
expectSyntaxError(containsBadSingleQuoteLiteral.substr(2, 53));
}
singleQuote();
function doubleQuote()
{
var containsBadDoubleQuoteLiteral =
"\u1234x\"01234567890123456789012345678901234567890123456789\\\r\n0123456789";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
expectSyntaxError(containsBadDoubleQuoteLiteral.substr(2, 53));
}
doubleQuote();
function template()
{
var containsBadTemplateLiteral =
"\u1234x`01234567890123456789012345678901234567890123456789\\\r\n0123456789";
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
expectSyntaxError(containsBadTemplateLiteral.substr(2, 53));
}
template();
/******************************************************************************/
if (typeof reportCompare === "function")
reportCompare(true, true);
print("Tests complete");