| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
| 8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
| 9 #include "src/cpu-profiler.h" | 9 #include "src/cpu-profiler.h" |
| 10 #include "src/factory.h" | 10 #include "src/factory.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 UnseededNumberDictionary* stubs = isolate()->heap()->code_stubs(); | 104 UnseededNumberDictionary* stubs = isolate()->heap()->code_stubs(); |
| 105 int index = stubs->FindEntry(GetKey()); | 105 int index = stubs->FindEntry(GetKey()); |
| 106 if (index != UnseededNumberDictionary::kNotFound) { | 106 if (index != UnseededNumberDictionary::kNotFound) { |
| 107 *code_out = Code::cast(stubs->ValueAt(index)); | 107 *code_out = Code::cast(stubs->ValueAt(index)); |
| 108 return true; | 108 return true; |
| 109 } | 109 } |
| 110 return false; | 110 return false; |
| 111 } | 111 } |
| 112 | 112 |
| 113 | 113 |
| 114 SmartArrayPointer<const char> CodeStub::GetName() { | |
| 115 char buffer[100]; | |
| 116 NoAllocationStringAllocator allocator(buffer, | |
| 117 static_cast<unsigned>(sizeof(buffer))); | |
| 118 StringStream stream(&allocator); | |
| 119 PrintName(&stream); | |
| 120 return stream.ToCString(); | |
| 121 } | |
| 122 | |
| 123 | |
| 124 void CodeStub::RecordCodeGeneration(Handle<Code> code) { | 114 void CodeStub::RecordCodeGeneration(Handle<Code> code) { |
| 125 IC::RegisterWeakMapDependency(code); | 115 IC::RegisterWeakMapDependency(code); |
| 126 SmartArrayPointer<const char> name = GetName(); | 116 OStringStream os; |
| 127 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, name.get())); | 117 os << *this; |
| 128 GDBJIT(AddCode(GDBJITInterface::STUB, name.get(), *code)); | 118 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, os.c_str())); |
| 119 GDBJIT(AddCode(GDBJITInterface::STUB, os.c_str(), *code)); |
| 129 Counters* counters = isolate()->counters(); | 120 Counters* counters = isolate()->counters(); |
| 130 counters->total_stubs_code_size()->Increment(code->instruction_size()); | 121 counters->total_stubs_code_size()->Increment(code->instruction_size()); |
| 131 } | 122 } |
| 132 | 123 |
| 133 | 124 |
| 134 Code::Kind CodeStub::GetCodeKind() const { | 125 Code::Kind CodeStub::GetCodeKind() const { |
| 135 return Code::STUB; | 126 return Code::STUB; |
| 136 } | 127 } |
| 137 | 128 |
| 138 | 129 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 HandleScope scope(isolate()); | 182 HandleScope scope(isolate()); |
| 192 | 183 |
| 193 Handle<Code> new_object = GenerateCode(); | 184 Handle<Code> new_object = GenerateCode(); |
| 194 new_object->set_major_key(MajorKey()); | 185 new_object->set_major_key(MajorKey()); |
| 195 FinishCode(new_object); | 186 FinishCode(new_object); |
| 196 RecordCodeGeneration(new_object); | 187 RecordCodeGeneration(new_object); |
| 197 | 188 |
| 198 #ifdef ENABLE_DISASSEMBLER | 189 #ifdef ENABLE_DISASSEMBLER |
| 199 if (FLAG_print_code_stubs) { | 190 if (FLAG_print_code_stubs) { |
| 200 CodeTracer::Scope trace_scope(isolate()->GetCodeTracer()); | 191 CodeTracer::Scope trace_scope(isolate()->GetCodeTracer()); |
| 201 new_object->Disassemble(GetName().get(), trace_scope.file()); | 192 OStringStream os; |
| 193 os << *this; |
| 194 new_object->Disassemble(os.c_str(), trace_scope.file()); |
| 202 PrintF(trace_scope.file(), "\n"); | 195 PrintF(trace_scope.file(), "\n"); |
| 203 } | 196 } |
| 204 #endif | 197 #endif |
| 205 | 198 |
| 206 if (UseSpecialCache()) { | 199 if (UseSpecialCache()) { |
| 207 AddToSpecialCache(new_object); | 200 AddToSpecialCache(new_object); |
| 208 } else { | 201 } else { |
| 209 // Update the dictionary and the root in Heap. | 202 // Update the dictionary and the root in Heap. |
| 210 Handle<UnseededNumberDictionary> dict = | 203 Handle<UnseededNumberDictionary> dict = |
| 211 UnseededNumberDictionary::AtNumberPut( | 204 UnseededNumberDictionary::AtNumberPut( |
| (...skipping 22 matching lines...) Expand all Loading... |
| 234 case UninitializedMajorKey: return "<UninitializedMajorKey>Stub"; | 227 case UninitializedMajorKey: return "<UninitializedMajorKey>Stub"; |
| 235 default: | 228 default: |
| 236 if (!allow_unknown_keys) { | 229 if (!allow_unknown_keys) { |
| 237 UNREACHABLE(); | 230 UNREACHABLE(); |
| 238 } | 231 } |
| 239 return NULL; | 232 return NULL; |
| 240 } | 233 } |
| 241 } | 234 } |
| 242 | 235 |
| 243 | 236 |
| 244 void CodeStub::PrintBaseName(StringStream* stream) { | 237 void CodeStub::PrintBaseName(OStream& os) const { // NOLINT |
| 245 stream->Add("%s", MajorName(MajorKey(), false)); | 238 os << MajorName(MajorKey(), false); |
| 246 } | 239 } |
| 247 | 240 |
| 248 | 241 |
| 249 void CodeStub::PrintName(StringStream* stream) { | 242 void CodeStub::PrintName(OStream& os) const { // NOLINT |
| 250 PrintBaseName(stream); | 243 PrintBaseName(os); |
| 251 PrintState(stream); | 244 PrintState(os); |
| 252 } | 245 } |
| 253 | 246 |
| 254 | 247 |
| 255 // static | 248 // static |
| 256 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) { | 249 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate) { |
| 257 // Generate the uninitialized versions of the stub. | 250 // Generate the uninitialized versions of the stub. |
| 258 for (int op = Token::BIT_OR; op <= Token::MOD; ++op) { | 251 for (int op = Token::BIT_OR; op <= Token::MOD; ++op) { |
| 259 for (int mode = NO_OVERWRITE; mode <= OVERWRITE_RIGHT; ++mode) { | 252 for (int mode = NO_OVERWRITE; mode <= OVERWRITE_RIGHT; ++mode) { |
| 260 BinaryOpICStub stub(isolate, | 253 BinaryOpICStub stub(isolate, |
| 261 static_cast<Token::Value>(op), | 254 static_cast<Token::Value>(op), |
| 262 static_cast<OverwriteMode>(mode)); | 255 static_cast<OverwriteMode>(mode)); |
| 263 stub.GetCode(); | 256 stub.GetCode(); |
| 264 } | 257 } |
| 265 } | 258 } |
| 266 | 259 |
| 267 // Generate special versions of the stub. | 260 // Generate special versions of the stub. |
| 268 BinaryOpIC::State::GenerateAheadOfTime(isolate, &GenerateAheadOfTime); | 261 BinaryOpIC::State::GenerateAheadOfTime(isolate, &GenerateAheadOfTime); |
| 269 } | 262 } |
| 270 | 263 |
| 271 | 264 |
| 272 void BinaryOpICStub::PrintState(StringStream* stream) { | 265 void BinaryOpICStub::PrintState(OStream& os) const { // NOLINT |
| 273 state_.Print(stream); | 266 os << state_; |
| 274 } | 267 } |
| 275 | 268 |
| 276 | 269 |
| 277 // static | 270 // static |
| 278 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate, | 271 void BinaryOpICStub::GenerateAheadOfTime(Isolate* isolate, |
| 279 const BinaryOpIC::State& state) { | 272 const BinaryOpIC::State& state) { |
| 280 BinaryOpICStub stub(isolate, state); | 273 BinaryOpICStub stub(isolate, state); |
| 281 stub.GetCode(); | 274 stub.GetCode(); |
| 282 } | 275 } |
| 283 | 276 |
| 284 | 277 |
| 285 // static | 278 // static |
| 286 void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { | 279 void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime(Isolate* isolate) { |
| 287 // Generate special versions of the stub. | 280 // Generate special versions of the stub. |
| 288 BinaryOpIC::State::GenerateAheadOfTime(isolate, &GenerateAheadOfTime); | 281 BinaryOpIC::State::GenerateAheadOfTime(isolate, &GenerateAheadOfTime); |
| 289 } | 282 } |
| 290 | 283 |
| 291 | 284 |
| 292 void BinaryOpICWithAllocationSiteStub::PrintState(StringStream* stream) { | 285 void BinaryOpICWithAllocationSiteStub::PrintState( |
| 293 state_.Print(stream); | 286 OStream& os) const { // NOLINT |
| 287 os << state_; |
| 294 } | 288 } |
| 295 | 289 |
| 296 | 290 |
| 297 // static | 291 // static |
| 298 void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime( | 292 void BinaryOpICWithAllocationSiteStub::GenerateAheadOfTime( |
| 299 Isolate* isolate, const BinaryOpIC::State& state) { | 293 Isolate* isolate, const BinaryOpIC::State& state) { |
| 300 if (state.CouldCreateAllocationMementos()) { | 294 if (state.CouldCreateAllocationMementos()) { |
| 301 BinaryOpICWithAllocationSiteStub stub(isolate, state); | 295 BinaryOpICWithAllocationSiteStub stub(isolate, state); |
| 302 stub.GetCode(); | 296 stub.GetCode(); |
| 303 } | 297 } |
| 304 } | 298 } |
| 305 | 299 |
| 306 | 300 |
| 307 void StringAddStub::PrintBaseName(StringStream* stream) { | 301 void StringAddStub::PrintBaseName(OStream& os) const { // NOLINT |
| 308 stream->Add("StringAddStub"); | 302 os << "StringAddStub"; |
| 309 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) { | 303 if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) { |
| 310 stream->Add("_CheckBoth"); | 304 os << "_CheckBoth"; |
| 311 } else if ((flags() & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT) { | 305 } else if ((flags() & STRING_ADD_CHECK_LEFT) == STRING_ADD_CHECK_LEFT) { |
| 312 stream->Add("_CheckLeft"); | 306 os << "_CheckLeft"; |
| 313 } else if ((flags() & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT) { | 307 } else if ((flags() & STRING_ADD_CHECK_RIGHT) == STRING_ADD_CHECK_RIGHT) { |
| 314 stream->Add("_CheckRight"); | 308 os << "_CheckRight"; |
| 315 } | 309 } |
| 316 if (pretenure_flag() == TENURED) { | 310 if (pretenure_flag() == TENURED) { |
| 317 stream->Add("_Tenured"); | 311 os << "_Tenured"; |
| 318 } | 312 } |
| 319 } | 313 } |
| 320 | 314 |
| 321 | 315 |
| 322 InlineCacheState ICCompareStub::GetICState() { | 316 InlineCacheState ICCompareStub::GetICState() { |
| 323 CompareIC::State state = Max(left_, right_); | 317 CompareIC::State state = Max(left_, right_); |
| 324 switch (state) { | 318 switch (state) { |
| 325 case CompareIC::UNINITIALIZED: | 319 case CompareIC::UNINITIALIZED: |
| 326 return ::v8::internal::UNINITIALIZED; | 320 return ::v8::internal::UNINITIALIZED; |
| 327 case CompareIC::SMI: | 321 case CompareIC::SMI: |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 ICCompareStub::DecodeMinorKey((*code_out)->stub_info(), NULL, NULL, NULL, | 366 ICCompareStub::DecodeMinorKey((*code_out)->stub_info(), NULL, NULL, NULL, |
| 373 &cached_op); | 367 &cached_op); |
| 374 ASSERT(op_ == cached_op); | 368 ASSERT(op_ == cached_op); |
| 375 #endif | 369 #endif |
| 376 return true; | 370 return true; |
| 377 } | 371 } |
| 378 return false; | 372 return false; |
| 379 } | 373 } |
| 380 | 374 |
| 381 | 375 |
| 382 int ICCompareStub::MinorKey() { | 376 int ICCompareStub::MinorKey() const { |
| 383 return OpField::encode(op_ - Token::EQ) | | 377 return OpField::encode(op_ - Token::EQ) | |
| 384 LeftStateField::encode(left_) | | 378 LeftStateField::encode(left_) | |
| 385 RightStateField::encode(right_) | | 379 RightStateField::encode(right_) | |
| 386 HandlerStateField::encode(state_); | 380 HandlerStateField::encode(state_); |
| 387 } | 381 } |
| 388 | 382 |
| 389 | 383 |
| 390 void ICCompareStub::DecodeMinorKey(int minor_key, | 384 void ICCompareStub::DecodeMinorKey(int minor_key, |
| 391 CompareIC::State* left_state, | 385 CompareIC::State* left_state, |
| 392 CompareIC::State* right_state, | 386 CompareIC::State* right_state, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 TraceTransition(old_state, state_); | 459 TraceTransition(old_state, state_); |
| 466 } | 460 } |
| 467 | 461 |
| 468 | 462 |
| 469 template<class StateType> | 463 template<class StateType> |
| 470 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { | 464 void HydrogenCodeStub::TraceTransition(StateType from, StateType to) { |
| 471 // Note: Although a no-op transition is semantically OK, it is hinting at a | 465 // Note: Although a no-op transition is semantically OK, it is hinting at a |
| 472 // bug somewhere in our state transition machinery. | 466 // bug somewhere in our state transition machinery. |
| 473 ASSERT(from != to); | 467 ASSERT(from != to); |
| 474 if (!FLAG_trace_ic) return; | 468 if (!FLAG_trace_ic) return; |
| 475 char buffer[100]; | 469 OFStream os(stdout); |
| 476 NoAllocationStringAllocator allocator(buffer, | 470 os << "["; |
| 477 static_cast<unsigned>(sizeof(buffer))); | 471 PrintBaseName(os); |
| 478 StringStream stream(&allocator); | 472 os << ": " << from << "=>" << to << "]" << endl; |
| 479 stream.Add("["); | |
| 480 PrintBaseName(&stream); | |
| 481 stream.Add(": "); | |
| 482 from.Print(&stream); | |
| 483 stream.Add("=>"); | |
| 484 to.Print(&stream); | |
| 485 stream.Add("]\n"); | |
| 486 stream.OutputToStdOut(); | |
| 487 } | 473 } |
| 488 | 474 |
| 489 | 475 |
| 490 void CompareNilICStub::PrintBaseName(StringStream* stream) { | 476 void CompareNilICStub::PrintBaseName(OStream& os) const { // NOLINT |
| 491 CodeStub::PrintBaseName(stream); | 477 CodeStub::PrintBaseName(os); |
| 492 stream->Add((nil_value_ == kNullValue) ? "(NullValue)": | 478 os << ((nil_value_ == kNullValue) ? "(NullValue)" : "(UndefinedValue)"); |
| 493 "(UndefinedValue)"); | |
| 494 } | 479 } |
| 495 | 480 |
| 496 | 481 |
| 497 void CompareNilICStub::PrintState(StringStream* stream) { | 482 void CompareNilICStub::PrintState(OStream& os) const { // NOLINT |
| 498 state_.Print(stream); | 483 os << state_; |
| 499 } | 484 } |
| 500 | 485 |
| 501 | 486 |
| 502 void CompareNilICStub::State::Print(StringStream* stream) const { | 487 // TODO(svenpanne) Make this a real infix_ostream_iterator. |
| 503 stream->Add("("); | 488 class SimpleListPrinter { |
| 504 SimpleListPrinter printer(stream); | 489 public: |
| 505 if (IsEmpty()) printer.Add("None"); | 490 explicit SimpleListPrinter(OStream& os) : os_(os), first_(true) {} |
| 506 if (Contains(UNDEFINED)) printer.Add("Undefined"); | 491 |
| 507 if (Contains(NULL_TYPE)) printer.Add("Null"); | 492 void Add(const char* s) { |
| 508 if (Contains(MONOMORPHIC_MAP)) printer.Add("MonomorphicMap"); | 493 if (first_) { |
| 509 if (Contains(GENERIC)) printer.Add("Generic"); | 494 first_ = false; |
| 510 stream->Add(")"); | 495 } else { |
| 496 os_ << ","; |
| 497 } |
| 498 os_ << s; |
| 499 } |
| 500 |
| 501 private: |
| 502 OStream& os_; |
| 503 bool first_; |
| 504 }; |
| 505 |
| 506 |
| 507 OStream& operator<<(OStream& os, const CompareNilICStub::State& s) { |
| 508 os << "("; |
| 509 SimpleListPrinter p(os); |
| 510 if (s.IsEmpty()) p.Add("None"); |
| 511 if (s.Contains(CompareNilICStub::UNDEFINED)) p.Add("Undefined"); |
| 512 if (s.Contains(CompareNilICStub::NULL_TYPE)) p.Add("Null"); |
| 513 if (s.Contains(CompareNilICStub::MONOMORPHIC_MAP)) p.Add("MonomorphicMap"); |
| 514 if (s.Contains(CompareNilICStub::GENERIC)) p.Add("Generic"); |
| 515 return os << ")"; |
| 511 } | 516 } |
| 512 | 517 |
| 513 | 518 |
| 514 Type* CompareNilICStub::GetType(Zone* zone, Handle<Map> map) { | 519 Type* CompareNilICStub::GetType(Zone* zone, Handle<Map> map) { |
| 515 if (state_.Contains(CompareNilICStub::GENERIC)) { | 520 if (state_.Contains(CompareNilICStub::GENERIC)) { |
| 516 return Type::Any(zone); | 521 return Type::Any(zone); |
| 517 } | 522 } |
| 518 | 523 |
| 519 Type* result = Type::None(zone); | 524 Type* result = Type::None(zone); |
| 520 if (state_.Contains(CompareNilICStub::UNDEFINED)) { | 525 if (state_.Contains(CompareNilICStub::UNDEFINED)) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 534 | 539 |
| 535 | 540 |
| 536 Type* CompareNilICStub::GetInputType(Zone* zone, Handle<Map> map) { | 541 Type* CompareNilICStub::GetInputType(Zone* zone, Handle<Map> map) { |
| 537 Type* output_type = GetType(zone, map); | 542 Type* output_type = GetType(zone, map); |
| 538 Type* nil_type = | 543 Type* nil_type = |
| 539 nil_value_ == kNullValue ? Type::Null(zone) : Type::Undefined(zone); | 544 nil_value_ == kNullValue ? Type::Null(zone) : Type::Undefined(zone); |
| 540 return Type::Union(output_type, nil_type, zone); | 545 return Type::Union(output_type, nil_type, zone); |
| 541 } | 546 } |
| 542 | 547 |
| 543 | 548 |
| 544 void CallIC_ArrayStub::PrintState(StringStream* stream) { | 549 void CallIC_ArrayStub::PrintState(OStream& os) const { // NOLINT |
| 545 state_.Print(stream); | 550 os << state_ << " (Array)"; |
| 546 stream->Add(" (Array)"); | |
| 547 } | 551 } |
| 548 | 552 |
| 549 | 553 |
| 550 void CallICStub::PrintState(StringStream* stream) { | 554 void CallICStub::PrintState(OStream& os) const { // NOLINT |
| 551 state_.Print(stream); | 555 os << state_; |
| 552 } | 556 } |
| 553 | 557 |
| 554 | 558 |
| 555 void InstanceofStub::PrintName(StringStream* stream) { | 559 void InstanceofStub::PrintName(OStream& os) const { // NOLINT |
| 556 const char* args = ""; | 560 os << "InstanceofStub"; |
| 557 if (HasArgsInRegisters()) { | 561 if (HasArgsInRegisters()) os << "_REGS"; |
| 558 args = "_REGS"; | 562 if (HasCallSiteInlineCheck()) os << "_INLINE"; |
| 559 } | 563 if (ReturnTrueFalseObject()) os << "_TRUEFALSE"; |
| 560 | |
| 561 const char* inline_check = ""; | |
| 562 if (HasCallSiteInlineCheck()) { | |
| 563 inline_check = "_INLINE"; | |
| 564 } | |
| 565 | |
| 566 const char* return_true_false_object = ""; | |
| 567 if (ReturnTrueFalseObject()) { | |
| 568 return_true_false_object = "_TRUEFALSE"; | |
| 569 } | |
| 570 | |
| 571 stream->Add("InstanceofStub%s%s%s", | |
| 572 args, | |
| 573 inline_check, | |
| 574 return_true_false_object); | |
| 575 } | 564 } |
| 576 | 565 |
| 577 | 566 |
| 578 void JSEntryStub::FinishCode(Handle<Code> code) { | 567 void JSEntryStub::FinishCode(Handle<Code> code) { |
| 579 Handle<FixedArray> handler_table = | 568 Handle<FixedArray> handler_table = |
| 580 code->GetIsolate()->factory()->NewFixedArray(1, TENURED); | 569 code->GetIsolate()->factory()->NewFixedArray(1, TENURED); |
| 581 handler_table->set(0, Smi::FromInt(handler_offset_)); | 570 handler_table->set(0, Smi::FromInt(handler_offset_)); |
| 582 code->set_handler_table(*handler_table); | 571 code->set_handler_table(*handler_table); |
| 583 } | 572 } |
| 584 | 573 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 case DICTIONARY_ELEMENTS: | 664 case DICTIONARY_ELEMENTS: |
| 676 KeyedStoreStubCompiler::GenerateStoreDictionaryElement(masm); | 665 KeyedStoreStubCompiler::GenerateStoreDictionaryElement(masm); |
| 677 break; | 666 break; |
| 678 case SLOPPY_ARGUMENTS_ELEMENTS: | 667 case SLOPPY_ARGUMENTS_ELEMENTS: |
| 679 UNREACHABLE(); | 668 UNREACHABLE(); |
| 680 break; | 669 break; |
| 681 } | 670 } |
| 682 } | 671 } |
| 683 | 672 |
| 684 | 673 |
| 685 void ArgumentsAccessStub::PrintName(StringStream* stream) { | 674 void ArgumentsAccessStub::PrintName(OStream& os) const { // NOLINT |
| 686 stream->Add("ArgumentsAccessStub_"); | 675 os << "ArgumentsAccessStub_"; |
| 687 switch (type_) { | 676 switch (type_) { |
| 688 case READ_ELEMENT: stream->Add("ReadElement"); break; | 677 case READ_ELEMENT: |
| 689 case NEW_SLOPPY_FAST: stream->Add("NewSloppyFast"); break; | 678 os << "ReadElement"; |
| 690 case NEW_SLOPPY_SLOW: stream->Add("NewSloppySlow"); break; | 679 break; |
| 691 case NEW_STRICT: stream->Add("NewStrict"); break; | 680 case NEW_SLOPPY_FAST: |
| 681 os << "NewSloppyFast"; |
| 682 break; |
| 683 case NEW_SLOPPY_SLOW: |
| 684 os << "NewSloppySlow"; |
| 685 break; |
| 686 case NEW_STRICT: |
| 687 os << "NewStrict"; |
| 688 break; |
| 692 } | 689 } |
| 690 return; |
| 693 } | 691 } |
| 694 | 692 |
| 695 | 693 |
| 696 void CallFunctionStub::PrintName(StringStream* stream) { | 694 void CallFunctionStub::PrintName(OStream& os) const { // NOLINT |
| 697 stream->Add("CallFunctionStub_Args%d", argc_); | 695 os << "CallFunctionStub_Args" << argc_; |
| 698 } | 696 } |
| 699 | 697 |
| 700 | 698 |
| 701 void CallConstructStub::PrintName(StringStream* stream) { | 699 void CallConstructStub::PrintName(OStream& os) const { // NOLINT |
| 702 stream->Add("CallConstructStub"); | 700 os << "CallConstructStub"; |
| 703 if (RecordCallTarget()) stream->Add("_Recording"); | 701 if (RecordCallTarget()) os << "_Recording"; |
| 704 } | 702 } |
| 705 | 703 |
| 706 | 704 |
| 707 void ArrayConstructorStub::PrintName(StringStream* stream) { | 705 void ArrayConstructorStub::PrintName(OStream& os) const { // NOLINT |
| 708 stream->Add("ArrayConstructorStub"); | 706 os << "ArrayConstructorStub"; |
| 709 switch (argument_count_) { | 707 switch (argument_count_) { |
| 710 case ANY: stream->Add("_Any"); break; | 708 case ANY: |
| 711 case NONE: stream->Add("_None"); break; | 709 os << "_Any"; |
| 712 case ONE: stream->Add("_One"); break; | 710 break; |
| 713 case MORE_THAN_ONE: stream->Add("_More_Than_One"); break; | 711 case NONE: |
| 712 os << "_None"; |
| 713 break; |
| 714 case ONE: |
| 715 os << "_One"; |
| 716 break; |
| 717 case MORE_THAN_ONE: |
| 718 os << "_More_Than_One"; |
| 719 break; |
| 714 } | 720 } |
| 721 return; |
| 715 } | 722 } |
| 716 | 723 |
| 717 | 724 |
| 718 void ArrayConstructorStubBase::BasePrintName(const char* name, | 725 OStream& ArrayConstructorStubBase::BasePrintName(OStream& os, // NOLINT |
| 719 StringStream* stream) { | 726 const char* name) const { |
| 720 stream->Add(name); | 727 os << name << "_" << ElementsKindToString(elements_kind()); |
| 721 stream->Add("_"); | |
| 722 stream->Add(ElementsKindToString(elements_kind())); | |
| 723 if (override_mode() == DISABLE_ALLOCATION_SITES) { | 728 if (override_mode() == DISABLE_ALLOCATION_SITES) { |
| 724 stream->Add("_DISABLE_ALLOCATION_SITES"); | 729 os << "_DISABLE_ALLOCATION_SITES"; |
| 725 } | 730 } |
| 731 return os; |
| 726 } | 732 } |
| 727 | 733 |
| 728 | 734 |
| 729 bool ToBooleanStub::UpdateStatus(Handle<Object> object) { | 735 bool ToBooleanStub::UpdateStatus(Handle<Object> object) { |
| 730 Types old_types(types_); | 736 Types old_types(types_); |
| 731 bool to_boolean_value = types_.UpdateStatus(object); | 737 bool to_boolean_value = types_.UpdateStatus(object); |
| 732 TraceTransition(old_types, types_); | 738 TraceTransition(old_types, types_); |
| 733 return to_boolean_value; | 739 return to_boolean_value; |
| 734 } | 740 } |
| 735 | 741 |
| 736 | 742 |
| 737 void ToBooleanStub::PrintState(StringStream* stream) { | 743 void ToBooleanStub::PrintState(OStream& os) const { // NOLINT |
| 738 types_.Print(stream); | 744 os << types_; |
| 739 } | 745 } |
| 740 | 746 |
| 741 | 747 |
| 742 void ToBooleanStub::Types::Print(StringStream* stream) const { | 748 OStream& operator<<(OStream& os, const ToBooleanStub::Types& s) { |
| 743 stream->Add("("); | 749 os << "("; |
| 744 SimpleListPrinter printer(stream); | 750 SimpleListPrinter p(os); |
| 745 if (IsEmpty()) printer.Add("None"); | 751 if (s.IsEmpty()) p.Add("None"); |
| 746 if (Contains(UNDEFINED)) printer.Add("Undefined"); | 752 if (s.Contains(ToBooleanStub::UNDEFINED)) p.Add("Undefined"); |
| 747 if (Contains(BOOLEAN)) printer.Add("Bool"); | 753 if (s.Contains(ToBooleanStub::BOOLEAN)) p.Add("Bool"); |
| 748 if (Contains(NULL_TYPE)) printer.Add("Null"); | 754 if (s.Contains(ToBooleanStub::NULL_TYPE)) p.Add("Null"); |
| 749 if (Contains(SMI)) printer.Add("Smi"); | 755 if (s.Contains(ToBooleanStub::SMI)) p.Add("Smi"); |
| 750 if (Contains(SPEC_OBJECT)) printer.Add("SpecObject"); | 756 if (s.Contains(ToBooleanStub::SPEC_OBJECT)) p.Add("SpecObject"); |
| 751 if (Contains(STRING)) printer.Add("String"); | 757 if (s.Contains(ToBooleanStub::STRING)) p.Add("String"); |
| 752 if (Contains(SYMBOL)) printer.Add("Symbol"); | 758 if (s.Contains(ToBooleanStub::SYMBOL)) p.Add("Symbol"); |
| 753 if (Contains(HEAP_NUMBER)) printer.Add("HeapNumber"); | 759 if (s.Contains(ToBooleanStub::HEAP_NUMBER)) p.Add("HeapNumber"); |
| 754 stream->Add(")"); | 760 return os << ")"; |
| 755 } | 761 } |
| 756 | 762 |
| 757 | 763 |
| 758 bool ToBooleanStub::Types::UpdateStatus(Handle<Object> object) { | 764 bool ToBooleanStub::Types::UpdateStatus(Handle<Object> object) { |
| 759 if (object->IsUndefined()) { | 765 if (object->IsUndefined()) { |
| 760 Add(UNDEFINED); | 766 Add(UNDEFINED); |
| 761 return false; | 767 return false; |
| 762 } else if (object->IsBoolean()) { | 768 } else if (object->IsBoolean()) { |
| 763 Add(BOOLEAN); | 769 Add(BOOLEAN); |
| 764 return object->IsTrue(); | 770 return object->IsTrue(); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 InstallDescriptor(isolate, &stub3); | 940 InstallDescriptor(isolate, &stub3); |
| 935 } | 941 } |
| 936 | 942 |
| 937 InternalArrayConstructorStub::InternalArrayConstructorStub( | 943 InternalArrayConstructorStub::InternalArrayConstructorStub( |
| 938 Isolate* isolate) : PlatformCodeStub(isolate) { | 944 Isolate* isolate) : PlatformCodeStub(isolate) { |
| 939 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); | 945 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); |
| 940 } | 946 } |
| 941 | 947 |
| 942 | 948 |
| 943 } } // namespace v8::internal | 949 } } // namespace v8::internal |
| OLD | NEW |