Index: test/cctest/compiler/function-tester.h |
diff --git a/test/cctest/compiler/function-tester.h b/test/cctest/compiler/function-tester.h |
index c869f00d1931af18a4f07eaff12e38e0d579f835..d93805f9991de9e4c4cf2dce47ae933610afef9e 100644 |
--- a/test/cctest/compiler/function-tester.h |
+++ b/test/cctest/compiler/function-tester.h |
@@ -9,6 +9,7 @@ |
#include "test/cctest/cctest.h" |
#include "src/compiler.h" |
+#include "src/compiler/linkage.h" |
#include "src/compiler/pipeline.h" |
#include "src/execution.h" |
#include "src/full-codegen.h" |
@@ -37,52 +38,16 @@ class FunctionTester : public InitializedHandleScope { |
CHECK_EQ(0, flags_ & ~supported_flags); |
} |
+ explicit FunctionTester(Graph* graph) |
+ : isolate(main_isolate()), |
+ function(NewFunction("(function(a,b){'use strict'; return 0;})")), |
Michael Starzinger
2014/10/08 09:08:10
nit: Just use the empty function ... it looks conf
titzer
2014/10/08 09:22:54
Done.
|
+ flags_(0) { |
+ CompileGraph(graph); |
+ } |
+ |
Isolate* isolate; |
Handle<JSFunction> function; |
- Handle<JSFunction> Compile(Handle<JSFunction> function) { |
-#if V8_TURBOFAN_TARGET |
- CompilationInfoWithZone info(function); |
- |
- CHECK(Parser::Parse(&info)); |
- info.SetOptimizing(BailoutId::None(), Handle<Code>(function->code())); |
- if (flags_ & CompilationInfo::kContextSpecializing) { |
- info.MarkAsContextSpecializing(); |
- } |
- if (flags_ & CompilationInfo::kInliningEnabled) { |
- info.MarkAsInliningEnabled(); |
- } |
- if (flags_ & CompilationInfo::kTypingEnabled) { |
- info.MarkAsTypingEnabled(); |
- } |
- CHECK(Rewriter::Rewrite(&info)); |
- CHECK(Scope::Analyze(&info)); |
- CHECK(Compiler::EnsureDeoptimizationSupport(&info)); |
- |
- Pipeline pipeline(&info); |
- Handle<Code> code = pipeline.GenerateCode(); |
- if (FLAG_turbo_deoptimization) { |
- info.context()->native_context()->AddOptimizedCode(*code); |
- } |
- |
- CHECK(!code.is_null()); |
- function->ReplaceCode(*code); |
-#elif USE_CRANKSHAFT |
- Handle<Code> unoptimized = Handle<Code>(function->code()); |
- Handle<Code> code = Compiler::GetOptimizedCode(function, unoptimized, |
- Compiler::NOT_CONCURRENT); |
- CHECK(!code.is_null()); |
-#if ENABLE_DISASSEMBLER |
- if (FLAG_print_opt_code) { |
- CodeTracer::Scope tracing_scope(isolate->GetCodeTracer()); |
- code->Disassemble("test code", tracing_scope.file()); |
- } |
-#endif |
- function->ReplaceCode(*code); |
-#endif |
- return function; |
- } |
- |
MaybeHandle<Object> Call(Handle<Object> a, Handle<Object> b) { |
Handle<Object> args[] = {a, b}; |
return Execution::Call(isolate, function, undefined(), 2, args, false); |
@@ -183,8 +148,82 @@ class FunctionTester : public InitializedHandleScope { |
Handle<Object> false_value() { return isolate->factory()->false_value(); } |
+ Handle<JSFunction> Compile(Handle<JSFunction> function) { |
+// foo me |
Michael Starzinger
2014/10/08 09:08:10
nit: Hmm, it looks foo'ed already. :)
titzer
2014/10/08 09:22:55
Done.
|
+#if V8_TURBOFAN_TARGET |
+ CompilationInfoWithZone info(function); |
+ |
+ CHECK(Parser::Parse(&info)); |
+ info.SetOptimizing(BailoutId::None(), Handle<Code>(function->code())); |
+ if (flags_ & CompilationInfo::kContextSpecializing) { |
+ info.MarkAsContextSpecializing(); |
+ } |
+ if (flags_ & CompilationInfo::kInliningEnabled) { |
+ info.MarkAsInliningEnabled(); |
+ } |
+ if (flags_ & CompilationInfo::kTypingEnabled) { |
+ info.MarkAsTypingEnabled(); |
+ } |
+ CHECK(Rewriter::Rewrite(&info)); |
+ CHECK(Scope::Analyze(&info)); |
+ CHECK(Compiler::EnsureDeoptimizationSupport(&info)); |
+ |
+ Pipeline pipeline(&info); |
+ Handle<Code> code = pipeline.GenerateCode(); |
+ if (FLAG_turbo_deoptimization) { |
+ info.context()->native_context()->AddOptimizedCode(*code); |
+ } |
+ |
+ CHECK(!code.is_null()); |
+ function->ReplaceCode(*code); |
+#elif USE_CRANKSHAFT |
+ Handle<Code> unoptimized = Handle<Code>(function->code()); |
+ Handle<Code> code = Compiler::GetOptimizedCode(function, unoptimized, |
+ Compiler::NOT_CONCURRENT); |
+ CHECK(!code.is_null()); |
+#if ENABLE_DISASSEMBLER |
+ if (FLAG_print_opt_code) { |
+ CodeTracer::Scope tracing_scope(isolate->GetCodeTracer()); |
+ code->Disassemble("test code", tracing_scope.file()); |
+ } |
+#endif |
+ function->ReplaceCode(*code); |
+#endif |
+ return function; |
+ } |
+ |
+ static Handle<JSFunction> ForMachineGraph(Graph* graph) { |
+ JSFunction* p = NULL; |
+ { // because of the implicit handle scope of FunctionTester. |
+ FunctionTester f(graph); |
+ p = *f.function; |
+ } |
+ return Handle<JSFunction>(p); // allocated in outer handle scope. |
+ } |
+ |
private: |
uint32_t flags_; |
+ |
+ // Compile the given machine graph instead of the source of the function |
+ // and replace the JSFunction's code with the result. |
+ Handle<JSFunction> CompileGraph(Graph* graph) { |
+ CHECK(Pipeline::SupportedTarget()); |
+ CompilationInfoWithZone info(function); |
+ |
+ CHECK(Parser::Parse(&info)); |
+ info.SetOptimizing(BailoutId::None(), |
+ Handle<Code>(function->shared()->code())); |
+ CHECK(Rewriter::Rewrite(&info)); |
+ CHECK(Scope::Analyze(&info)); |
+ CHECK(Compiler::EnsureDeoptimizationSupport(&info)); |
+ |
+ Pipeline pipeline(&info); |
+ Linkage linkage(&info); |
+ Handle<Code> code = pipeline.GenerateCodeForMachineGraph(&linkage, graph); |
+ CHECK(!code.is_null()); |
+ function->ReplaceCode(*code); |
+ return function; |
+ } |
}; |
} |
} |