Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: test/cctest/test-api.cc

Issue 242014: Adds an API for setting the stack limit per-thread. (Closed)
Patch Set: Leaves the limits of pending interrupts alone instead of reestablishing them." Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/x64/simulator-x64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2007-2008 the V8 project authors. All rights reserved. 1 // Copyright 2007-2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 13 matching lines...) Expand all
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 27
28 #include <stdlib.h> 28 #include <stdlib.h>
29 29
30 #include "v8.h" 30 #include "v8.h"
31 31
32 #include "api.h" 32 #include "api.h"
33 #include "compilation-cache.h" 33 #include "compilation-cache.h"
34 #include "execution.h"
34 #include "snapshot.h" 35 #include "snapshot.h"
35 #include "platform.h" 36 #include "platform.h"
36 #include "top.h" 37 #include "top.h"
37 #include "cctest.h" 38 #include "cctest.h"
38 39
40 #if V8_TARGET_ARCH_IA32
41 #include "ia32/simulator-ia32.h"
42 #elif V8_TARGET_ARCH_X64
43 #include "x64/simulator-x64.h"
44 #elif V8_TARGET_ARCH_ARM
45 #include "arm/simulator-arm.h"
46 #else
47 #error Unsupported target architecture.
48 #endif
49
50
39 static bool IsNaN(double x) { 51 static bool IsNaN(double x) {
40 #ifdef WIN32 52 #ifdef WIN32
41 return _isnan(x); 53 return _isnan(x);
42 #else 54 #else
43 return isnan(x); 55 return isnan(x);
44 #endif 56 #endif
45 } 57 }
46 58
47 using ::v8::ObjectTemplate; 59 using ::v8::ObjectTemplate;
48 using ::v8::Value; 60 using ::v8::Value;
(...skipping 1670 matching lines...) Expand 10 before | Expand all | Expand 10 after
1719 "var a = new Array(); while(true) a.push(a);"; 1731 "var a = new Array(); while(true) a.push(a);";
1720 1732
1721 1733
1722 // These tests run for a long time and prevent us from running tests 1734 // These tests run for a long time and prevent us from running tests
1723 // that come after them so they cannot run in parallel. 1735 // that come after them so they cannot run in parallel.
1724 TEST(OutOfMemory) { 1736 TEST(OutOfMemory) {
1725 // It's not possible to read a snapshot into a heap with different dimensions. 1737 // It's not possible to read a snapshot into a heap with different dimensions.
1726 if (v8::internal::Snapshot::IsEnabled()) return; 1738 if (v8::internal::Snapshot::IsEnabled()) return;
1727 // Set heap limits. 1739 // Set heap limits.
1728 static const int K = 1024; 1740 static const int K = 1024;
1729 v8::ResourceConstraints constraints; 1741 v8::HeapResourceConstraints constraints;
1730 constraints.set_max_young_space_size(256 * K); 1742 constraints.set_max_young_space_size(256 * K);
1731 constraints.set_max_old_space_size(4 * K * K); 1743 constraints.set_max_old_space_size(4 * K * K);
1732 v8::SetResourceConstraints(&constraints); 1744 v8::SetHeapResourceConstraints(&constraints);
1733 1745
1734 // Execute a script that causes out of memory. 1746 // Execute a script that causes out of memory.
1735 v8::HandleScope scope; 1747 v8::HandleScope scope;
1736 LocalContext context; 1748 LocalContext context;
1737 v8::V8::IgnoreOutOfMemoryException(); 1749 v8::V8::IgnoreOutOfMemoryException();
1738 Local<Script> script = 1750 Local<Script> script =
1739 Script::Compile(String::New(js_code_causing_out_of_memory)); 1751 Script::Compile(String::New(js_code_causing_out_of_memory));
1740 Local<Value> result = script->Run(); 1752 Local<Value> result = script->Run();
1741 1753
1742 // Check for out of memory state. 1754 // Check for out of memory state.
(...skipping 17 matching lines...) Expand all
1760 1772
1761 return result; 1773 return result;
1762 } 1774 }
1763 1775
1764 1776
1765 TEST(OutOfMemoryNested) { 1777 TEST(OutOfMemoryNested) {
1766 // It's not possible to read a snapshot into a heap with different dimensions. 1778 // It's not possible to read a snapshot into a heap with different dimensions.
1767 if (v8::internal::Snapshot::IsEnabled()) return; 1779 if (v8::internal::Snapshot::IsEnabled()) return;
1768 // Set heap limits. 1780 // Set heap limits.
1769 static const int K = 1024; 1781 static const int K = 1024;
1770 v8::ResourceConstraints constraints; 1782 v8::HeapResourceConstraints constraints;
1771 constraints.set_max_young_space_size(256 * K); 1783 constraints.set_max_young_space_size(256 * K);
1772 constraints.set_max_old_space_size(4 * K * K); 1784 constraints.set_max_old_space_size(4 * K * K);
1773 v8::SetResourceConstraints(&constraints); 1785 v8::SetHeapResourceConstraints(&constraints);
1774 1786
1775 v8::HandleScope scope; 1787 v8::HandleScope scope;
1776 Local<ObjectTemplate> templ = ObjectTemplate::New(); 1788 Local<ObjectTemplate> templ = ObjectTemplate::New();
1777 templ->Set(v8_str("ProvokeOutOfMemory"), 1789 templ->Set(v8_str("ProvokeOutOfMemory"),
1778 v8::FunctionTemplate::New(ProvokeOutOfMemory)); 1790 v8::FunctionTemplate::New(ProvokeOutOfMemory));
1779 LocalContext context(0, templ); 1791 LocalContext context(0, templ);
1780 v8::V8::IgnoreOutOfMemoryException(); 1792 v8::V8::IgnoreOutOfMemoryException();
1781 Local<Value> result = CompileRun( 1793 Local<Value> result = CompileRun(
1782 "var thrown = false;" 1794 "var thrown = false;"
1783 "try {" 1795 "try {"
1784 " ProvokeOutOfMemory();" 1796 " ProvokeOutOfMemory();"
1785 "} catch (e) {" 1797 "} catch (e) {"
1786 " thrown = true;" 1798 " thrown = true;"
1787 "}"); 1799 "}");
1788 // Check for out of memory state. 1800 // Check for out of memory state.
1789 CHECK(result.IsEmpty()); 1801 CHECK(result.IsEmpty());
1790 CHECK(context->HasOutOfMemoryException()); 1802 CHECK(context->HasOutOfMemoryException());
1791 } 1803 }
1792 1804
1793 1805
1794 TEST(HugeConsStringOutOfMemory) { 1806 TEST(HugeConsStringOutOfMemory) {
1795 // It's not possible to read a snapshot into a heap with different dimensions. 1807 // It's not possible to read a snapshot into a heap with different dimensions.
1796 if (v8::internal::Snapshot::IsEnabled()) return; 1808 if (v8::internal::Snapshot::IsEnabled()) return;
1797 v8::HandleScope scope; 1809 v8::HandleScope scope;
1798 LocalContext context; 1810 LocalContext context;
1799 // Set heap limits. 1811 // Set heap limits.
1800 static const int K = 1024; 1812 static const int K = 1024;
1801 v8::ResourceConstraints constraints; 1813 v8::HeapResourceConstraints constraints;
1802 constraints.set_max_young_space_size(256 * K); 1814 constraints.set_max_young_space_size(256 * K);
1803 constraints.set_max_old_space_size(2 * K * K); 1815 constraints.set_max_old_space_size(2 * K * K);
1804 v8::SetResourceConstraints(&constraints); 1816 v8::SetHeapResourceConstraints(&constraints);
1805 1817
1806 // Execute a script that causes out of memory. 1818 // Execute a script that causes out of memory.
1807 v8::V8::IgnoreOutOfMemoryException(); 1819 v8::V8::IgnoreOutOfMemoryException();
1808 1820
1809 // Build huge string. This should fail with out of memory exception. 1821 // Build huge string. This should fail with out of memory exception.
1810 Local<Value> result = CompileRun( 1822 Local<Value> result = CompileRun(
1811 "var str = Array.prototype.join.call({length: 513}, \"A\").toUpperCase();" 1823 "var str = Array.prototype.join.call({length: 513}, \"A\").toUpperCase();"
1812 "for (var i = 0; i < 21; i++) { str = str + str; }"); 1824 "for (var i = 0; i < 21; i++) { str = str + str; }");
1813 1825
1814 // Check for out of memory state. 1826 // Check for out of memory state.
(...skipping 4557 matching lines...) Expand 10 before | Expand all | Expand 10 after
6372 v8::HandleScope inner; 6384 v8::HandleScope inner;
6373 v8::Handle<v8::ObjectTemplate> local = v8::ObjectTemplate::New(); 6385 v8::Handle<v8::ObjectTemplate> local = v8::ObjectTemplate::New();
6374 local->SetInternalFieldCount(1); 6386 local->SetInternalFieldCount(1);
6375 templ = v8::Persistent<v8::ObjectTemplate>::New(inner.Close(local)); 6387 templ = v8::Persistent<v8::ObjectTemplate>::New(inner.Close(local));
6376 } 6388 }
6377 v8::Handle<v8::Object> result = templ->NewInstance(); 6389 v8::Handle<v8::Object> result = templ->NewInstance();
6378 CHECK_EQ(1, result->InternalFieldCount()); 6390 CHECK_EQ(1, result->InternalFieldCount());
6379 } 6391 }
6380 6392
6381 6393
6382 // If part of the threaded tests, this test makes ThreadingTest fail 6394 THREADED_TEST(CatchStackOverflow) {
6383 // on mac.
6384 TEST(CatchStackOverflow) {
6385 v8::HandleScope scope; 6395 v8::HandleScope scope;
6386 LocalContext context; 6396 LocalContext context;
6387 v8::TryCatch try_catch; 6397 v8::TryCatch try_catch;
6388 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New( 6398 v8::Handle<v8::Script> script = v8::Script::Compile(v8::String::New(
6389 "function f() {" 6399 "function f() {"
6390 " return f();" 6400 " return f();"
6391 "}" 6401 "}"
6392 "" 6402 ""
6393 "f();")); 6403 "f();"));
6404
6405 // the default thread stack size on OS X ia32/x64 is 512K/1M, which
6406 // is too small for the 512K default V8 stack limit
6407 static const int K = 1024;
6408 uint32_t here;
6409 v8::SetStackLimit(&here - 256 * K / sizeof(uint32_t*));
6410
6394 v8::Handle<v8::Value> result = script->Run(); 6411 v8::Handle<v8::Value> result = script->Run();
6395 CHECK(result.IsEmpty()); 6412 CHECK(result.IsEmpty());
6396 } 6413 }
6397 6414
6398 6415
6399 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script, 6416 static void CheckTryCatchSourceInfo(v8::Handle<v8::Script> script,
6400 const char* resource_name, 6417 const char* resource_name,
6401 int line_offset) { 6418 int line_offset) {
6402 v8::HandleScope scope; 6419 v8::HandleScope scope;
6403 v8::TryCatch try_catch; 6420 v8::TryCatch try_catch;
(...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after
7872 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL); 7889 CHECK(strstr(*stack, "at foo (stack-trace-test") != NULL);
7873 } 7890 }
7874 7891
7875 7892
7876 // Test that idle notification can be handled when V8 has not yet been 7893 // Test that idle notification can be handled when V8 has not yet been
7877 // set up. 7894 // set up.
7878 THREADED_TEST(IdleNotification) { 7895 THREADED_TEST(IdleNotification) {
7879 for (int i = 0; i < 100; i++) v8::V8::IdleNotification(true); 7896 for (int i = 0; i < 100; i++) v8::V8::IdleNotification(true);
7880 for (int i = 0; i < 100; i++) v8::V8::IdleNotification(false); 7897 for (int i = 0; i < 100; i++) v8::V8::IdleNotification(false);
7881 } 7898 }
7899
7900
7901 static uintptr_t js_limit;
7902
7903
7904 static v8::Handle<Value> GetStackLimitCallback(const v8::Arguments& args) {
7905 js_limit = i::StackGuard::jslimit();
7906 return v8::Undefined();
7907 }
7908
7909
7910 THREADED_TEST(SetStackLimit) {
7911 v8::HandleScope scope;
7912 LocalContext env;
7913 Local<v8::FunctionTemplate> fun_templ =
7914 v8::FunctionTemplate::New(GetStackLimitCallback);
7915 Local<Function> fun = fun_templ->GetFunction();
7916 env->Global()->Set(v8_str("get_stack_limit"), fun);
7917
7918 // Set the stack limit.
7919 static const int K = 1024;
7920 uint32_t here;
7921 uint32_t* limit = &here - 128 * K / sizeof(uint32_t*);
7922 v8::SetStackLimit(limit);
7923 CompileRun("get_stack_limit();");
7924
7925 // Must use GENERATED_CODE_STACK_LIMIT to run on the ARM simulator.
7926 uintptr_t expected_limit =
7927 GENERATED_CODE_STACK_LIMIT(reinterpret_cast<uintptr_t>(limit));
7928 CHECK(expected_limit == js_limit);
7929 }
OLDNEW
« no previous file with comments | « src/x64/simulator-x64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698