| Index: src/code-stubs.cc
|
| diff --git a/src/code-stubs.cc b/src/code-stubs.cc
|
| index 0ac07de0ddfd93a262a6a6fc544c113de3962181..2a15b628cd121d293abf38ef91527d7b6c5419ff 100644
|
| --- a/src/code-stubs.cc
|
| +++ b/src/code-stubs.cc
|
| @@ -111,21 +111,12 @@ bool CodeStub::FindCodeInCache(Code** code_out) {
|
| }
|
|
|
|
|
| -SmartArrayPointer<const char> CodeStub::GetName() {
|
| - char buffer[100];
|
| - NoAllocationStringAllocator allocator(buffer,
|
| - static_cast<unsigned>(sizeof(buffer)));
|
| - StringStream stream(&allocator);
|
| - PrintName(&stream);
|
| - return stream.ToCString();
|
| -}
|
| -
|
| -
|
| void CodeStub::RecordCodeGeneration(Handle<Code> code) {
|
| IC::RegisterWeakMapDependency(code);
|
| - SmartArrayPointer<const char> name = GetName();
|
| - PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, name.get()));
|
| - GDBJIT(AddCode(GDBJITInterface::STUB, name.get(), *code));
|
| + OStringStream os;
|
| + os << *this;
|
| + PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, os.c_str()));
|
| + GDBJIT(AddCode(GDBJITInterface::STUB, os.c_str(), *code));
|
| Counters* counters = isolate()->counters();
|
| counters->total_stubs_code_size()->Increment(code->instruction_size());
|
| }
|
| @@ -198,7 +189,9 @@ Handle<Code> CodeStub::GetCode() {
|
| #ifdef ENABLE_DISASSEMBLER
|
| if (FLAG_print_code_stubs) {
|
| CodeTracer::Scope trace_scope(isolate()->GetCodeTracer());
|
| - new_object->Disassemble(GetName().get(), trace_scope.file());
|
| + OStringStream os;
|
| + os << *this;
|
| + new_object->Disassemble(os.c_str(), trace_scope.file());
|
| PrintF(trace_scope.file(), "\n");
|
| }
|
| #endif
|
| @@ -241,14 +234,15 @@ const char* CodeStub::MajorName(CodeStub::Major major_key,
|
| }
|
|
|
|
|
| -void CodeStub::PrintBaseName(StringStream* stream) {
|
| - stream->Add("%s", MajorName(MajorKey(), false));
|
| +OStream& CodeStub::PrintBaseName(OStream& os) const { // NOLINT
|
| + return os << MajorName(MajorKey(), false);
|
| }
|
|
|
|
|
| -void CodeStub::PrintName(StringStream* stream) {
|
| - PrintBaseName(stream);
|
| - PrintState(stream);
|
| +OStream& CodeStub::PrintName(OStream& os) const { // NOLINT
|
| + PrintBaseName(os);
|
| + PrintState(os);
|
| + return os;
|
| }
|
|
|
|
|
| @@ -269,8 +263,8 @@ void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) {
|
| }
|
|
|
|
|
| -void BinaryOpICStub::PrintState(StringStream* stream) {
|
| - state_.Print(stream);
|
| +OStream& BinaryOpICStub::PrintState(OStream& os) const { // NOLINT
|
| + return os << state_;
|
| }
|
|
|
|
|
| @@ -289,8 +283,9 @@ void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) {
|
| }
|
|
|
|
|
| -void BinaryOpICWithAllocationSiteStub::PrintState(StringStream* stream) {
|
| - state_.Print(stream);
|
| +OStream& BinaryOpICWithAllocationSiteStub::PrintState(
|
| + OStream& os) const { // NOLINT
|
| + return os << state_;
|
| }
|
|
|
|
|
| @@ -304,18 +299,19 @@ void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(
|
| }
|
|
|
|
|
| -void StringAddStub::PrintBaseName(StringStream* stream) {
|
| - stream->Add("StringAddStub");
|
| +OStream& StringAddStub::PrintBaseName(OStream& os) const { // NOLINT
|
| + os << "StringAddStub";
|
| if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) {
|
| - stream->Add("_CheckBoth");
|
| + os << "_CheckBoth";
|
| } else if ((flags() & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT) {
|
| - stream->Add("_CheckLeft");
|
| + os << "_CheckLeft";
|
| } else if ((flags() & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT) {
|
| - stream->Add("_CheckRight");
|
| + os << "_CheckRight";
|
| }
|
| if (pretenure_flag() == TENURED) {
|
| - stream->Add("_Tenured");
|
| + os << "_Tenured";
|
| }
|
| + return os;
|
| }
|
|
|
|
|
| @@ -379,7 +375,7 @@ bool ICCompareStub::FindCodeInSpecialCache(Code** code_out) {
|
| }
|
|
|
|
|
| -int ICCompareStub::MinorKey() {
|
| +int ICCompareStub::MinorKey() const {
|
| return OpField::encode(op_ - Token::EQ) |
|
| LeftStateField::encode(left_) |
|
| RightStateField::encode(right_) |
|
| @@ -472,42 +468,52 @@ void HydrogenCodeStub::TraceTransition(StateType from, StateType to) {
|
| // bug somewhere in our state transition machinery.
|
| ASSERT(from != to);
|
| if (!FLAG_trace_ic) return;
|
| - char buffer[100];
|
| - NoAllocationStringAllocator allocator(buffer,
|
| - static_cast<unsigned>(sizeof(buffer)));
|
| - StringStream stream(&allocator);
|
| - stream.Add("[");
|
| - PrintBaseName(&stream);
|
| - stream.Add(": ");
|
| - from.Print(&stream);
|
| - stream.Add("=>");
|
| - to.Print(&stream);
|
| - stream.Add("]\n");
|
| - stream.OutputToStdOut();
|
| + OFStream os(stdout);
|
| + os << "[";
|
| + PrintBaseName(os) << ": " << from << "=>" << to << "]" << endl;
|
| }
|
|
|
|
|
| -void CompareNilICStub::PrintBaseName(StringStream* stream) {
|
| - CodeStub::PrintBaseName(stream);
|
| - stream->Add((nil_value_ == kNullValue) ? "(NullValue)":
|
| - "(UndefinedValue)");
|
| +OStream& CompareNilICStub::PrintBaseName(OStream& os) const { // NOLINT
|
| + return CodeStub::PrintBaseName(os) <<
|
| + ((nil_value_ == kNullValue) ? "(NullValue)": "(UndefinedValue)");
|
| }
|
|
|
|
|
| -void CompareNilICStub::PrintState(StringStream* stream) {
|
| - state_.Print(stream);
|
| +OStream& CompareNilICStub::PrintState(OStream& os) const { // NOLINT
|
| + return os << state_;
|
| }
|
|
|
|
|
| -void CompareNilICStub::State::Print(StringStream* stream) const {
|
| - stream->Add("(");
|
| - SimpleListPrinter printer(stream);
|
| - if (IsEmpty()) printer.Add("None");
|
| - if (Contains(UNDEFINED)) printer.Add("Undefined");
|
| - if (Contains(NULL_TYPE)) printer.Add("Null");
|
| - if (Contains(MONOMORPHIC_MAP)) printer.Add("MonomorphicMap");
|
| - if (Contains(GENERIC)) printer.Add("Generic");
|
| - stream->Add(")");
|
| +// TODO(svenpanne) Make this a real infix_ostream_iterator.
|
| +class SimpleListPrinter {
|
| + public:
|
| + explicit SimpleListPrinter(OStream& os) : os_(os), first_(true) { }
|
| +
|
| + void Add(const char* s) {
|
| + if (first_) {
|
| + first_ = false;
|
| + } else {
|
| + os_ << ",";
|
| + }
|
| + os_ << s;
|
| + }
|
| +
|
| + private:
|
| + OStream& os_;
|
| + bool first_;
|
| +};
|
| +
|
| +
|
| +OStream& operator<<(OStream& os, const CompareNilICStub::State& s) {
|
| + os << "(";
|
| + SimpleListPrinter p(os);
|
| + if (s.IsEmpty()) p.Add("None");
|
| + if (s.Contains(CompareNilICStub::UNDEFINED)) p.Add("Undefined");
|
| + if (s.Contains(CompareNilICStub::NULL_TYPE)) p.Add("Null");
|
| + if (s.Contains(CompareNilICStub::MONOMORPHIC_MAP)) p.Add("MonomorphicMap");
|
| + if (s.Contains(CompareNilICStub::GENERIC)) p.Add("Generic");
|
| + return os << ")";
|
| }
|
|
|
|
|
| @@ -541,37 +547,22 @@ Type* CompareNilICStub::GetInputType(Zone* zone, Handle<Map> map) {
|
| }
|
|
|
|
|
| -void CallIC_ArrayStub::PrintState(StringStream* stream) {
|
| - state_.Print(stream);
|
| - stream->Add(" (Array)");
|
| +OStream& CallIC_ArrayStub::PrintState(OStream& os) const { // NOLINT
|
| + return os << state_ << " (Array)";
|
| }
|
|
|
|
|
| -void CallICStub::PrintState(StringStream* stream) {
|
| - state_.Print(stream);
|
| +OStream& CallICStub::PrintState(OStream& os) const { // NOLINT
|
| + return os << state_;
|
| }
|
|
|
|
|
| -void InstanceofStub::PrintName(StringStream* stream) {
|
| - const char* args = "";
|
| - if (HasArgsInRegisters()) {
|
| - args = "_REGS";
|
| - }
|
| -
|
| - const char* inline_check = "";
|
| - if (HasCallSiteInlineCheck()) {
|
| - inline_check = "_INLINE";
|
| - }
|
| -
|
| - const char* return_true_false_object = "";
|
| - if (ReturnTrueFalseObject()) {
|
| - return_true_false_object = "_TRUEFALSE";
|
| - }
|
| -
|
| - stream->Add("InstanceofStub%s%s%s",
|
| - args,
|
| - inline_check,
|
| - return_true_false_object);
|
| +OStream& InstanceofStub::PrintName(OStream& os) const { // NOLINT
|
| + os << "InstanceofStub";
|
| + if (HasArgsInRegisters()) os << "_REGS";
|
| + if (HasCallSiteInlineCheck()) os << "_INLINE";
|
| + if (ReturnTrueFalseObject()) os << "_TRUEFALSE";
|
| + return os;
|
| }
|
|
|
|
|
| @@ -682,47 +673,51 @@ void KeyedStoreElementStub::Generate(MacroAssembler* masm) {
|
| }
|
|
|
|
|
| -void ArgumentsAccessStub::PrintName(StringStream* stream) {
|
| - stream->Add("ArgumentsAccessStub_");
|
| +OStream& ArgumentsAccessStub::PrintName(OStream& os) const { // NOLINT
|
| + os << "ArgumentsAccessStub_";
|
| switch (type_) {
|
| - case READ_ELEMENT: stream->Add("ReadElement"); break;
|
| - case NEW_SLOPPY_FAST: stream->Add("NewSloppyFast"); break;
|
| - case NEW_SLOPPY_SLOW: stream->Add("NewSloppySlow"); break;
|
| - case NEW_STRICT: stream->Add("NewStrict"); break;
|
| + case READ_ELEMENT: return os << "ReadElement";
|
| + case NEW_SLOPPY_FAST: return os << "NewSloppyFast";
|
| + case NEW_SLOPPY_SLOW: return os << "NewSloppySlow";
|
| + case NEW_STRICT: return os << "NewStrict";
|
| }
|
| + UNREACHABLE();
|
| + return os;
|
| }
|
|
|
|
|
| -void CallFunctionStub::PrintName(StringStream* stream) {
|
| - stream->Add("CallFunctionStub_Args%d", argc_);
|
| +OStream& CallFunctionStub::PrintName(OStream& os) const { // NOLINT
|
| + return os << "CallFunctionStub_Args" << argc_;
|
| }
|
|
|
|
|
| -void CallConstructStub::PrintName(StringStream* stream) {
|
| - stream->Add("CallConstructStub");
|
| - if (RecordCallTarget()) stream->Add("_Recording");
|
| +OStream& CallConstructStub::PrintName(OStream& os) const { // NOLINT
|
| + os << "CallConstructStub";
|
| + if (RecordCallTarget()) os << "_Recording";
|
| + return os;
|
| }
|
|
|
|
|
| -void ArrayConstructorStub::PrintName(StringStream* stream) {
|
| - stream->Add("ArrayConstructorStub");
|
| +OStream& ArrayConstructorStub::PrintName(OStream& os) const { // NOLINT
|
| + os << "ArrayConstructorStub";
|
| switch (argument_count_) {
|
| - case ANY: stream->Add("_Any"); break;
|
| - case NONE: stream->Add("_None"); break;
|
| - case ONE: stream->Add("_One"); break;
|
| - case MORE_THAN_ONE: stream->Add("_More_Than_One"); break;
|
| + case ANY: return os << "_Any";
|
| + case NONE: return os << "_None";
|
| + case ONE: return os << "_One";
|
| + case MORE_THAN_ONE: return os << "_More_Than_One";
|
| }
|
| + UNREACHABLE();
|
| + return os;
|
| }
|
|
|
|
|
| -void ArrayConstructorStubBase::BasePrintName(const char* name,
|
| - StringStream* stream) {
|
| - stream->Add(name);
|
| - stream->Add("_");
|
| - stream->Add(ElementsKindToString(elements_kind()));
|
| +OStream& ArrayConstructorStubBase::BasePrintName(OStream& os, // NOLINT
|
| + const char* name) const {
|
| + os << name << "_" << ElementsKindToString(elements_kind());
|
| if (override_mode() == DISABLE_ALLOCATION_SITES) {
|
| - stream->Add("_DISABLE_ALLOCATION_SITES");
|
| + os << "_DISABLE_ALLOCATION_SITES";
|
| }
|
| + return os;
|
| }
|
|
|
|
|
| @@ -734,24 +729,24 @@ bool ToBooleanStub::UpdateStatus(Handle<Object> object) {
|
| }
|
|
|
|
|
| -void ToBooleanStub::PrintState(StringStream* stream) {
|
| - types_.Print(stream);
|
| +OStream& ToBooleanStub::PrintState(OStream& os) const { // NOLINT
|
| + return os << types_;
|
| }
|
|
|
|
|
| -void ToBooleanStub::Types::Print(StringStream* stream) const {
|
| - stream->Add("(");
|
| - SimpleListPrinter printer(stream);
|
| - if (IsEmpty()) printer.Add("None");
|
| - if (Contains(UNDEFINED)) printer.Add("Undefined");
|
| - if (Contains(BOOLEAN)) printer.Add("Bool");
|
| - if (Contains(NULL_TYPE)) printer.Add("Null");
|
| - if (Contains(SMI)) printer.Add("Smi");
|
| - if (Contains(SPEC_OBJECT)) printer.Add("SpecObject");
|
| - if (Contains(STRING)) printer.Add("String");
|
| - if (Contains(SYMBOL)) printer.Add("Symbol");
|
| - if (Contains(HEAP_NUMBER)) printer.Add("HeapNumber");
|
| - stream->Add(")");
|
| +OStream& operator<<(OStream& os, const ToBooleanStub::Types& s) {
|
| + os << "(";
|
| + SimpleListPrinter p(os);
|
| + if (s.IsEmpty()) p.Add("None");
|
| + if (s.Contains(ToBooleanStub::UNDEFINED)) p.Add("Undefined");
|
| + if (s.Contains(ToBooleanStub::BOOLEAN)) p.Add("Bool");
|
| + if (s.Contains(ToBooleanStub::NULL_TYPE)) p.Add("Null");
|
| + if (s.Contains(ToBooleanStub::SMI)) p.Add("Smi");
|
| + if (s.Contains(ToBooleanStub::SPEC_OBJECT)) p.Add("SpecObject");
|
| + if (s.Contains(ToBooleanStub::STRING)) p.Add("String");
|
| + if (s.Contains(ToBooleanStub::SYMBOL)) p.Add("Symbol");
|
| + if (s.Contains(ToBooleanStub::HEAP_NUMBER)) p.Add("HeapNumber");
|
| + return os << ")";
|
| }
|
|
|
|
|
|
|