diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2011-12-14 16:33:07 -0800 |
---|---|---|
committer | Ryan Dahl <ry@tinyclouds.org> | 2011-12-14 16:33:11 -0800 |
commit | de3c16afae8c218d6ecdf9d0b651c40b47c80262 (patch) | |
tree | 40373427f07ce32a02af6f220af2964051a505c4 /deps/v8/test | |
parent | 2255efa171e83b51dec77e68f2be2227b0538562 (diff) | |
download | node-de3c16afae8c218d6ecdf9d0b651c40b47c80262.tar.gz |
Upgrade V8 to 3.6.6.14
Diffstat (limited to 'deps/v8/test')
-rwxr-xr-x | deps/v8/test/cctest/test-parsing.cc | 176 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/compiler/regress-106351.js | 38 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-97116.js | 50 |
3 files changed, 264 insertions, 0 deletions
diff --git a/deps/v8/test/cctest/test-parsing.cc b/deps/v8/test/cctest/test-parsing.cc index f5aed96d7..d98b6753d 100755 --- a/deps/v8/test/cctest/test-parsing.cc +++ b/deps/v8/test/cctest/test-parsing.cc @@ -706,3 +706,179 @@ TEST(RegExpScanning) { TestScanRegExp("/=/", "="); TestScanRegExp("/=?/", "=?"); } + + +void TestParserSync(i::Handle<i::String> source, bool allow_lazy) { + uintptr_t stack_limit = i::Isolate::Current()->stack_guard()->real_climit(); + + // Preparse the data. + i::CompleteParserRecorder log; + i::JavaScriptScanner scanner(i::Isolate::Current()->unicode_cache()); + i::GenericStringUC16CharacterStream stream(source, 0, source->length()); + scanner.Initialize(&stream); + v8::preparser::PreParser::PreParseResult result = + v8::preparser::PreParser::PreParseProgram( + &scanner, &log, allow_lazy, stack_limit); + CHECK_EQ(v8::preparser::PreParser::kPreParseSuccess, result); + i::ScriptDataImpl data(log.ExtractData()); + + // Parse the data + i::Handle<i::Script> script = FACTORY->NewScript(source); + i::Parser parser(script, false, NULL, NULL); + i::FunctionLiteral* function = + parser.ParseProgram(source, true, i::kNonStrictMode); + + i::String* type_string = NULL; + if (function == NULL) { + // Extract exception from the parser. + i::Handle<i::String> type_symbol = FACTORY->LookupAsciiSymbol("type"); + CHECK(i::Isolate::Current()->has_pending_exception()); + i::MaybeObject* maybe_object = i::Isolate::Current()->pending_exception(); + i::JSObject* exception = NULL; + CHECK(maybe_object->To(&exception)); + + // Get the type string. + maybe_object = exception->GetProperty(*type_symbol); + CHECK(maybe_object->To(&type_string)); + } + + // Check that preparsing fails iff parsing fails. + if (data.has_error() && function != NULL) { + i::OS::Print( + "Preparser failed on:\n" + "\t%s\n" + "with error:\n" + "\t%s\n" + "However, the parser succeeded", + *source->ToCString(), data.BuildMessage()); + CHECK(false); + } else if (!data.has_error() && function == NULL) { + i::OS::Print( + "Parser failed on:\n" + "\t%s\n" + "with error:\n" + "\t%s\n" + "However, the preparser succeeded", + *source->ToCString(), *type_string->ToCString()); + CHECK(false); + } + + // Check that preparser and parser produce the same error. + if (function == NULL) { + if (!type_string->IsEqualTo(i::CStrVector(data.BuildMessage()))) { + i::OS::Print( + "Expected parser and preparser to produce the same error on:\n" + "\t%s\n" + "However, found the following error messages\n" + "\tparser: %s\n" + "\tpreparser: %s\n", + *source->ToCString(), *type_string->ToCString(), data.BuildMessage()); + CHECK(false); + } + } +} + + +TEST(ParserSync) { + const char* context_data[][2] = { + { "", "" }, + { "{", "}" }, + { "if (true) ", " else {}" }, + { "if (true) {} else ", "" }, + { "if (true) ", "" }, + { "do ", " while (false)" }, + { "while (false) ", "" }, + { "for (;;) ", "" }, + { "with ({})", "" }, + { "switch (12) { case 12: ", "}" }, + { "switch (12) { default: ", "}" }, + { "label2: ", "" }, + { NULL, NULL } + }; + + const char* statement_data[] = { + "{}", + "var x", + "var x = 1", + "const x", + "const x = 1", + ";", + "12", + "if (false) {} else ;", + "if (false) {} else {}", + "if (false) {} else 12", + "if (false) ;" + "if (false) {}", + "if (false) 12", + "do {} while (false)", + "for (;;) ;", + "for (;;) {}", + "for (;;) 12", + "continue", + "continue label", + "continue\nlabel", + "break", + "break label", + "break\nlabel", + "return", + "return 12", + "return\n12", + "with ({}) ;", + "with ({}) {}", + "with ({}) 12", + "switch ({}) { default: }" + "label3: " + "throw", + "throw 12", + "throw\n12", + "try {} catch(e) {}", + "try {} finally {}", + "try {} catch(e) {} finally {}", + "debugger", + NULL + }; + + const char* termination_data[] = { + "", + ";", + "\n", + ";\n", + "\n;", + NULL + }; + + v8::HandleScope handles; + v8::Persistent<v8::Context> context = v8::Context::New(); + v8::Context::Scope context_scope(context); + + int marker; + i::Isolate::Current()->stack_guard()->SetStackLimit( + reinterpret_cast<uintptr_t>(&marker) - 128 * 1024); + + for (int i = 0; context_data[i][0] != NULL; ++i) { + for (int j = 0; statement_data[j] != NULL; ++j) { + for (int k = 0; termination_data[k] != NULL; ++k) { + int kPrefixLen = i::StrLength(context_data[i][0]); + int kStatementLen = i::StrLength(statement_data[j]); + int kTerminationLen = i::StrLength(termination_data[k]); + int kSuffixLen = i::StrLength(context_data[i][1]); + int kProgramSize = kPrefixLen + kStatementLen + kTerminationLen + + kSuffixLen + i::StrLength("label: for (;;) { }"); + + // Plug the source code pieces together. + i::Vector<char> program = i::Vector<char>::New(kProgramSize + 1); + int length = i::OS::SNPrintF(program, + "label: for (;;) { %s%s%s%s }", + context_data[i][0], + statement_data[j], + termination_data[k], + context_data[i][1]); + CHECK(length == kProgramSize); + i::Handle<i::String> source = + FACTORY->NewStringFromAscii(i::CStrVector(program.start())); + TestParserSync(source, true); + TestParserSync(source, false); + } + } + } +} diff --git a/deps/v8/test/mjsunit/compiler/regress-106351.js b/deps/v8/test/mjsunit/compiler/regress-106351.js new file mode 100644 index 000000000..2a67a055d --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-106351.js @@ -0,0 +1,38 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --allow-natives-syntax + +// Test Math.round with the input reused in the same expression. +function test(x) { + var v = Math.round(x) - x; + assertEquals(0.5, v); +} + +for (var i = 0; i < 5; ++i) test(0.5); +%OptimizeFunctionOnNextCall(test); +test(0.5); diff --git a/deps/v8/test/mjsunit/regress/regress-97116.js b/deps/v8/test/mjsunit/regress/regress-97116.js new file mode 100644 index 000000000..b858ca5e8 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-97116.js @@ -0,0 +1,50 @@ +// Copyright 2011 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Flags: --expose-gc --allow-natives-syntax + +// Check that we are not flushing code for inlined functions that +// have a pending lazy deoptimization on the stack. + +function deopt() { + try { } catch (e) { } // Avoid inlining. + %DeoptimizeFunction(outer); + for (var i = 0; i < 10; i++) gc(); // Force code flushing. +} + +function outer(should_deopt) { + inner(should_deopt); +} + +function inner(should_deopt) { + if (should_deopt) deopt(); +} + +outer(false); +outer(false); +%OptimizeFunctionOnNextCall(outer); +outer(true); |