diff options
Diffstat (limited to 'deps/v8/test')
-rw-r--r-- | deps/v8/test/cctest/test-api.cc | 25 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-compiler.cc | 13 | ||||
-rw-r--r-- | deps/v8/test/cctest/test-log.cc | 94 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/assert-opt-and-deopt.js | 2 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/date-parse.js | 6 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/date.js | 120 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js | 132 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/debug-evaluate-locals-optimized.js | 119 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/element-kind.js | 102 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/fuzz-natives.js | 3 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/mjsunit.status | 6 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-1360.js | 39 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-1513.js | 44 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-1521.js | 47 | ||||
-rw-r--r-- | deps/v8/test/mjsunit/regress/regress-1528.js | 40 | ||||
-rw-r--r-- | deps/v8/test/sputnik/README | 4 | ||||
-rw-r--r-- | deps/v8/test/sputnik/sputnik.status | 18 |
17 files changed, 704 insertions, 110 deletions
diff --git a/deps/v8/test/cctest/test-api.cc b/deps/v8/test/cctest/test-api.cc index 097743dd1f..1531f905d1 100644 --- a/deps/v8/test/cctest/test-api.cc +++ b/deps/v8/test/cctest/test-api.cc @@ -14659,3 +14659,28 @@ THREADED_TEST(ReadOnlyIndexedProperties) { obj->Set(v8_str("2000000000"), v8_str("foobar")); CHECK_EQ(v8_str("DONT_CHANGE"), obj->Get(v8_str("2000000000"))); } + + +THREADED_TEST(Regress1516) { + v8::HandleScope scope; + + LocalContext context; + { v8::HandleScope temp_scope; + CompileRun("({'a': 0})"); + } + + int elements; + { i::MapCache* map_cache = + i::MapCache::cast(i::Isolate::Current()->context()->map_cache()); + elements = map_cache->NumberOfElements(); + CHECK_LE(1, elements); + } + + i::Isolate::Current()->heap()->CollectAllGarbage(true); + { i::Object* raw_map_cache = i::Isolate::Current()->context()->map_cache(); + if (raw_map_cache != i::Isolate::Current()->heap()->undefined_value()) { + i::MapCache* map_cache = i::MapCache::cast(raw_map_cache); + CHECK_GT(elements, map_cache->NumberOfElements()); + } + } +} diff --git a/deps/v8/test/cctest/test-compiler.cc b/deps/v8/test/cctest/test-compiler.cc index 4c5f197bc6..72907b6e9a 100644 --- a/deps/v8/test/cctest/test-compiler.cc +++ b/deps/v8/test/cctest/test-compiler.cc @@ -375,10 +375,15 @@ static void CheckCodeForUnsafeLiteral(Handle<JSFunction> f) { v8::internal::EmbeddedVector<char, 128> decode_buffer; while (pc < end) { - pc += d.InstructionDecode(decode_buffer, pc); - CHECK(strstr(decode_buffer.start(), "mov eax,0x178c29c") == NULL); - CHECK(strstr(decode_buffer.start(), "push 0x178c29c") == NULL); - CHECK(strstr(decode_buffer.start(), "0x178c29c") == NULL); + int num_const = d.ConstantPoolSizeAt(pc); + if (num_const >= 0) { + pc += num_const * kPointerSize; + } else { + pc += d.InstructionDecode(decode_buffer, pc); + CHECK(strstr(decode_buffer.start(), "mov eax,0x178c29c") == NULL); + CHECK(strstr(decode_buffer.start(), "push 0x178c29c") == NULL); + CHECK(strstr(decode_buffer.start(), "0x178c29c") == NULL); + } } } } diff --git a/deps/v8/test/cctest/test-log.cc b/deps/v8/test/cctest/test-log.cc index e7a178cc53..10a90bcf17 100644 --- a/deps/v8/test/cctest/test-log.cc +++ b/deps/v8/test/cctest/test-log.cc @@ -251,7 +251,7 @@ static void CheckThatProfilerWorks(LogBufferMatcher* matcher) { !LoggerTestHelper::IsSamplerActive()); LoggerTestHelper::ResetSamplesTaken(); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 0); + LOGGER->ResumeProfiler(); CHECK(LoggerTestHelper::IsSamplerActive()); // Verify that the current map of compiled functions has been logged. @@ -273,7 +273,7 @@ static void CheckThatProfilerWorks(LogBufferMatcher* matcher) { i::OS::Sleep(1); } - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 0); + LOGGER->PauseProfiler(); CHECK(i::RuntimeProfiler::IsEnabled() || !LoggerTestHelper::IsSamplerActive()); @@ -614,99 +614,13 @@ TEST(LogAccessorCallbacks) { } -TEST(LogTags) { - ScopedLoggerInitializer initialize_logger(false); - LogBufferMatcher matcher; - - const char* open_tag = "open-tag,"; - const char* close_tag = "close-tag,"; - - // Check compatibility with the old style behavior. - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 0); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 0); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - CHECK_EQ(NULL, matcher.Find(open_tag)); - CHECK_EQ(NULL, matcher.Find(close_tag)); - - const char* open_tag1 = "open-tag,1\n"; - const char* close_tag1 = "close-tag,1\n"; - - // Check non-nested tag case. - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - CHECK_GT(matcher.GetNextChunk(), 0); - CHECK(matcher.IsInSequence(open_tag1, close_tag1)); - - const char* open_tag2 = "open-tag,2\n"; - const char* close_tag2 = "close-tag,2\n"; - - // Check nested tags case. - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - CHECK_GT(matcher.GetNextChunk(), 0); - // open_tag1 < open_tag2 < close_tag2 < close_tag1 - CHECK(matcher.IsInSequence(open_tag1, open_tag2)); - CHECK(matcher.IsInSequence(open_tag2, close_tag2)); - CHECK(matcher.IsInSequence(close_tag2, close_tag1)); - - // Check overlapped tags case. - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - CHECK_GT(matcher.GetNextChunk(), 0); - // open_tag1 < open_tag2 < close_tag1 < close_tag2 - CHECK(matcher.IsInSequence(open_tag1, open_tag2)); - CHECK(matcher.IsInSequence(open_tag2, close_tag1)); - CHECK(matcher.IsInSequence(close_tag1, close_tag2)); - - const char* open_tag3 = "open-tag,3\n"; - const char* close_tag3 = "close-tag,3\n"; - - // Check pausing overflow case. - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 2); - CHECK_EQ(v8::PROFILER_MODULE_CPU, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 1); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 3); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 3); - CHECK_EQ(v8::PROFILER_MODULE_NONE, LOGGER->GetActiveProfilerModules()); - // Must be no tags, because logging must be disabled. - CHECK_EQ(NULL, matcher.Find(open_tag3)); - CHECK_EQ(NULL, matcher.Find(close_tag3)); -} - - TEST(IsLoggingPreserved) { ScopedLoggerInitializer initialize_logger(false); CHECK(LOGGER->is_logging()); - LOGGER->ResumeProfiler(v8::PROFILER_MODULE_CPU, 1); + LOGGER->ResumeProfiler(); CHECK(LOGGER->is_logging()); - LOGGER->PauseProfiler(v8::PROFILER_MODULE_CPU, 1); + LOGGER->PauseProfiler(); CHECK(LOGGER->is_logging()); } diff --git a/deps/v8/test/mjsunit/assert-opt-and-deopt.js b/deps/v8/test/mjsunit/assert-opt-and-deopt.js index b624ba560c..f589868657 100644 --- a/deps/v8/test/mjsunit/assert-opt-and-deopt.js +++ b/deps/v8/test/mjsunit/assert-opt-and-deopt.js @@ -148,7 +148,7 @@ tracker.AssertIsOptimized(f, false); tracker.AssertDeoptHappened(f, false); tracker.AssertDeoptCount(f, 0); -for (var i = 0; i < 5; i++) f(1); +for (var i = 0; i < 2; i++) f(1); tracker.AssertOptCount(f, 0); tracker.AssertIsOptimized(f, false); diff --git a/deps/v8/test/mjsunit/date-parse.js b/deps/v8/test/mjsunit/date-parse.js index 23a69934d4..a1eef663b9 100644 --- a/deps/v8/test/mjsunit/date-parse.js +++ b/deps/v8/test/mjsunit/date-parse.js @@ -285,9 +285,9 @@ for (var i = 0; i < 24 * 365 * 100; i += 150) { // Negative tests. var testCasesNegative = [ - 'May 25 2008 1:30 (PM)) UTC', - 'May 25 2008 1:30( )AM (PM)', - 'May 25 2008 AAA (GMT)']; + 'May 25 2008 1:30 (PM)) UTC', // Bad unmatched ')' after number. + 'May 25 2008 1:30( )AM (PM)', // + 'May 25 2008 AAA (GMT)']; // Unknown word after number. testCasesNegative.forEach(function (s) { assertTrue(isNaN(Date.parse(s)), s + " is not NaN."); diff --git a/deps/v8/test/mjsunit/date.js b/deps/v8/test/mjsunit/date.js index f13af8266d..a7f6cfa7d5 100644 --- a/deps/v8/test/mjsunit/date.js +++ b/deps/v8/test/mjsunit/date.js @@ -187,3 +187,123 @@ d = new Date(1969, 12, 1, Infinity); assertTrue(isNaN(d.getTime())); d = new Date(1969, 12, 1, -Infinity); assertTrue(isNaN(d.getTime())); + +// Parsing ES5 ISO-8601 dates. +// When TZ is omitted, it defaults to 'Z' meaning UTC. + +// Check epoch. +assertEquals(0, Date.parse("1970-01-01T00:00:00.000+00:00")); +assertEquals(0, Date.parse("1970-01-01T00:00:00.000-00:00")); +assertEquals(0, Date.parse("1970-01-01T00:00:00.000Z")); +assertEquals(0, Date.parse("1970-01-01T00:00:00.000")); +assertEquals(0, Date.parse("1970-01-01T00:00:00")); +assertEquals(0, Date.parse("1970-01-01T00:00")); +assertEquals(0, Date.parse("1970-01-01")); + +assertEquals(0, Date.parse("1970-01T00:00:00.000+00:00")); +assertEquals(0, Date.parse("1970-01T00:00:00.000-00:00")); +assertEquals(0, Date.parse("1970-01T00:00:00.000Z")); +assertEquals(0, Date.parse("1970-01T00:00:00.000")); +assertEquals(0, Date.parse("1970-01T00:00:00")); +assertEquals(0, Date.parse("1970-01T00:00")); +assertEquals(0, Date.parse("1970-01")); + +assertEquals(0, Date.parse("1970T00:00:00.000+00:00")); +assertEquals(0, Date.parse("1970T00:00:00.000-00:00")); +assertEquals(0, Date.parse("1970T00:00:00.000Z")); +assertEquals(0, Date.parse("1970T00:00:00.000")); +assertEquals(0, Date.parse("1970T00:00:00")); +assertEquals(0, Date.parse("1970T00:00")); +assertEquals(0, Date.parse("1970")); + +assertEquals(0, Date.parse("+001970-01-01T00:00:00.000+00:00")); +assertEquals(0, Date.parse("+001970-01-01T00:00:00.000-00:00")); +assertEquals(0, Date.parse("+001970-01-01T00:00:00.000Z")); +assertEquals(0, Date.parse("+001970-01-01T00:00:00.000")); +assertEquals(0, Date.parse("+001970-01-01T00:00:00")); +assertEquals(0, Date.parse("+001970-01-01T00:00")); +assertEquals(0, Date.parse("+001970-01-01")); + +assertEquals(0, Date.parse("+001970-01T00:00:00.000+00:00")); +assertEquals(0, Date.parse("+001970-01T00:00:00.000-00:00")); +assertEquals(0, Date.parse("+001970-01T00:00:00.000Z")); +assertEquals(0, Date.parse("+001970-01T00:00:00.000")); +assertEquals(0, Date.parse("+001970-01T00:00:00")); +assertEquals(0, Date.parse("+001970-01T00:00")); +assertEquals(0, Date.parse("+001970-01")); + +assertEquals(0, Date.parse("+001970T00:00:00.000+00:00")); +assertEquals(0, Date.parse("+001970T00:00:00.000-00:00")); +assertEquals(0, Date.parse("+001970T00:00:00.000Z")); +assertEquals(0, Date.parse("+001970T00:00:00.000")); +assertEquals(0, Date.parse("+001970T00:00:00")); +assertEquals(0, Date.parse("+001970T00:00")); +assertEquals(0, Date.parse("+001970")); + +// Check random date. +assertEquals(70671003500, Date.parse("1972-03-28T23:50:03.500+01:00")); +assertEquals(70674603500, Date.parse("1972-03-28T23:50:03.500Z")); +assertEquals(70674603500, Date.parse("1972-03-28T23:50:03.500")); +assertEquals(70674603000, Date.parse("1972-03-28T23:50:03")); +assertEquals(70674600000, Date.parse("1972-03-28T23:50")); +assertEquals(70588800000, Date.parse("1972-03-28")); + +assertEquals(68338203500, Date.parse("1972-03T23:50:03.500+01:00")); +assertEquals(68341803500, Date.parse("1972-03T23:50:03.500Z")); +assertEquals(68341803500, Date.parse("1972-03T23:50:03.500")); +assertEquals(68341803000, Date.parse("1972-03T23:50:03")); +assertEquals(68341800000, Date.parse("1972-03T23:50")); +assertEquals(68256000000, Date.parse("1972-03")); + +assertEquals(63154203500, Date.parse("1972T23:50:03.500+01:00")); +assertEquals(63157803500, Date.parse("1972T23:50:03.500Z")); +assertEquals(63157803500, Date.parse("1972T23:50:03.500")); +assertEquals(63157803000, Date.parse("1972T23:50:03")); +assertEquals(63072000000, Date.parse("1972")); + +assertEquals(70671003500, Date.parse("+001972-03-28T23:50:03.500+01:00")); +assertEquals(70674603500, Date.parse("+001972-03-28T23:50:03.500Z")); +assertEquals(70674603500, Date.parse("+001972-03-28T23:50:03.500")); +assertEquals(70674603000, Date.parse("+001972-03-28T23:50:03")); +assertEquals(70674600000, Date.parse("+001972-03-28T23:50")); +assertEquals(70588800000, Date.parse("+001972-03-28")); + +assertEquals(68338203500, Date.parse("+001972-03T23:50:03.500+01:00")); +assertEquals(68341803500, Date.parse("+001972-03T23:50:03.500Z")); +assertEquals(68341803500, Date.parse("+001972-03T23:50:03.500")); +assertEquals(68341803000, Date.parse("+001972-03T23:50:03")); +assertEquals(68341800000, Date.parse("+001972-03T23:50")); +assertEquals(68256000000, Date.parse("+001972-03")); + +assertEquals(63154203500, Date.parse("+001972T23:50:03.500+01:00")); +assertEquals(63157803500, Date.parse("+001972T23:50:03.500Z")); +assertEquals(63157803500, Date.parse("+001972T23:50:03.500")); +assertEquals(63157803000, Date.parse("+001972T23:50:03")); +assertEquals(63072000000, Date.parse("+001972")); + + +// Ensure that ISO-years in the range 00-99 aren't translated to the range +// 1950..2049. +assertEquals(-60904915200000, Date.parse("0040-01-01")); +assertEquals(-60273763200000, Date.parse("0060-01-01")); +assertEquals(-62167219200000, Date.parse("0000-01-01")); +assertEquals(-62167219200000, Date.parse("+000000-01-01")); + +// Test negative years. +assertEquals(-63429523200000, Date.parse("-000040-01-01")); +assertEquals(-64060675200000, Date.parse("-000060-01-01")); +assertEquals(-124397510400000, Date.parse("-001972-01-01")); + +// Check time-zones. +assertEquals(70674603500, Date.parse("1972-03-28T23:50:03.500Z")); +for (var i = 0; i < 24; i++) { + var hh = (i < 10) ? "0" + i : "" + i; + for (var j = 0; j < 60; j += 15) { + var mm = (j < 10) ? "0" + j : "" + j; + var ms = (i * 60 + j) * 60000; + var string = "1972-03-28T23:50:03.500-" + hh + ":" + mm; + assertEquals(70674603500 + ms, Date.parse(string), string); + string = "1972-03-28T23:50:03.500+" + hh + ":" + mm; + assertEquals(70674603500 - ms, Date.parse(string), string); + } +} diff --git a/deps/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js b/deps/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js new file mode 100644 index 0000000000..10dfbabf0c --- /dev/null +++ b/deps/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js @@ -0,0 +1,132 @@ +// Copyright 2008 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-debug-as debug --allow-natives-syntax +// Get the Debug object exposed from the debug context global object. +Debug = debug.Debug + +listenerComplete = false; +exception = false; + + +function listener(event, exec_state, event_data, data) { + try { + if (event == Debug.DebugEvent.Break) + { + assertEquals(6, exec_state.frameCount()); + + for (var i = 0; i < exec_state.frameCount(); i++) { + var frame = exec_state.frame(i); + // All frames except the bottom one has normal variables a and b. + if (i < exec_state.frameCount() - 1) { + assertEquals('a', frame.localName(0)); + assertEquals('b', frame.localName(1)); + assertEquals(i * 2 + 1 + (i * 2 + 1) / 100, + frame.localValue(0).value()); + assertEquals(i * 2 + 2 + (i * 2 + 2) / 100, + frame.localValue(1).value()); + } + + // When function f is optimized (2 means YES, see runtime.cc) we + // expect an optimized frame for f with g1, g2 and g3 inlined. + if (%GetOptimizationStatus(f) == 2) { + if (i == 1 || i == 2 || i == 3) { + assertTrue(frame.isOptimizedFrame()); + assertTrue(frame.isInlinedFrame()); + } else if (i == 4) { + assertTrue(frame.isOptimizedFrame()); + assertFalse(frame.isInlinedFrame()); + } else { + assertFalse(frame.isOptimizedFrame()); + assertFalse(frame.isInlinedFrame()); + } + } + } + + // Indicate that all was processed. + listenerComplete = true; + } + } catch (e) { + exception = e + }; +}; + +f();f();f(); +%OptimizeFunctionOnNextCall(f); +f(); + +// Add the debug event listener. +Debug.setListener(listener); + +function h(x, y) { + var a = 1; + var b = 2; + a = a + a / 100; + b = b + b / 100; + debugger; // Breakpoint. +}; + +function g3(x, y) { + var a = 3; + var b = 4; + a = a + a / 100; + b = b + b / 100; + h(a, b); + return a+b; +}; + +function g2(x, y) { + var a = 5; + var b = 6; + a = a + a / 100; + b = b + b / 100; + g3(a, b); +}; + +function g1(x, y) { + var a = 7; + var b = 8; + a = a + a / 100; + b = b + b / 100; + g2(a, b); +}; + +function f(x, y) { + var a = 9; + var b = 10; + a = a + a / 100; + b = b + b / 100; + g1(a, b); +}; + +f(11.11, 12.12); + +// Make sure that the debug event listener vas invoked. +assertFalse(exception, "exception in listener " + exception) +assertTrue(listenerComplete); + +Debug.setListener(null); diff --git a/deps/v8/test/mjsunit/debug-evaluate-locals-optimized.js b/deps/v8/test/mjsunit/debug-evaluate-locals-optimized.js new file mode 100644 index 0000000000..cdff0b718d --- /dev/null +++ b/deps/v8/test/mjsunit/debug-evaluate-locals-optimized.js @@ -0,0 +1,119 @@ +// Copyright 2008 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-debug-as debug --allow-natives-syntax +// Get the Debug object exposed from the debug context global object. +Debug = debug.Debug + +listenerComplete = false; +exception = false; + + +function listener(event, exec_state, event_data, data) { + try { + if (event == Debug.DebugEvent.Break) + { + assertEquals(6, exec_state.frameCount()); + + for (var i = 0; i < exec_state.frameCount(); i++) { + var frame = exec_state.frame(i); + // All frames except the bottom one has normal variables a and b. + if (i < exec_state.frameCount() - 1) { + assertEquals('a', frame.localName(0)); + assertEquals('b', frame.localName(1)); + assertEquals(i * 2 + 1, frame.localValue(0).value()); + assertEquals(i * 2 + 2, frame.localValue(1).value()); + } + + // When function f is optimized (2 means YES, see runtime.cc) we + // expect an optimized frame for f with g1, g2 and g3 inlined. + if (%GetOptimizationStatus(f) == 2) { + if (i == 1 || i == 2 || i == 3) { + assertTrue(frame.isOptimizedFrame()); + assertTrue(frame.isInlinedFrame()); + } else if (i == 4) { + assertTrue(frame.isOptimizedFrame()); + assertFalse(frame.isInlinedFrame()); + } else { + assertFalse(frame.isOptimizedFrame()); + assertFalse(frame.isInlinedFrame()); + } + } + } + + // Indicate that all was processed. + listenerComplete = true; + } + } catch (e) { + exception = e + }; +}; + +f();f();f(); +%OptimizeFunctionOnNextCall(f); +f(); + +// Add the debug event listener. +Debug.setListener(listener); + +function h(x, y) { + var a = 1; + var b = 2; + debugger; // Breakpoint. +}; + +function g3(x, y) { + var a = 3; + var b = 4; + h(a, b); +}; + +function g2(x, y) { + var a = 5; + var b = 6; + g3(a, b); +}; + +function g1(x, y) { + var a = 7; + var b = 8; + g2(a, b); +}; + +function f(x, y) { + var a = 9; + var b = 10; + g1(a, b); +}; + +f(11, 12); + +// Make sure that the debug event listener vas invoked. +assertFalse(exception, "exception in listener " + exception) +assertTrue(listenerComplete); + +Debug.setListener(null); diff --git a/deps/v8/test/mjsunit/element-kind.js b/deps/v8/test/mjsunit/element-kind.js new file mode 100644 index 0000000000..48a029f27e --- /dev/null +++ b/deps/v8/test/mjsunit/element-kind.js @@ -0,0 +1,102 @@ +// 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 element kind of objects + +var element_kind = { + fast_elements : 1, + fast_double_elements : 2, + dictionary_elements : 3, + external_byte_elements : 4, + external_unsigned_byte_elements : 5, + external_short_elements : 6, + external_unsigned_short_elements : 7, + external_int_elements : 8, + external_unsigned_int_elements : 9, + external_float_elements : 10, + external_double_elements : 11, + external_pixel_elements : 12 +} + +// We expect an object to only be of one element kind. +function assertKind(expected, obj){ + assertEquals(expected == element_kind.fast_elements, + %HasFastElements(obj)); + assertEquals(expected == element_kind.fast_double_elements, + %HasFastDoubleElements(obj)); + assertEquals(expected == element_kind.dictionary_elements, + %HasDictionaryElements(obj)); + assertEquals(expected == element_kind.external_byte_elements, + %HasExternalByteElements(obj)); + assertEquals(expected == element_kind.external_unsigned_byte_elements, + %HasExternalUnsignedByteElements(obj)); + assertEquals(expected == element_kind.external_short_elements, + %HasExternalShortElements(obj)); + assertEquals(expected == element_kind.external_unsigned_short_elements, + %HasExternalUnsignedShortElements(obj)); + assertEquals(expected == element_kind.external_int_elements, + %HasExternalIntElements(obj)); + assertEquals(expected == element_kind.external_unsigned_int_elements, + %HasExternalUnsignedIntElements(obj)); + assertEquals(expected == element_kind.external_float_elements, + %HasExternalFloatElements(obj)); + assertEquals(expected == element_kind.external_double_elements, + %HasExternalDoubleElements(obj)); + assertEquals(expected == element_kind.external_pixel_elements, + %HasExternalPixelElements(obj)); + // every external kind is also an external array + assertEquals(expected >= element_kind.external_byte_elements, + %HasExternalArrayElements(obj)); +} + +var me = {}; +assertKind(element_kind.fast_elements, me); +me.dance = 0xD15C0; +me.drink = 0xC0C0A; +assertKind(element_kind.fast_elements, me); + +var you = new Array(); +for(i = 0; i < 1337; i++) { + you[i] = i; +} +assertKind(element_kind.fast_elements, you); + +assertKind(element_kind.dictionary_elements, new Array(0xC0C0A)); + +// fast_double_elements not yet available + + +assertKind(element_kind.external_byte_elements, new Int8Array(9001)); +assertKind(element_kind.external_unsigned_byte_elements, new Uint8Array(007)); +assertKind(element_kind.external_short_elements, new Int16Array(666)); +assertKind(element_kind.external_unsigned_short_elements, new Uint16Array(42)); +assertKind(element_kind.external_int_elements, new Int32Array(0xF)); +assertKind(element_kind.external_unsigned_int_elements, new Uint32Array(23)); +assertKind(element_kind.external_float_elements, new Float32Array(7)); +assertKind(element_kind.external_double_elements, new Float64Array(0)); +assertKind(element_kind.external_pixel_elements, new PixelArray(512)); diff --git a/deps/v8/test/mjsunit/fuzz-natives.js b/deps/v8/test/mjsunit/fuzz-natives.js index 719dc58215..ffa92684dd 100644 --- a/deps/v8/test/mjsunit/fuzz-natives.js +++ b/deps/v8/test/mjsunit/fuzz-natives.js @@ -167,7 +167,8 @@ var knownProblems = { "_SwapElements": true, - // Performance critical function which cannot afford type checks. + // Performance critical functions which cannot afford type checks. + "_IsNativeOrStrictMode": true, "_CallFunction": true, // Tries to allocate based on argument, and (correctly) throws diff --git a/deps/v8/test/mjsunit/mjsunit.status b/deps/v8/test/mjsunit/mjsunit.status index 8bd0e82e02..8ffcafce69 100644 --- a/deps/v8/test/mjsunit/mjsunit.status +++ b/deps/v8/test/mjsunit/mjsunit.status @@ -1,4 +1,4 @@ -# Copyright 2008 the V8 project authors. All rights reserved. +# 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: @@ -31,6 +31,10 @@ prefix mjsunit bugs: FAIL ############################################################################## +# Fails. +regress/regress-1119: FAIL + +############################################################################## # Too slow in debug mode with --stress-opt compiler/regress-stacktrace-methods: PASS, SKIP if $mode == debug compiler/regress-funcaller: PASS, SKIP if $mode == debug diff --git a/deps/v8/test/mjsunit/regress/regress-1360.js b/deps/v8/test/mjsunit/regress/regress-1360.js new file mode 100644 index 0000000000..bebad28bd8 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1360.js @@ -0,0 +1,39 @@ +// 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. + +// Check the receiver for the sort and replace functions to +// Array.prototype.sort and String.prototype.replace. + +var global = this; +function strict() { "use strict"; assertEquals(void 0, this); } +function non_strict() { assertEquals(global, this); } + +[1,2,3].sort(strict); +[1,2,3].sort(non_strict); + +"axc".replace("x", strict); +"axc".replace("x", non_strict); diff --git a/deps/v8/test/mjsunit/regress/regress-1513.js b/deps/v8/test/mjsunit/regress/regress-1513.js new file mode 100644 index 0000000000..06c5edf102 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1513.js @@ -0,0 +1,44 @@ +// 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. + +// Deleting a mapped arguments property and adding it via +// Object.defineProperty should not crash. + +function testcase() { + return (function (a, b, c) { + delete arguments[0]; + Object.defineProperty(arguments, "0", { + value: 10, + writable: false, + enumerable: false, + configurable: false + }); + assertEquals(10, arguments[0]); + }(0, 1, 2)); +} + +testcase(); diff --git a/deps/v8/test/mjsunit/regress/regress-1521.js b/deps/v8/test/mjsunit/regress/regress-1521.js new file mode 100644 index 0000000000..415db67803 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1521.js @@ -0,0 +1,47 @@ +// 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. + +// Optimized variable access inside through a catch context should work. +function test(x) { + try { + throw new Error(); + } catch (e) { + var y = {f: 1}; + var f = function () { + var z = y; + var g = function () { + if (y.f === z.f) return x; + }; + %OptimizeFunctionOnNextCall(g); + return g; + } + assertEquals(3, f()()); + } +} + +test(3); + diff --git a/deps/v8/test/mjsunit/regress/regress-1528.js b/deps/v8/test/mjsunit/regress/regress-1528.js new file mode 100644 index 0000000000..2eb6be1946 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1528.js @@ -0,0 +1,40 @@ +// 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. + +// With (or catch) scopes nested inside catch scopes should look at the +// first outer non-catch scope to decide which closure to use when +// allocating the new context. + +// Code below should not assert or crash. +try { + fail; +} catch (e) { + with({}) { // With scope inside catch scope. + // Dynamic declaration forces runtime lookup to observe the context chain. + eval('const x = 7'); + } +} diff --git a/deps/v8/test/sputnik/README b/deps/v8/test/sputnik/README index 50d721f36e..36566340e1 100644 --- a/deps/v8/test/sputnik/README +++ b/deps/v8/test/sputnik/README @@ -1,6 +1,6 @@ To run the sputniktests you must check out the test suite from googlecode.com. The test expectations are currently relative to -version 94. To get the tests run the following command within +version 97. To get the tests run the following command within v8/test/sputnik/ - svn co http://sputniktests.googlecode.com/svn/trunk/ -r94 sputniktests + svn co http://sputniktests.googlecode.com/svn/trunk/ -r97 sputniktests diff --git a/deps/v8/test/sputnik/sputnik.status b/deps/v8/test/sputnik/sputnik.status index 84c8cb2617..82d8a61c7a 100644 --- a/deps/v8/test/sputnik/sputnik.status +++ b/deps/v8/test/sputnik/sputnik.status @@ -28,6 +28,15 @@ prefix sputnik def FAIL_OK = FAIL, OKAY +############################### BUGS ################################### + +# A bound function should fail on access to 'caller' and 'arguments'. +S15.3.4.5_A1: FAIL +S15.3.4.5_A2: FAIL + +# '__proto__' should be treated as a normal property in JSON. +S15.12.2_A1: FAIL + ##################### DELIBERATE INCOMPATIBILITIES ##################### # This tests precision of trignometric functions. We're slightly off @@ -40,6 +49,7 @@ S15.8.2.13_A23: PASS || FAIL_OK # We allow calls to regexp exec() with no arguments to fail for # compatibility reasons. S15.10.6.2_A1_T16: FAIL_OK +S15.10.6.2_A12: FAIL_OK S15.10.6.3_A1_T16: FAIL_OK # We are silent in some regexp cases where the spec wants us to give @@ -126,16 +136,8 @@ S15.5.4.11_D1.1_T3: PASS || FAIL_OK S12.6.4_D1: PASS || FAIL_OK # We allow function declarations within statements -S12.5_A9_T1: FAIL_OK -S12.5_A9_T2: FAIL_OK -# S12.6.2_A13_T3: FAIL_OK -# S12.5_A9_T3: FAIL_OK -# S12.6.1_A13_T3: FAIL_OK -S12.1_A1: FAIL_OK S12.6.2_A13_T1: FAIL_OK S12.6.2_A13_T2: FAIL_OK -S12.6.1_A13_T1: FAIL_OK -S12.6.1_A13_T2: FAIL_OK S12.6.4_A13_T1: FAIL_OK S12.6.4_A13_T2: FAIL_OK #S12.6.4_A13_T3: FAIL_OK |