From 42365d429ce2e27ccc791aef3e39cca45e0da9bb Mon Sep 17 00:00:00 2001 From: "titzer@chromium.org" Date: Wed, 8 Oct 2014 09:23:33 +0000 Subject: [PATCH] The empty husk of a JSFunction is useful to us. We hollow out the rotting core and with evil intent repurpose its dry carcass to empower ourselves; with such a shell we can test. R=mstarzinger@chromium.org BUG= Review URL: https://codereview.chromium.org/637873002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24459 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- test/cctest/compiler/function-tester.h | 125 +++++++++++++++++--------- test/cctest/compiler/test-changes-lowering.cc | 26 +----- 2 files changed, 86 insertions(+), 65 deletions(-) diff --git a/test/cctest/compiler/function-tester.h b/test/cctest/compiler/function-tester.h index c869f00..a5a71a7 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){})")), + flags_(0) { + CompileGraph(graph); + } + Isolate* isolate; Handle function; - Handle Compile(Handle function) { -#if V8_TURBOFAN_TARGET - CompilationInfoWithZone info(function); - - CHECK(Parser::Parse(&info)); - info.SetOptimizing(BailoutId::None(), Handle(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 = pipeline.GenerateCode(); - if (FLAG_turbo_deoptimization) { - info.context()->native_context()->AddOptimizedCode(*code); - } - - CHECK(!code.is_null()); - function->ReplaceCode(*code); -#elif USE_CRANKSHAFT - Handle unoptimized = Handle(function->code()); - Handle 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 Call(Handle a, Handle b) { Handle args[] = {a, b}; return Execution::Call(isolate, function, undefined(), 2, args, false); @@ -183,8 +148,82 @@ class FunctionTester : public InitializedHandleScope { Handle false_value() { return isolate->factory()->false_value(); } + Handle Compile(Handle function) { +// TODO(titzer): make this method private. +#if V8_TURBOFAN_TARGET + CompilationInfoWithZone info(function); + + CHECK(Parser::Parse(&info)); + info.SetOptimizing(BailoutId::None(), Handle(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 = pipeline.GenerateCode(); + if (FLAG_turbo_deoptimization) { + info.context()->native_context()->AddOptimizedCode(*code); + } + + CHECK(!code.is_null()); + function->ReplaceCode(*code); +#elif USE_CRANKSHAFT + Handle unoptimized = Handle(function->code()); + Handle 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 ForMachineGraph(Graph* graph) { + JSFunction* p = NULL; + { // because of the implicit handle scope of FunctionTester. + FunctionTester f(graph); + p = *f.function; + } + return Handle(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 CompileGraph(Graph* graph) { + CHECK(Pipeline::SupportedTarget()); + CompilationInfoWithZone info(function); + + CHECK(Parser::Parse(&info)); + info.SetOptimizing(BailoutId::None(), + Handle(function->shared()->code())); + CHECK(Rewriter::Rewrite(&info)); + CHECK(Scope::Analyze(&info)); + CHECK(Compiler::EnsureDeoptimizationSupport(&info)); + + Pipeline pipeline(&info); + Linkage linkage(&info); + Handle code = pipeline.GenerateCodeForMachineGraph(&linkage, graph); + CHECK(!code.is_null()); + function->ReplaceCode(*code); + return function; + } }; } } diff --git a/test/cctest/compiler/test-changes-lowering.cc b/test/cctest/compiler/test-changes-lowering.cc index 3d06b90..5f8193f 100644 --- a/test/cctest/compiler/test-changes-lowering.cc +++ b/test/cctest/compiler/test-changes-lowering.cc @@ -19,6 +19,7 @@ #include "src/scopes.h" #include "test/cctest/cctest.h" #include "test/cctest/compiler/codegen-tester.h" +#include "test/cctest/compiler/function-tester.h" #include "test/cctest/compiler/graph-builder-tester.h" #include "test/cctest/compiler/value-helper.h" @@ -45,29 +46,10 @@ class ChangesLoweringTester : public GraphBuilderTester { template T* CallWithPotentialGC() { - // TODO(titzer): we need to wrap the code in a JSFunction and call it via - // Execution::Call() so that the GC knows about the frame, can walk it, - // relocate the code object if necessary, etc. - // This is pretty ugly and at the least should be moved up to helpers. + // TODO(titzer): we wrap the code in a JSFunction here to reuse the + // JSEntryStub; that could be done with a special prologue or other stub. if (function.is_null()) { - function = - v8::Utils::OpenHandle(*v8::Handle::Cast(CompileRun( - "(function() { 'use strict'; return 2.7123; })"))); - CompilationInfoWithZone info(function); - CHECK(Parser::Parse(&info)); - info.SetOptimizing(BailoutId::None(), Handle(function->code())); - CHECK(Rewriter::Rewrite(&info)); - CHECK(Scope::Analyze(&info)); - CHECK_NE(NULL, info.scope()); - Handle scope_info = - ScopeInfo::Create(info.scope(), info.zone()); - info.shared_info()->set_scope_info(*scope_info); - Pipeline pipeline(&info); - Linkage linkage(&info); - Handle code = - pipeline.GenerateCodeForMachineGraph(&linkage, this->graph()); - CHECK(!code.is_null()); - function->ReplaceCode(*code); + function = FunctionTester::ForMachineGraph(this->graph()); } Handle* args = NULL; MaybeHandle result = -- 2.7.4