Index: test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc |
diff --git a/test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc b/test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc |
index 922ed2f44ea1ee5fdda5beb02eb4aa4ee3e7ad42..d90c5bda1c623bf6e0547cbf3ad8c8421713f3df 100644 |
--- a/test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc |
+++ b/test/unittests/compiler-dispatcher/compiler-dispatcher-job-unittest.cc |
@@ -52,8 +52,8 @@ Handle<JSFunction> CreateFunction( |
} |
Handle<Script> script = isolate->factory()->NewScript(source); |
Handle<SharedFunctionInfo> shared = isolate->factory()->NewSharedFunctionInfo( |
- isolate->factory()->NewStringFromAsciiChecked("f"), MaybeHandle<Code>(), |
- false); |
+ isolate->factory()->NewStringFromAsciiChecked("f"), |
+ isolate->builtins()->CompileLazy(), false); |
SharedFunctionInfo::SetScript(shared, script); |
shared->set_end_position(source->length()); |
Handle<JSFunction> function = |
@@ -62,6 +62,17 @@ Handle<JSFunction> CreateFunction( |
return scope.CloseAndEscape(function); |
} |
+Handle<Object> RunJS(v8::Isolate* isolate, const char* script) { |
+ return Utils::OpenHandle( |
+ *v8::Script::Compile( |
+ isolate->GetCurrentContext(), |
+ v8::String::NewFromUtf8(isolate, script, v8::NewStringType::kNormal) |
+ .ToLocalChecked()) |
+ .ToLocalChecked() |
+ ->Run(isolate->GetCurrentContext()) |
+ .ToLocalChecked()); |
+} |
+ |
} // namespace |
TEST_F(CompilerDispatcherJobTest, Construct) { |
@@ -93,7 +104,13 @@ TEST_F(CompilerDispatcherJobTest, StateTransitions) { |
job->Parse(); |
ASSERT_TRUE(job->status() == CompileJobStatus::kParsed); |
ASSERT_TRUE(job->FinalizeParsingOnMainThread()); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyse); |
+ ASSERT_TRUE(job->PrepareToCompileOnMainThread()); |
ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); |
+ job->Compile(); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kCompiled); |
+ ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
job->ResetOnMainThread(); |
ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
} |
@@ -119,14 +136,7 @@ TEST_F(CompilerDispatcherJobTest, ScopeChain) { |
const char script[] = |
"function g() { var g = 1; function f(x) { return x * g }; return f; } " |
"g();"; |
- Handle<JSFunction> f = Handle<JSFunction>::cast(Utils::OpenHandle( |
- *v8::Script::Compile(isolate()->GetCurrentContext(), |
- v8::String::NewFromUtf8(isolate(), script, |
- v8::NewStringType::kNormal) |
- .ToLocalChecked()) |
- .ToLocalChecked() |
- ->Run(isolate()->GetCurrentContext()) |
- .ToLocalChecked())); |
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
std::unique_ptr<CompilerDispatcherJob> job( |
new CompilerDispatcherJob(i_isolate(), f, FLAG_stack_size)); |
@@ -134,7 +144,7 @@ TEST_F(CompilerDispatcherJobTest, ScopeChain) { |
job->PrepareToParseOnMainThread(); |
job->Parse(); |
ASSERT_TRUE(job->FinalizeParsingOnMainThread()); |
- ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToCompile); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kReadyToAnalyse); |
const AstRawString* var_x = |
job->parse_info_->ast_value_factory()->GetOneByteString("x"); |
@@ -152,5 +162,80 @@ TEST_F(CompilerDispatcherJobTest, ScopeChain) { |
ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
} |
+TEST_F(CompilerDispatcherJobTest, CompileAndRun) { |
+ const char script[] = |
+ "function g() {\n" |
+ " f = function(a) {\n" |
+ " for (var i = 0; i < 3; i++) { a += 20; }\n" |
+ " return a;\n" |
+ " }\n" |
+ " return f;\n" |
+ "}\n" |
+ "g();"; |
+ Handle<JSFunction> f = Handle<JSFunction>::cast(RunJS(isolate(), script)); |
+ std::unique_ptr<CompilerDispatcherJob> job( |
+ new CompilerDispatcherJob(i_isolate(), f, FLAG_stack_size)); |
+ |
+ job->PrepareToParseOnMainThread(); |
+ job->Parse(); |
+ job->FinalizeParsingOnMainThread(); |
+ job->PrepareToCompileOnMainThread(); |
+ job->Compile(); |
+ ASSERT_TRUE(job->FinalizeCompilingOnMainThread()); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kDone); |
+ |
+ Smi* value = Smi::cast(*RunJS(isolate(), "f(100);")); |
+ ASSERT_TRUE(value == Smi::FromInt(160)); |
+ |
+ job->ResetOnMainThread(); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
+} |
+ |
+TEST_F(CompilerDispatcherJobTest, CompileFailureToPrepare) { |
+ std::string raw_script("() { var a = "); |
+ for (int i = 0; i < 100000; i++) { |
+ raw_script += "'x' + "; |
+ } |
+ raw_script += " 'x'; }"; |
+ ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); |
+ std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
+ i_isolate(), CreateFunction(i_isolate(), &script), 100)); |
+ |
+ job->PrepareToParseOnMainThread(); |
+ job->Parse(); |
+ job->FinalizeParsingOnMainThread(); |
+ ASSERT_FALSE(job->PrepareToCompileOnMainThread()); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); |
+ ASSERT_TRUE(i_isolate()->has_pending_exception()); |
+ |
+ i_isolate()->clear_pending_exception(); |
+ job->ResetOnMainThread(); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
+} |
+ |
+TEST_F(CompilerDispatcherJobTest, CompileFailureToFinalize) { |
+ std::string raw_script("() { var a = "); |
+ for (int i = 0; i < 1000; i++) { |
+ raw_script += "'x' + "; |
+ } |
+ raw_script += " 'x'; }"; |
+ ScriptResource script(raw_script.c_str(), strlen(raw_script.c_str())); |
+ std::unique_ptr<CompilerDispatcherJob> job(new CompilerDispatcherJob( |
+ i_isolate(), CreateFunction(i_isolate(), &script), 100)); |
+ |
+ job->PrepareToParseOnMainThread(); |
+ job->Parse(); |
+ job->FinalizeParsingOnMainThread(); |
+ job->PrepareToCompileOnMainThread(); |
+ job->Compile(); |
+ ASSERT_FALSE(job->FinalizeCompilingOnMainThread()); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kFailed); |
+ ASSERT_TRUE(i_isolate()->has_pending_exception()); |
+ |
+ i_isolate()->clear_pending_exception(); |
+ job->ResetOnMainThread(); |
+ ASSERT_TRUE(job->status() == CompileJobStatus::kInitial); |
+} |
+ |
} // namespace internal |
} // namespace v8 |