// Copyright 2016 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/codegen/source-position.h" #include "src/codegen/optimized-compilation-info.h" #include "src/common/assert-scope.h" #include "src/objects/objects-inl.h" namespace v8 { namespace internal { std::ostream& operator<<(std::ostream& out, const SourcePositionInfo& pos) { out << "<"; if (!pos.script.is_null() && IsString(pos.script->name())) { out << String::cast(pos.script->name())->ToCString(DISALLOW_NULLS).get(); } else { out << "unknown"; } out << ":" << pos.line + 1 << ":" << pos.column + 1 << ">"; return out; } std::ostream& operator<<(std::ostream& out, const std::vector& stack) { bool first = true; for (const SourcePositionInfo& pos : stack) { if (!first) out << " inlined at "; out << pos; first = false; } return out; } std::ostream& operator<<(std::ostream& out, const SourcePosition& pos) { if (pos.isInlined()) { out << ""; } else { out << pos.ScriptOffset() << ">"; } return out; } std::vector SourcePosition::InliningStack( Isolate* isolate, OptimizedCompilationInfo* cinfo) const { SourcePosition pos = *this; std::vector stack; while (pos.isInlined()) { const auto& inl = cinfo->inlined_functions()[pos.InliningId()]; stack.push_back(SourcePositionInfo(isolate, pos, inl.shared_info)); pos = inl.position.position; } stack.push_back(SourcePositionInfo(isolate, pos, cinfo->shared_info())); return stack; } std::vector SourcePosition::InliningStack( Isolate* isolate, Tagged code) const { Tagged deopt_data = DeoptimizationData::cast(code->deoptimization_data()); SourcePosition pos = *this; std::vector stack; while (pos.isInlined()) { InliningPosition inl = deopt_data->InliningPositions()->get(pos.InliningId()); Handle function( deopt_data->GetInlinedFunction(inl.inlined_function_id), isolate); stack.push_back(SourcePositionInfo(isolate, pos, function)); pos = inl.position; } Handle function( SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo()), isolate); stack.push_back(SourcePositionInfo(isolate, pos, function)); return stack; } SourcePositionInfo SourcePosition::FirstInfo(Isolate* isolate, Tagged code) const { DisallowGarbageCollection no_gc; Tagged deopt_data = DeoptimizationData::cast(code->deoptimization_data()); SourcePosition pos = *this; if (pos.isInlined()) { InliningPosition inl = deopt_data->InliningPositions()->get(pos.InliningId()); Handle function( deopt_data->GetInlinedFunction(inl.inlined_function_id), isolate); return SourcePositionInfo(isolate, pos, function); } Handle function( SharedFunctionInfo::cast(deopt_data->SharedFunctionInfo()), isolate); return SourcePositionInfo(isolate, pos, function); } void SourcePosition::Print(std::ostream& out, Tagged function) const { Script::PositionInfo pos; Tagged source_name; if (IsScript(function->script())) { Tagged