OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "vm/class_finalizer.h" | 6 #include "vm/class_finalizer.h" |
7 #include "vm/code_patcher.h" | 7 #include "vm/code_patcher.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
11 #include "vm/symbols.h" | 11 #include "vm/symbols.h" |
12 #include "vm/thread_pool.h" | |
12 #include "vm/unit_test.h" | 13 #include "vm/unit_test.h" |
13 | 14 |
14 namespace dart { | 15 namespace dart { |
15 | 16 |
16 TEST_CASE(CompileScript) { | 17 TEST_CASE(CompileScript) { |
17 const char* kScriptChars = | 18 const char* kScriptChars = |
18 "class A {\n" | 19 "class A {\n" |
19 " static foo() { return 42; }\n" | 20 " static foo() { return 42; }\n" |
20 "}\n"; | 21 "}\n"; |
21 String& url = String::Handle(String::New("dart-test:CompileScript")); | 22 String& url = String::Handle(String::New("dart-test:CompileScript")); |
22 String& source = String::Handle(String::New(kScriptChars)); | 23 String& source = String::Handle(String::New(kScriptChars)); |
23 Script& script = Script::Handle(Script::New(url, | 24 Script& script = Script::Handle(Script::New(url, |
24 source, | 25 source, |
25 RawScript::kScriptTag)); | 26 RawScript::kScriptTag)); |
26 Library& lib = Library::Handle(Library::CoreLibrary()); | 27 Library& lib = Library::Handle(Library::CoreLibrary()); |
27 EXPECT(CompilerTest::TestCompileScript(lib, script)); | 28 EXPECT(CompilerTest::TestCompileScript(lib, script)); |
28 } | 29 } |
29 | 30 |
30 | 31 |
31 TEST_CASE(CompileFunction) { | 32 static void CompileFunctionImpl() { |
32 const char* kScriptChars = | 33 const char* kScriptChars = |
33 "class A {\n" | 34 "class A {\n" |
34 " static foo() { return 42; }\n" | 35 " static foo() { return 42; }\n" |
35 " static moo() {\n" | 36 " static moo() {\n" |
36 " // A.foo();\n" | 37 " // A.foo();\n" |
37 " }\n" | 38 " }\n" |
38 "}\n"; | 39 "}\n"; |
39 String& url = String::Handle(String::New("dart-test:CompileFunction")); | 40 String& url = String::Handle(String::New("dart-test:CompileFunction")); |
40 String& source = String::Handle(String::New(kScriptChars)); | 41 String& source = String::Handle(String::New(kScriptChars)); |
41 Script& script = Script::Handle(Script::New(url, | 42 Script& script = Script::Handle(Script::New(url, |
(...skipping 20 matching lines...) Expand all Loading... | |
62 EXPECT(!function_moo.IsNull()); | 63 EXPECT(!function_moo.IsNull()); |
63 | 64 |
64 EXPECT(CompilerTest::TestCompileFunction(function_moo)); | 65 EXPECT(CompilerTest::TestCompileFunction(function_moo)); |
65 EXPECT(function_moo.HasCode()); | 66 EXPECT(function_moo.HasCode()); |
66 function_source = function_moo.GetSource(); | 67 function_source = function_moo.GetSource(); |
67 EXPECT_STREQ("static moo() {\n // A.foo();\n }", | 68 EXPECT_STREQ("static moo() {\n // A.foo();\n }", |
68 function_source.ToCString()); | 69 function_source.ToCString()); |
69 } | 70 } |
70 | 71 |
71 | 72 |
73 TEST_CASE(CompileFunction) { | |
74 CompileFunctionImpl(); | |
75 } | |
76 | |
77 | |
78 // Runs 'CompileFunctionImpl' on a helper thread. | |
79 class CompileFunctionTask : public ThreadPool::Task { | |
80 public: | |
81 CompileFunctionTask(Isolate* isolate, | |
82 Monitor* done_monitor, | |
83 bool* done) | |
srdjan
2015/08/17 20:13:48
Better indentation
koda
2015/08/17 20:27:33
Done.
| |
84 : isolate_(isolate), | |
85 done_monitor_(done_monitor), | |
86 done_(done) { | |
87 } | |
88 | |
89 virtual void Run() { | |
90 Thread::EnterIsolateAsHelper(isolate_); | |
91 { | |
92 Thread* thread = Thread::Current(); | |
93 StackZone stack_zone(thread); | |
94 HANDLESCOPE(thread); | |
95 CompileFunctionImpl(); | |
96 } | |
97 Thread::ExitIsolateAsHelper(); | |
98 // Tell main thread that we are done. | |
99 { | |
100 MonitorLocker ml(done_monitor_); | |
101 ASSERT(!*done_); | |
102 *done_ = true; | |
103 ml.Notify(); | |
104 } | |
105 } | |
106 | |
107 private: | |
108 Isolate* isolate_; | |
109 Monitor* done_monitor_; | |
110 bool* done_; | |
111 }; | |
112 | |
113 | |
114 TEST_CASE(CompileFunctionOnHelperThread) { | |
115 Monitor done_monitor; | |
116 bool done = false; | |
117 Isolate* isolate = Thread::Current()->isolate(); | |
118 // Flush store buffers, etc. | |
119 // TODO(koda): Currently, the GC only does this for the current thread, (i.e, | |
120 // the helper, in this test), but it should be done for all *threads* | |
121 // after/at safepointing. | |
122 Thread::PrepareForGC(); | |
123 Dart::thread_pool()->Run( | |
124 new CompileFunctionTask(isolate, &done_monitor, &done)); | |
125 { | |
126 // Manually wait. | |
127 // TODO(koda): Replace with execution of Dart and/or VM code when GC | |
128 // actually safepoints everything. | |
129 MonitorLocker ml(&done_monitor); | |
130 while (!done) { | |
131 ml.Wait(); | |
132 } | |
133 } | |
134 } | |
135 | |
136 | |
72 TEST_CASE(RegenerateAllocStubs) { | 137 TEST_CASE(RegenerateAllocStubs) { |
73 const char* kScriptChars = | 138 const char* kScriptChars = |
74 "class A {\n" | 139 "class A {\n" |
75 "}\n" | 140 "}\n" |
76 "unOpt() => new A(); \n" | 141 "unOpt() => new A(); \n" |
77 "optIt() => new A(); \n" | 142 "optIt() => new A(); \n" |
78 "A main() {\n" | 143 "A main() {\n" |
79 " return unOpt();\n" | 144 " return unOpt();\n" |
80 "}\n"; | 145 "}\n"; |
81 | 146 |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 EXPECT(val.IsInteger()); | 242 EXPECT(val.IsInteger()); |
178 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value()); | 243 EXPECT_EQ(7, Integer::Cast(val).AsInt64Value()); |
179 | 244 |
180 intptr_t final_class_table_size = | 245 intptr_t final_class_table_size = |
181 Isolate::Current()->class_table()->NumCids(); | 246 Isolate::Current()->class_table()->NumCids(); |
182 // Eval should not eat into this non-renewable resource. | 247 // Eval should not eat into this non-renewable resource. |
183 EXPECT_EQ(initial_class_table_size, final_class_table_size); | 248 EXPECT_EQ(initial_class_table_size, final_class_table_size); |
184 } | 249 } |
185 | 250 |
186 } // namespace dart | 251 } // namespace dart |
OLD | NEW |