Index: test/cctest/test-regressions-sh4.cc |
diff --git a/test/cctest/test-regressions-sh4.cc b/test/cctest/test-regressions-sh4.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b74ef2667fbd5e3a7712849356b921de347770ad |
--- /dev/null |
+++ b/test/cctest/test-regressions-sh4.cc |
@@ -0,0 +1,202 @@ |
+// Copyright 2009 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. |
+ |
+#include <stdlib.h> |
+ |
+#include "v8.h" |
+ |
+#include "api.h" |
+#include "cctest.h" |
+#include "frames-inl.h" |
+#include "string-stream.h" |
+ |
+using ::v8::ObjectTemplate; |
+using ::v8::Value; |
+using ::v8::Context; |
+using ::v8::Local; |
+using ::v8::String; |
+using ::v8::Script; |
+using ::v8::Function; |
+using ::v8::AccessorInfo; |
+using ::v8::Extension; |
+ |
+// Simply returns the undefined object |
+static v8::Handle<Value> CallBack(Local<String> name, |
+ const AccessorInfo& info) { |
+ return v8::Undefined(); |
+} |
+ |
+// Regression test for a defect in -use-ic mode. |
+// The bug returns a: |
+// Fatal error in src/objects.h, line 732 |
+// CHECK(!IsFailure()) failed |
+// The problem was in sh4 MacroAssembler::TryCallApiFunctionAndReturn() |
+// that used r0 as scratch register for DirectCEntryStub(). |
+// This scratch must not be a return value register. |
+// Note: 3 iterations of the loop are necessary to exhibit the issue. |
+THREADED_TEST(IssueLoadCallback) { |
+ v8::HandleScope scope; |
+ v8::Handle<v8::ObjectTemplate> obj = ObjectTemplate::New(); |
+ i::StringStream::ClearMentionedObjectCache(); |
+ obj->SetAccessor(v8_str("xxx"), CallBack); |
+ LocalContext env; |
+ env->Global()->Set(v8_str("obj"), obj->NewInstance()); |
+ Script::Compile(String::New( |
+ "function foo() {" |
+ " return obj.xxx;" |
+ "}" |
+ "for (var i = 0; i < 3; i++) {" |
+ " foo();" |
+ "}"))->Run(); |
+} |
+ |
+// Regression test for a defect in -use-ic mode. |
+// Handling of non-smi value on sh4 was wrong in |
+// KeyedLoadStubCompiler::GenerateLoadExternalArray(). |
+// Used to return -1 instead of INT_MAX. |
+// Note: 3 iterations of the loop are necessary to exhibit the issue. |
+THREADED_TEST(IssueKeyedLoadExtIntArray) { |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ v8::Handle<v8::Object> obj = v8::Object::New(); |
+ int kElementCount = 1; |
+ int32_t* array_data = |
+ static_cast<int32_t*>(malloc(kElementCount * sizeof(int32_t))); |
+ array_data[0] = 2147483647; // Initialize the first element with MAX_INT |
+ obj->SetIndexedPropertiesToExternalArrayData(array_data, |
+ v8::kExternalIntArray, |
+ kElementCount); |
+ context->Global()->Set(v8_str("ext_array"), obj); |
+ const char* boundary_program = |
+ "var res = 0;" |
+ "for (var i = 0; i < 3; i++) {" |
+ " res = ext_array[0];" // Get the first element |
+ "}" |
+ "res;"; |
+ v8::Handle<v8::Value> result = CompileRun(boundary_program); |
+ CHECK_EQ((int64_t)2147483647, result->IntegerValue()); |
+} |
+ |
+// Regression test for a defect in the actual number of argument count. |
+// Handling of actual arguments was wrong when the arguments number |
+// was greater than the formal arguments number in |
+// Builtins::Generate_ArgumentsAdaptorTrampoline(). |
+// Used to return always 0 (formal arguments number of Foo) |
+// in this test instead of the actual arguments number. |
+THREADED_TEST(IssueActualArgumentsNum) { |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ CompileRun( |
+ "function Foo() {" |
+ " return arguments.length;" |
+ "}"); |
+ Local<Function> Foo = |
+ Local<Function>::Cast(context->Global()->Get(v8_str("Foo"))); |
+ |
+ v8::Handle<Value>* args0 = NULL; |
+ Local<v8::Integer> l0 = Local<v8::Integer>::Cast(Foo->Call(Foo, 0, args0)); |
+ CHECK_EQ((int64_t)0, l0->Value()); |
+ |
+ v8::Handle<Value> args1[] = { v8_num(1.1) }; |
+ Local<v8::Integer> l1 = Local<v8::Integer>::Cast(Foo->Call(Foo, 1, args1)); |
+ CHECK_EQ((int64_t)1, l1->Value()); |
+ |
+ v8::Handle<Value> args2[] = { v8_num(2.2), |
+ v8_num(3.3) }; |
+ Local<v8::Integer> l2 = Local<v8::Integer>::Cast(Foo->Call(Foo, 2, args2)); |
+ CHECK_EQ((int64_t)2, l2->Value()); |
+ |
+ v8::Handle<Value> args3[] = { v8_num(4.4), |
+ v8_num(5.5), |
+ v8_num(6.6) }; |
+ Local<v8::Integer> l3 = Local<v8::Integer>::Cast(Foo->Call(Foo, 3, args3)); |
+ CHECK_EQ((int64_t)3, l3->Value()); |
+ |
+ v8::Handle<Value> args4[] = { v8_num(7.7), |
+ v8_num(8.8), |
+ v8_num(9.9), |
+ v8_num(10.11) }; |
+ Local<v8::Integer> l4 = Local<v8::Integer>::Cast(Foo->Call(Foo, 4, args4)); |
+ CHECK_EQ((int64_t)4, l4->Value()); |
+} |
+ |
+// Extracted from test-api/CatchStackOverflow |
+// Fails with a sigsegv on sh4 QEMU. |
+// Reduce the stack size (in Kb) when running cctest, for instance: cctest |
+// -stack_size=256 ... |
+TEST(IssueCatchStackOverflow) { |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ v8::TryCatch try_catch; |
+ v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New( |
+ "function f() {" |
+ " return f();" |
+ "}" |
+ "" |
+ "f();")); |
+ v8::Handle<v8::Value> result = script->Run(); |
+ CHECK(result.IsEmpty()); |
+} |
+ |
+ |
+// Extracted from test-api/Regress528 |
+// Does not return the correct line source information in the exception. |
+// Returns 0 as line number instead of 1. |
+// The problem was in assembler-sh4 where one must call |
+// positions_recorder()->WriteRecordedPositions() for all jsr/jmp |
+TEST(IssueTryCatchSourceInfo) { |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ v8::TryCatch try_catch; |
+ const char* source_exception = "function f(){throw 1;} f()"; |
+ CompileRun(source_exception); |
+ CHECK(try_catch.HasCaught()); |
+ v8::Handle<v8::Message> message = try_catch.Message(); |
+ CHECK(!message.IsEmpty()); |
+ CHECK_EQ(1, message->GetLineNumber()); |
+} |
+ |
+ |
+// Extracted from mjsunit/stack-traces.js |
+// Does not return the correct eval location |
+// when compiled with debuggersupport=off. |
+// This has been corrected in compiler.cc/MakeFunctionInfo() |
+// where the code was guarded by ENABLE_DEBUGGER_SUPPORT. |
+// This guard was moved such tha eval location is |
+// correctly setup. |
+TEST(IssueEvalStackTrace) { |
+ v8::HandleScope scope; |
+ LocalContext context; |
+ v8::TryCatch try_catch; |
+ v8::Handle<v8::Script> script = |
+ v8::Script::Compile(v8::String::New( |
+ "try { eval(\"FAIL\") } catch(e) { e.stack }")); |
+ v8::internal::Handle<v8::internal::String> result = |
+ v8::Utils::OpenHandle(*v8::Handle<v8::String>::Cast(script->Run())); |
+ // Check that the returned string contains an eval location |
+ CHECK(strstr(*(*result)->ToCString(), "eval at") != NULL); |
+} |