| Index: test/cctest/test-parsing.cc
|
| diff --git a/test/cctest/test-parsing.cc b/test/cctest/test-parsing.cc
|
| index 7ae8dcfa386d038b929306129e1df66c7ff17eef..0e7466a51c8076b2126d778ad47ae1b845f30634 100755
|
| --- a/test/cctest/test-parsing.cc
|
| +++ b/test/cctest/test-parsing.cc
|
| @@ -270,3 +270,26 @@ TEST(StandAlonePreParser) {
|
| CHECK(!data.has_error());
|
| }
|
| }
|
| +
|
| +
|
| +TEST(RegressChromium62639) {
|
| + int marker;
|
| + i::StackGuard::SetStackLimit(
|
| + reinterpret_cast<uintptr_t>(&marker) - 128 * 1024);
|
| +
|
| + // Ensure that the source code is so big that it triggers preparsing.
|
| + char buffer[4096];
|
| + const char* program_template = "var x = '%01024d'; // filler\n"
|
| + "escape: function() {}";
|
| + // Fails parsing expecting an identifier after "function".
|
| + // Before fix, didn't check *ok after Expect(Token::Identifier, ok),
|
| + // and then used the invalid currently scanned literal. This always
|
| + // failed in debug mode, and sometimes crashed in release mode.
|
| +
|
| + snprintf(buffer, sizeof(buffer), program_template, 0);
|
| + unibrow::Utf8InputBuffer<256> stream(buffer, strlen(buffer));
|
| + i::ScriptDataImpl* data =
|
| + i::ParserApi::PreParse(i::Handle<i::String>::null(), &stream, NULL);
|
| + CHECK(data->HasError());
|
| + delete data;
|
| +}
|
|
|