| 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/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/api.h" | 8 #include "src/api.h" |
| 9 #include "src/arguments.h" | 9 #include "src/arguments.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1338 ASSIGN_RETURN_ON_EXCEPTION( | 1338 ASSIGN_RETURN_ON_EXCEPTION( |
| 1339 isolate(), | 1339 isolate(), |
| 1340 result, | 1340 result, |
| 1341 JSReceiver::SetProperty( | 1341 JSReceiver::SetProperty( |
| 1342 receiver, name, value, NONE, strict_mode(), store_mode), | 1342 receiver, name, value, NONE, strict_mode(), store_mode), |
| 1343 Object); | 1343 Object); |
| 1344 return result; | 1344 return result; |
| 1345 } | 1345 } |
| 1346 | 1346 |
| 1347 | 1347 |
| 1348 void CallIC::State::Print(StringStream* stream) const { | 1348 OStream& operator<<(OStream& os, const CallIC::State& s) { |
| 1349 stream->Add("(args(%d), ", | 1349 return os << "(args(" << s.arg_count() << "), " |
| 1350 argc_); | 1350 << (s.call_type() == CallIC::METHOD ? "METHOD" : "FUNCTION") |
| 1351 stream->Add("%s, ", | 1351 << ", "; |
| 1352 call_type_ == CallIC::METHOD ? "METHOD" : "FUNCTION"); | |
| 1353 } | 1352 } |
| 1354 | 1353 |
| 1355 | 1354 |
| 1356 Handle<Code> CallIC::initialize_stub(Isolate* isolate, | 1355 Handle<Code> CallIC::initialize_stub(Isolate* isolate, |
| 1357 int argc, | 1356 int argc, |
| 1358 CallType call_type) { | 1357 CallType call_type) { |
| 1359 CallICStub stub(isolate, State(argc, call_type)); | 1358 CallICStub stub(isolate, State(argc, call_type)); |
| 1360 Handle<Code> code = stub.GetCode(); | 1359 Handle<Code> code = stub.GetCode(); |
| 1361 return code; | 1360 return code; |
| 1362 } | 1361 } |
| (...skipping 1093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2456 } else if (result_kind == GENERIC && op_ == Token::ADD) { | 2455 } else if (result_kind == GENERIC && op_ == Token::ADD) { |
| 2457 return Type::Union(Type::Number(zone), Type::String(zone), zone); | 2456 return Type::Union(Type::Number(zone), Type::String(zone), zone); |
| 2458 } else if (result_kind == NUMBER && op_ == Token::SHR) { | 2457 } else if (result_kind == NUMBER && op_ == Token::SHR) { |
| 2459 return Type::Unsigned32(zone); | 2458 return Type::Unsigned32(zone); |
| 2460 } | 2459 } |
| 2461 ASSERT_NE(GENERIC, result_kind); | 2460 ASSERT_NE(GENERIC, result_kind); |
| 2462 return KindToType(result_kind, zone); | 2461 return KindToType(result_kind, zone); |
| 2463 } | 2462 } |
| 2464 | 2463 |
| 2465 | 2464 |
| 2466 void BinaryOpIC::State::Print(StringStream* stream) const { | 2465 OStream& operator<<(OStream& os, const BinaryOpIC::State& s) { |
| 2467 stream->Add("(%s", Token::Name(op_)); | 2466 os << "(" << Token::Name(s.op_); |
| 2468 if (mode_ == OVERWRITE_LEFT) stream->Add("_ReuseLeft"); | 2467 if (s.mode_ == OVERWRITE_LEFT) |
| 2469 else if (mode_ == OVERWRITE_RIGHT) stream->Add("_ReuseRight"); | 2468 os << "_ReuseLeft"; |
| 2470 if (CouldCreateAllocationMementos()) stream->Add("_CreateAllocationMementos"); | 2469 else if (s.mode_ == OVERWRITE_RIGHT) |
| 2471 stream->Add(":%s*", KindToString(left_kind_)); | 2470 os << "_ReuseRight"; |
| 2472 if (fixed_right_arg_.has_value) { | 2471 if (s.CouldCreateAllocationMementos()) os << "_CreateAllocationMementos"; |
| 2473 stream->Add("%d", fixed_right_arg_.value); | 2472 os << ":" << BinaryOpIC::State::KindToString(s.left_kind_) << "*"; |
| 2473 if (s.fixed_right_arg_.has_value) { |
| 2474 os << s.fixed_right_arg_.value; |
| 2474 } else { | 2475 } else { |
| 2475 stream->Add("%s", KindToString(right_kind_)); | 2476 os << BinaryOpIC::State::KindToString(s.right_kind_); |
| 2476 } | 2477 } |
| 2477 stream->Add("->%s)", KindToString(result_kind_)); | 2478 return os << "->" << BinaryOpIC::State::KindToString(s.result_kind_) << ")"; |
| 2478 } | 2479 } |
| 2479 | 2480 |
| 2480 | 2481 |
| 2481 void BinaryOpIC::State::Update(Handle<Object> left, | 2482 void BinaryOpIC::State::Update(Handle<Object> left, |
| 2482 Handle<Object> right, | 2483 Handle<Object> right, |
| 2483 Handle<Object> result) { | 2484 Handle<Object> result) { |
| 2484 ExtraICState old_extra_ic_state = GetExtraICState(); | 2485 ExtraICState old_extra_ic_state = GetExtraICState(); |
| 2485 | 2486 |
| 2486 left_kind_ = UpdateKind(left, left_kind_); | 2487 left_kind_ = UpdateKind(left, left_kind_); |
| 2487 right_kind_ = UpdateKind(right, right_kind_); | 2488 right_kind_ = UpdateKind(right, right_kind_); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2641 // Install the generic stub. | 2642 // Install the generic stub. |
| 2642 BinaryOpICStub stub(isolate(), state); | 2643 BinaryOpICStub stub(isolate(), state); |
| 2643 target = stub.GetCode(); | 2644 target = stub.GetCode(); |
| 2644 | 2645 |
| 2645 // Sanity check the generic stub. | 2646 // Sanity check the generic stub. |
| 2646 ASSERT_EQ(NULL, target->FindFirstAllocationSite()); | 2647 ASSERT_EQ(NULL, target->FindFirstAllocationSite()); |
| 2647 } | 2648 } |
| 2648 set_target(*target); | 2649 set_target(*target); |
| 2649 | 2650 |
| 2650 if (FLAG_trace_ic) { | 2651 if (FLAG_trace_ic) { |
| 2651 char buffer[150]; | 2652 OFStream os(stdout); |
| 2652 NoAllocationStringAllocator allocator( | 2653 os << "[BinaryOpIC" << old_state << " => " << state << " @ " |
| 2653 buffer, static_cast<unsigned>(sizeof(buffer))); | 2654 << static_cast<void*>(*target) << " <- "; |
| 2654 StringStream stream(&allocator); | |
| 2655 stream.Add("[BinaryOpIC"); | |
| 2656 old_state.Print(&stream); | |
| 2657 stream.Add(" => "); | |
| 2658 state.Print(&stream); | |
| 2659 stream.Add(" @ %p <- ", static_cast<void*>(*target)); | |
| 2660 stream.OutputToStdOut(); | |
| 2661 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); | 2655 JavaScriptFrame::PrintTop(isolate(), stdout, false, true); |
| 2662 if (!allocation_site.is_null()) { | 2656 if (!allocation_site.is_null()) { |
| 2663 PrintF(" using allocation site %p", static_cast<void*>(*allocation_site)); | 2657 os << " using allocation site " << static_cast<void*>(*allocation_site); |
| 2664 } | 2658 } |
| 2665 PrintF("]\n"); | 2659 os << "]" << endl; |
| 2666 } | 2660 } |
| 2667 | 2661 |
| 2668 // Patch the inlined smi code as necessary. | 2662 // Patch the inlined smi code as necessary. |
| 2669 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { | 2663 if (!old_state.UseInlinedSmiCode() && state.UseInlinedSmiCode()) { |
| 2670 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); | 2664 PatchInlinedSmiCode(address(), ENABLE_INLINED_SMI_CHECK); |
| 2671 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { | 2665 } else if (old_state.UseInlinedSmiCode() && !state.UseInlinedSmiCode()) { |
| 2672 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); | 2666 PatchInlinedSmiCode(address(), DISABLE_INLINED_SMI_CHECK); |
| 2673 } | 2667 } |
| 2674 | 2668 |
| 2675 return result; | 2669 return result; |
| (...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3079 #undef ADDR | 3073 #undef ADDR |
| 3080 }; | 3074 }; |
| 3081 | 3075 |
| 3082 | 3076 |
| 3083 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 3077 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 3084 return IC_utilities[id]; | 3078 return IC_utilities[id]; |
| 3085 } | 3079 } |
| 3086 | 3080 |
| 3087 | 3081 |
| 3088 } } // namespace v8::internal | 3082 } } // namespace v8::internal |
| OLD | NEW |