Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1505)

Side by Side Diff: runtime/vm/deopt_instructions.cc

Issue 11833025: Fix for issue 7757 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/deopt_instructions.h ('k') | runtime/vm/exceptions.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/deopt_instructions.h" 5 #include "vm/deopt_instructions.h"
6 6
7 #include "vm/assembler_macros.h" 7 #include "vm/assembler_macros.h"
8 #include "vm/code_patcher.h" 8 #include "vm/code_patcher.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 #include "vm/locations.h" 10 #include "vm/locations.h"
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) { 202 void Execute(DeoptimizationContext* deopt_context, intptr_t to_index) {
203 Function& function = Function::Handle(deopt_context->isolate()); 203 Function& function = Function::Handle(deopt_context->isolate());
204 function ^= deopt_context->ObjectAt(object_table_index_); 204 function ^= deopt_context->ObjectAt(object_table_index_);
205 const Code& code = 205 const Code& code =
206 Code::Handle(deopt_context->isolate(), function.unoptimized_code()); 206 Code::Handle(deopt_context->isolate(), function.unoptimized_code());
207 uword continue_at_pc = code.GetDeoptAfterPcAtDeoptId(deopt_id_); 207 uword continue_at_pc = code.GetDeoptAfterPcAtDeoptId(deopt_id_);
208 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index); 208 intptr_t* to_addr = deopt_context->GetToFrameAddressAt(to_index);
209 *to_addr = continue_at_pc; 209 *to_addr = continue_at_pc;
210 } 210 }
211 211
212 static void GetEncodedValues(intptr_t from_index,
213 intptr_t* object_table_index,
214 intptr_t* deopt_id) {
215 *object_table_index = ObjectTableIndex::decode(from_index);
216 *deopt_id = DeoptId::decode(from_index);
217 }
218
212 private: 219 private:
213 static const intptr_t kFieldWidth = kBitsPerWord / 2; 220 static const intptr_t kFieldWidth = kBitsPerWord / 2;
214 class ObjectTableIndex : public BitField<intptr_t, 0, kFieldWidth> { }; 221 class ObjectTableIndex : public BitField<intptr_t, 0, kFieldWidth> { };
215 class DeoptId : public BitField<intptr_t, kFieldWidth, kFieldWidth> { }; 222 class DeoptId : public BitField<intptr_t, kFieldWidth, kFieldWidth> { };
216 223
217 const intptr_t object_table_index_; 224 const intptr_t object_table_index_;
218 const intptr_t deopt_id_; 225 const intptr_t deopt_id_;
219 226
220 DISALLOW_COPY_AND_ASSIGN(DeoptRetAfterAddressInstr); 227 DISALLOW_COPY_AND_ASSIGN(DeoptRetAfterAddressInstr);
221 }; 228 };
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
556 DISALLOW_COPY_AND_ASSIGN(DeoptSuffixInstr); 563 DISALLOW_COPY_AND_ASSIGN(DeoptSuffixInstr);
557 }; 564 };
558 565
559 566
560 intptr_t DeoptInstr::DecodeSuffix(intptr_t from_index, intptr_t* info_number) { 567 intptr_t DeoptInstr::DecodeSuffix(intptr_t from_index, intptr_t* info_number) {
561 *info_number = DeoptSuffixInstr::InfoNumber::decode(from_index); 568 *info_number = DeoptSuffixInstr::InfoNumber::decode(from_index);
562 return DeoptSuffixInstr::SuffixLength::decode(from_index); 569 return DeoptSuffixInstr::SuffixLength::decode(from_index);
563 } 570 }
564 571
565 572
573 uword DeoptInstr::GetRetAfterAddress(intptr_t from_index,
574 const Array& object_table,
575 Function* func) {
576 ASSERT(!object_table.IsNull());
577 ASSERT(func != NULL);
578 intptr_t object_table_index;
579 intptr_t deopt_id;
580 DeoptRetAfterAddressInstr::GetEncodedValues(from_index,
581 &object_table_index,
582 &deopt_id);
583 *func ^= object_table.At(object_table_index);
584 const Code& code = Code::Handle(func->unoptimized_code());
585 return code.GetDeoptAfterPcAtDeoptId(deopt_id);
586 }
587
588
566 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) { 589 DeoptInstr* DeoptInstr::Create(intptr_t kind_as_int, intptr_t from_index) {
567 Kind kind = static_cast<Kind>(kind_as_int); 590 Kind kind = static_cast<Kind>(kind_as_int);
568 switch (kind) { 591 switch (kind) {
569 case kStackSlot: return new DeoptStackSlotInstr(from_index); 592 case kStackSlot: return new DeoptStackSlotInstr(from_index);
570 case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(from_index); 593 case kDoubleStackSlot: return new DeoptDoubleStackSlotInstr(from_index);
571 case kInt64StackSlot: return new DeoptInt64StackSlotInstr(from_index); 594 case kInt64StackSlot: return new DeoptInt64StackSlotInstr(from_index);
572 case kRetAfterAddress: return new DeoptRetAfterAddressInstr(from_index); 595 case kRetAfterAddress: return new DeoptRetAfterAddressInstr(from_index);
573 case kRetBeforeAddress: return new DeoptRetBeforeAddressInstr(from_index); 596 case kRetBeforeAddress: return new DeoptRetBeforeAddressInstr(from_index);
574 case kConstant: return new DeoptConstantInstr(from_index); 597 case kConstant: return new DeoptConstantInstr(from_index);
575 case kRegister: return new DeoptRegisterInstr(from_index); 598 case kRegister: return new DeoptRegisterInstr(from_index);
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after
794 Smi* offset, 817 Smi* offset,
795 DeoptInfo* info, 818 DeoptInfo* info,
796 Smi* reason) { 819 Smi* reason) {
797 intptr_t i = index * kEntrySize; 820 intptr_t i = index * kEntrySize;
798 *offset ^= table.At(i); 821 *offset ^= table.At(i);
799 *info ^= table.At(i + 1); 822 *info ^= table.At(i + 1);
800 *reason ^= table.At(i + 2); 823 *reason ^= table.At(i + 2);
801 } 824 }
802 825
803 } // namespace dart 826 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/deopt_instructions.h ('k') | runtime/vm/exceptions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698