| Index: src/compiler/wasm-compiler.cc | 
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc | 
| index 85b3d09d7d275d04f10c921eccbadb1543f0135b..92f389261bdd822118fd1df271a2932dd1011ab7 100644 | 
| --- a/src/compiler/wasm-compiler.cc | 
| +++ b/src/compiler/wasm-compiler.cc | 
| @@ -4053,14 +4053,10 @@ SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( | 
| MachineOperatorBuilder* machine = jsgraph_->machine(); | 
| SourcePositionTable* source_position_table = | 
| new (jsgraph_->zone()) SourcePositionTable(graph); | 
| -  WasmGraphBuilder builder(&module_env_->module_env, jsgraph_->zone(), jsgraph_, | 
| -                           function_->sig, source_position_table); | 
| -  const byte* module_start = module_env_->wire_bytes.start(); | 
| -  wasm::FunctionBody body = {function_->sig, module_start, | 
| -                             module_start + function_->code_start_offset, | 
| -                             module_start + function_->code_end_offset}; | 
| +  WasmGraphBuilder builder(module_env_, jsgraph_->zone(), jsgraph_, | 
| +                           func_body_.sig, source_position_table); | 
| graph_construction_result_ = | 
| -      wasm::BuildTFGraph(isolate_->allocator(), &builder, body); | 
| +      wasm::BuildTFGraph(isolate_->allocator(), &builder, func_body_); | 
|  | 
| if (graph_construction_result_.failed()) { | 
| if (FLAG_trace_wasm_compiler) { | 
| @@ -4071,65 +4067,64 @@ SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( | 
| } | 
|  | 
| if (machine->Is32()) { | 
| -    Int64Lowering(graph, machine, common, jsgraph_->zone(), function_->sig) | 
| +    Int64Lowering(graph, machine, common, jsgraph_->zone(), func_body_.sig) | 
| .LowerGraph(); | 
| } | 
|  | 
| if (builder.has_simd() && !CpuFeatures::SupportsSimd128()) { | 
| -    SimdScalarLowering(jsgraph_, function_->sig).LowerGraph(); | 
| +    SimdScalarLowering(jsgraph_, func_body_.sig).LowerGraph(); | 
| } | 
|  | 
| -  int index = static_cast<int>(function_->func_index); | 
| - | 
| -  if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { | 
| -    OFStream os(stdout); | 
| -    PrintRawWasmCode(isolate_->allocator(), body, | 
| -                     module_env_->module_env.module); | 
| -  } | 
| -  if (index >= FLAG_trace_wasm_text_start && index < FLAG_trace_wasm_text_end) { | 
| -    OFStream os(stdout); | 
| -    PrintWasmText(module_env_->module_env.module, module_env_->wire_bytes, | 
| -                  function_->func_index, os, nullptr); | 
| +  if (func_index_ >= FLAG_trace_wasm_ast_start && | 
| +      func_index_ < FLAG_trace_wasm_ast_end) { | 
| +    PrintRawWasmCode(isolate_->allocator(), func_body_, module_env_->module); | 
| } | 
| +  // TODO(clemens): Remove the trace_wasm_text_start flag. | 
| +  // if (func_index_ >= FLAG_trace_wasm_text_start && func_index_ < | 
| +  // FLAG_trace_wasm_text_end) { | 
| +  //  OFStream os(stdout); | 
| +  //  PrintWasmText(module_env_.module, module_env_->wire_bytes, | 
| +  //                function_->func_index, os, nullptr); | 
| +  //} | 
| if (FLAG_trace_wasm_decode_time) { | 
| *decode_ms = decode_timer.Elapsed().InMillisecondsF(); | 
| } | 
| return source_position_table; | 
| } | 
|  | 
| -char* WasmCompilationUnit::GetTaggedFunctionName( | 
| -    const wasm::WasmFunction* function) { | 
| -  snprintf(function_name_, sizeof(function_name_), "wasm#%d", | 
| -           function->func_index); | 
| -  return function_name_; | 
| -} | 
| - | 
| -WasmCompilationUnit::WasmCompilationUnit(wasm::ErrorThrower* thrower, | 
| -                                         Isolate* isolate, | 
| +WasmCompilationUnit::WasmCompilationUnit(Isolate* isolate, | 
| wasm::ModuleBytesEnv* module_env, | 
| -                                         const wasm::WasmFunction* function, | 
| -                                         uint32_t index) | 
| -    : thrower_(thrower), | 
| -      isolate_(isolate), | 
| +                                         const wasm::WasmFunction* function) | 
| +    : WasmCompilationUnit( | 
| +          isolate, &module_env->module_env, | 
| +          wasm::FunctionBody{ | 
| +              function->sig, module_env->wire_bytes.start(), | 
| +              module_env->wire_bytes.start() + function->code_start_offset, | 
| +              module_env->wire_bytes.start() + function->code_end_offset}, | 
| +          module_env->wire_bytes.GetNameOrNull(function), | 
| +          function->func_index) {} | 
| + | 
| +WasmCompilationUnit::WasmCompilationUnit(Isolate* isolate, | 
| +                                         wasm::ModuleEnv* module_env, | 
| +                                         wasm::FunctionBody body, | 
| +                                         wasm::WasmName name, int index) | 
| +    : isolate_(isolate), | 
| module_env_(module_env), | 
| -      function_(&module_env->module_env.module->functions[index]), | 
| +      func_body_(body), | 
| +      func_name_(name), | 
| graph_zone_(new Zone(isolate->allocator(), ZONE_NAME)), | 
| jsgraph_(new (graph_zone()) JSGraph( | 
| isolate, new (graph_zone()) Graph(graph_zone()), | 
| new (graph_zone()) CommonOperatorBuilder(graph_zone()), nullptr, | 
| -          nullptr, new (graph_zone()) MachineOperatorBuilder( | 
| -                       graph_zone(), MachineType::PointerRepresentation(), | 
| -                       InstructionSelector::SupportedMachineOperatorFlags(), | 
| -                       InstructionSelector::AlignmentRequirements()))), | 
| +          nullptr, | 
| +          new (graph_zone()) MachineOperatorBuilder( | 
| +              graph_zone(), MachineType::PointerRepresentation(), | 
| +              InstructionSelector::SupportedMachineOperatorFlags(), | 
| +              InstructionSelector::AlignmentRequirements()))), | 
| compilation_zone_(isolate->allocator(), ZONE_NAME), | 
| -      info_(function->name_length != 0 | 
| -                ? module_env->wire_bytes.GetNameOrNull(function) | 
| -                : CStrVector(GetTaggedFunctionName(function)), | 
| -            isolate, &compilation_zone_, | 
| +      info_(name, isolate, &compilation_zone_, | 
| Code::ComputeFlags(Code::WASM_FUNCTION)), | 
| -      job_(), | 
| -      index_(index), | 
| -      ok_(true), | 
| +      func_index_(index), | 
| protected_instructions_(&compilation_zone_) { | 
| // Create and cache this node in the main thread. | 
| jsgraph_->CEntryStubConstant(1); | 
| @@ -4140,12 +4135,12 @@ void WasmCompilationUnit::ExecuteCompilation() { | 
| //    HistogramTimerScope wasm_compile_function_time_scope( | 
| //        isolate_->counters()->wasm_compile_function_time()); | 
| if (FLAG_trace_wasm_compiler) { | 
| -    OFStream os(stdout); | 
| -    os << "Compiling WASM function " | 
| -       << wasm::WasmFunctionName( | 
| -              function_, module_env_->wire_bytes.GetNameOrNull(function_)) | 
| -       << std::endl; | 
| -    os << std::endl; | 
| +    if (func_name_.start() != nullptr) { | 
| +      PrintF("Compiling WASM function %d:'%.*s'\n\n", func_index(), | 
| +             func_name_.length(), func_name_.start()); | 
| +    } else { | 
| +      PrintF("Compiling WASM function %d:<unnamed>\n\n", func_index()); | 
| +    } | 
| } | 
|  | 
| double decode_ms = 0; | 
| @@ -4167,14 +4162,14 @@ void WasmCompilationUnit::ExecuteCompilation() { | 
|  | 
| // Run the compiler pipeline to generate machine code. | 
| CallDescriptor* descriptor = wasm::ModuleEnv::GetWasmCallDescriptor( | 
| -      &compilation_zone_, function_->sig); | 
| +      &compilation_zone_, func_body_.sig); | 
| if (jsgraph_->machine()->Is32()) { | 
| -    descriptor = module_env_->module_env.GetI32WasmCallDescriptor( | 
| -        &compilation_zone_, descriptor); | 
| +    descriptor = | 
| +        module_env_->GetI32WasmCallDescriptor(&compilation_zone_, descriptor); | 
| } | 
| job_.reset(Pipeline::NewWasmCompilationJob( | 
| &info_, jsgraph_, descriptor, source_positions, &protected_instructions_, | 
| -      module_env_->module_env.module->origin != wasm::kWasmOrigin)); | 
| +      module_env_->module->origin != wasm::kWasmOrigin)); | 
| ok_ = job_->ExecuteJob() == CompilationJob::SUCCEEDED; | 
| // TODO(bradnelson): Improve histogram handling of size_t. | 
| // TODO(ahaas): The counters are not thread-safe at the moment. | 
| @@ -4187,20 +4182,25 @@ void WasmCompilationUnit::ExecuteCompilation() { | 
| PrintF( | 
| "wasm-compilation phase 1 ok: %u bytes, %0.3f ms decode, %zu nodes, " | 
| "%0.3f ms pipeline\n", | 
| -        function_->code_end_offset - function_->code_start_offset, decode_ms, | 
| +        static_cast<unsigned>(func_body_.end - func_body_.start), decode_ms, | 
| node_count, pipeline_ms); | 
| } | 
| } | 
|  | 
| -Handle<Code> WasmCompilationUnit::FinishCompilation() { | 
| +Handle<Code> WasmCompilationUnit::FinishCompilation( | 
| +    wasm::ErrorThrower* thrower) { | 
| if (!ok_) { | 
| if (graph_construction_result_.failed()) { | 
| // Add the function as another context for the exception | 
| ScopedVector<char> buffer(128); | 
| -      wasm::WasmName name = module_env_->wire_bytes.GetName(function_); | 
| -      SNPrintF(buffer, "Compiling WASM function #%d:%.*s failed:", | 
| -               function_->func_index, name.length(), name.start()); | 
| -      thrower_->CompileFailed(buffer.start(), graph_construction_result_); | 
| +      if (func_name_.start() == nullptr) { | 
| +        SNPrintF(buffer, | 
| +                 "Compiling WASM function #%d:%.*s failed:", func_index_, | 
| +                 func_name_.length(), func_name_.start()); | 
| +      } else { | 
| +        SNPrintF(buffer, "Compiling WASM function #%d failed:", func_index_); | 
| +      } | 
| +      thrower->CompileFailed(buffer.start(), graph_construction_result_); | 
| } | 
|  | 
| return Handle<Code>::null(); | 
| @@ -4218,21 +4218,29 @@ Handle<Code> WasmCompilationUnit::FinishCompilation() { | 
| if (isolate_->logger()->is_logging_code_events() || | 
| isolate_->is_profiling()) { | 
| RecordFunctionCompilation(CodeEventListener::FUNCTION_TAG, isolate_, code, | 
| -                              "WASM_function", function_->func_index, | 
| -                              wasm::WasmName("module"), | 
| -                              module_env_->wire_bytes.GetName(function_)); | 
| +                              "WASM_function", func_index_, | 
| +                              wasm::WasmName("module"), func_name_); | 
| } | 
|  | 
| if (FLAG_trace_wasm_decode_time) { | 
| double codegen_ms = codegen_timer.Elapsed().InMillisecondsF(); | 
| PrintF("wasm-code-generation ok: %u bytes, %0.3f ms code generation\n", | 
| -           function_->code_end_offset - function_->code_start_offset, | 
| +           static_cast<unsigned>(func_body_.end - func_body_.start), | 
| codegen_ms); | 
| } | 
|  | 
| return code; | 
| } | 
|  | 
| +// static | 
| +Handle<Code> WasmCompilationUnit::CompileWasmFunction( | 
| +    wasm::ErrorThrower* thrower, Isolate* isolate, | 
| +    wasm::ModuleBytesEnv* module_env, const wasm::WasmFunction* function) { | 
| +  WasmCompilationUnit unit(isolate, module_env, function); | 
| +  unit.ExecuteCompilation(); | 
| +  return unit.FinishCompilation(thrower); | 
| +} | 
| + | 
| }  // namespace compiler | 
| }  // namespace internal | 
| }  // namespace v8 | 
|  |