Chromium Code Reviews| OLD | NEW | 
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright | 
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. | 
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above | 
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following | 
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided | 
| 11 // with the distribution. | 11 // with the distribution. | 
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 112 EAGER, | 112 EAGER, | 
| 113 LAZY, | 113 LAZY, | 
| 114 OSR, | 114 OSR, | 
| 115 // This last bailout type is not really a bailout, but used by the | 115 // This last bailout type is not really a bailout, but used by the | 
| 116 // debugger to deoptimize stack frames to allow inspection. | 116 // debugger to deoptimize stack frames to allow inspection. | 
| 117 DEBUGGER | 117 DEBUGGER | 
| 118 }; | 118 }; | 
| 119 | 119 | 
| 120 int output_count() const { return output_count_; } | 120 int output_count() const { return output_count_; } | 
| 121 | 121 | 
| 122 // Number of created JS frames. Not all created frames are necessarily JS. | |
| 123 int jsframe_count() const { return jsframe_count_; } | |
| 124 | |
| 122 static Deoptimizer* New(JSFunction* function, | 125 static Deoptimizer* New(JSFunction* function, | 
| 123 BailoutType type, | 126 BailoutType type, | 
| 124 unsigned bailout_id, | 127 unsigned bailout_id, | 
| 125 Address from, | 128 Address from, | 
| 126 int fp_to_sp_delta, | 129 int fp_to_sp_delta, | 
| 127 Isolate* isolate); | 130 Isolate* isolate); | 
| 128 static Deoptimizer* Grab(Isolate* isolate); | 131 static Deoptimizer* Grab(Isolate* isolate); | 
| 129 | 132 | 
| 130 #ifdef ENABLE_DEBUGGER_SUPPORT | 133 #ifdef ENABLE_DEBUGGER_SUPPORT | 
| 131 // The returned object with information on the optimized frame needs to be | 134 // The returned object with information on the optimized frame needs to be | 
| 132 // freed before another one can be generated. | 135 // freed before another one can be generated. | 
| 133 static DeoptimizedFrameInfo* DebuggerInspectableFrame(JavaScriptFrame* frame, | 136 static DeoptimizedFrameInfo* DebuggerInspectableFrame(JavaScriptFrame* frame, | 
| 134 int frame_index, | 137 int jsframe_index, | 
| 135 Isolate* isolate); | 138 Isolate* isolate); | 
| 136 static void DeleteDebuggerInspectableFrame(DeoptimizedFrameInfo* info, | 139 static void DeleteDebuggerInspectableFrame(DeoptimizedFrameInfo* info, | 
| 137 Isolate* isolate); | 140 Isolate* isolate); | 
| 138 #endif | 141 #endif | 
| 139 | 142 | 
| 140 // Makes sure that there is enough room in the relocation | 143 // Makes sure that there is enough room in the relocation | 
| 141 // information of a code object to perform lazy deoptimization | 144 // information of a code object to perform lazy deoptimization | 
| 142 // patching. If there is not enough room a new relocation | 145 // patching. If there is not enough room a new relocation | 
| 143 // information object is allocated and comments are added until it | 146 // information object is allocated and comments are added until it | 
| 144 // is big enough. | 147 // is big enough. | 
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 189 static void RevertStackCheckCodeAt(Code* unoptimized_code, | 192 static void RevertStackCheckCodeAt(Code* unoptimized_code, | 
| 190 Address pc_after, | 193 Address pc_after, | 
| 191 Code* check_code, | 194 Code* check_code, | 
| 192 Code* replacement_code); | 195 Code* replacement_code); | 
| 193 | 196 | 
| 194 ~Deoptimizer(); | 197 ~Deoptimizer(); | 
| 195 | 198 | 
| 196 void MaterializeHeapNumbers(); | 199 void MaterializeHeapNumbers(); | 
| 197 #ifdef ENABLE_DEBUGGER_SUPPORT | 200 #ifdef ENABLE_DEBUGGER_SUPPORT | 
| 198 void MaterializeHeapNumbersForDebuggerInspectableFrame( | 201 void MaterializeHeapNumbersForDebuggerInspectableFrame( | 
| 199 Address top, uint32_t size, DeoptimizedFrameInfo* info); | 202 Address parameters_top, | 
| 203 uint32_t parameters_size, | |
| 204 Address expressions_top, | |
| 205 uint32_t expressions_size, | |
| 206 DeoptimizedFrameInfo* info); | |
| 200 #endif | 207 #endif | 
| 201 | 208 | 
| 202 static void ComputeOutputFrames(Deoptimizer* deoptimizer); | 209 static void ComputeOutputFrames(Deoptimizer* deoptimizer); | 
| 203 | 210 | 
| 204 static Address GetDeoptimizationEntry(int id, BailoutType type); | 211 static Address GetDeoptimizationEntry(int id, BailoutType type); | 
| 205 static int GetDeoptimizationId(Address addr, BailoutType type); | 212 static int GetDeoptimizationId(Address addr, BailoutType type); | 
| 206 static int GetOutputInfo(DeoptimizationOutputData* data, | 213 static int GetOutputInfo(DeoptimizationOutputData* data, | 
| 207 unsigned node_id, | 214 unsigned node_id, | 
| 208 SharedFunctionInfo* shared); | 215 SharedFunctionInfo* shared); | 
| 209 | 216 | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 250 | 257 | 
| 251 protected: | 258 protected: | 
| 252 virtual void GeneratePrologue(); | 259 virtual void GeneratePrologue(); | 
| 253 | 260 | 
| 254 private: | 261 private: | 
| 255 int count() const { return count_; } | 262 int count() const { return count_; } | 
| 256 | 263 | 
| 257 int count_; | 264 int count_; | 
| 258 }; | 265 }; | 
| 259 | 266 | 
| 267 int ConvertJSFrameIndexToFrameIndex(int jsframe_index); | |
| 268 | |
| 260 private: | 269 private: | 
| 261 static const int kNumberOfEntries = 4096; | 270 static const int kNumberOfEntries = 4096; | 
| 262 | 271 | 
| 263 Deoptimizer(Isolate* isolate, | 272 Deoptimizer(Isolate* isolate, | 
| 264 JSFunction* function, | 273 JSFunction* function, | 
| 265 BailoutType type, | 274 BailoutType type, | 
| 266 unsigned bailout_id, | 275 unsigned bailout_id, | 
| 267 Address from, | 276 Address from, | 
| 268 int fp_to_sp_delta, | 277 int fp_to_sp_delta, | 
| 269 Code* optimized_code); | 278 Code* optimized_code); | 
| 270 void DeleteFrameDescriptions(); | 279 void DeleteFrameDescriptions(); | 
| 271 | 280 | 
| 272 void DoComputeOutputFrames(); | 281 void DoComputeOutputFrames(); | 
| 273 void DoComputeOsrOutputFrame(); | 282 void DoComputeOsrOutputFrame(); | 
| 274 void DoComputeFrame(TranslationIterator* iterator, int frame_index); | 283 void DoComputeJSFrame(TranslationIterator* iterator, int frame_index); | 
| 284 void DoComputeArgumentsAdaptorFrame(TranslationIterator* iterator, | |
| 285 int frame_index); | |
| 275 void DoTranslateCommand(TranslationIterator* iterator, | 286 void DoTranslateCommand(TranslationIterator* iterator, | 
| 276 int frame_index, | 287 int frame_index, | 
| 277 unsigned output_offset); | 288 unsigned output_offset); | 
| 278 // Translate a command for OSR. Updates the input offset to be used for | 289 // Translate a command for OSR. Updates the input offset to be used for | 
| 279 // the next command. Returns false if translation of the command failed | 290 // the next command. Returns false if translation of the command failed | 
| 280 // (e.g., a number conversion failed) and may or may not have updated the | 291 // (e.g., a number conversion failed) and may or may not have updated the | 
| 281 // input offset. | 292 // input offset. | 
| 282 bool DoOsrTranslateCommand(TranslationIterator* iterator, | 293 bool DoOsrTranslateCommand(TranslationIterator* iterator, | 
| 283 int* input_offset); | 294 int* input_offset); | 
| 284 | 295 | 
| (...skipping 27 matching lines...) Expand all Loading... | |
| 312 Code* optimized_code_; | 323 Code* optimized_code_; | 
| 313 unsigned bailout_id_; | 324 unsigned bailout_id_; | 
| 314 BailoutType bailout_type_; | 325 BailoutType bailout_type_; | 
| 315 Address from_; | 326 Address from_; | 
| 316 int fp_to_sp_delta_; | 327 int fp_to_sp_delta_; | 
| 317 | 328 | 
| 318 // Input frame description. | 329 // Input frame description. | 
| 319 FrameDescription* input_; | 330 FrameDescription* input_; | 
| 320 // Number of output frames. | 331 // Number of output frames. | 
| 321 int output_count_; | 332 int output_count_; | 
| 333 // Number of output js frames. | |
| 334 int jsframe_count_; | |
| 322 // Array of output frame descriptions. | 335 // Array of output frame descriptions. | 
| 323 FrameDescription** output_; | 336 FrameDescription** output_; | 
| 324 | 337 | 
| 325 // Frames can be dynamically padded on ia32 to align untagged doubles. | 338 // Frames can be dynamically padded on ia32 to align untagged doubles. | 
| 326 Object* frame_alignment_marker_; | 339 Object* frame_alignment_marker_; | 
| 327 intptr_t has_alignment_padding_; | 340 intptr_t has_alignment_padding_; | 
| 328 | 341 | 
| 329 List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_; | 342 List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_; | 
| 330 | 343 | 
| 331 static const int table_entry_size_; | 344 static const int table_entry_size_; | 
| (...skipping 23 matching lines...) Expand all Loading... | |
| 355 free(description); | 368 free(description); | 
| 356 } | 369 } | 
| 357 | 370 | 
| 358 uint32_t GetFrameSize() const { | 371 uint32_t GetFrameSize() const { | 
| 359 ASSERT(static_cast<uint32_t>(frame_size_) == frame_size_); | 372 ASSERT(static_cast<uint32_t>(frame_size_) == frame_size_); | 
| 360 return static_cast<uint32_t>(frame_size_); | 373 return static_cast<uint32_t>(frame_size_); | 
| 361 } | 374 } | 
| 362 | 375 | 
| 363 JSFunction* GetFunction() const { return function_; } | 376 JSFunction* GetFunction() const { return function_; } | 
| 364 | 377 | 
| 365 unsigned GetOffsetFromSlotIndex(Deoptimizer* deoptimizer, int slot_index); | 378 unsigned GetOffsetFromSlotIndex(int slot_index); | 
| 366 | 379 | 
| 367 intptr_t GetFrameSlot(unsigned offset) { | 380 intptr_t GetFrameSlot(unsigned offset) { | 
| 368 return *GetFrameSlotPointer(offset); | 381 return *GetFrameSlotPointer(offset); | 
| 369 } | 382 } | 
| 370 | 383 | 
| 371 double GetDoubleFrameSlot(unsigned offset) { | 384 double GetDoubleFrameSlot(unsigned offset) { | 
| 372 intptr_t* ptr = GetFrameSlotPointer(offset); | 385 intptr_t* ptr = GetFrameSlotPointer(offset); | 
| 373 #if V8_TARGET_ARCH_MIPS | 386 #if V8_TARGET_ARCH_MIPS | 
| 374 // Prevent gcc from using load-double (mips ldc1) on (possibly) | 387 // Prevent gcc from using load-double (mips ldc1) on (possibly) | 
| 375 // non-64-bit aligned double. Uses two lwc1 instructions. | 388 // non-64-bit aligned double. Uses two lwc1 instructions. | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 416 void SetPc(intptr_t pc) { pc_ = pc; } | 429 void SetPc(intptr_t pc) { pc_ = pc; } | 
| 417 | 430 | 
| 418 intptr_t GetFp() const { return fp_; } | 431 intptr_t GetFp() const { return fp_; } | 
| 419 void SetFp(intptr_t fp) { fp_ = fp; } | 432 void SetFp(intptr_t fp) { fp_ = fp; } | 
| 420 | 433 | 
| 421 Smi* GetState() const { return state_; } | 434 Smi* GetState() const { return state_; } | 
| 422 void SetState(Smi* state) { state_ = state; } | 435 void SetState(Smi* state) { state_ = state; } | 
| 423 | 436 | 
| 424 void SetContinuation(intptr_t pc) { continuation_ = pc; } | 437 void SetContinuation(intptr_t pc) { continuation_ = pc; } | 
| 425 | 438 | 
| 439 StackFrame::Type GetType() const { return type_; } | |
| 
 
Kevin Millikin (Chromium)
2012/01/24 00:08:54
Type and Kind are too generic (kind was before).
 
Vyacheslav Egorov (Chromium)
2012/01/24 08:49:20
Done.
 
 | |
| 440 void SetType(StackFrame::Type type) { type_ = type; } | |
| 441 | |
| 426 #ifdef DEBUG | 442 #ifdef DEBUG | 
| 427 Code::Kind GetKind() const { return kind_; } | 443 Code::Kind GetKind() const { return kind_; } | 
| 428 void SetKind(Code::Kind kind) { kind_ = kind; } | 444 void SetKind(Code::Kind kind) { kind_ = kind; } | 
| 429 #endif | 445 #endif | 
| 430 | 446 | 
| 431 // Get the incoming arguments count. | 447 // Get the incoming arguments count. | 
| 432 int ComputeParametersCount(); | 448 int ComputeParametersCount(); | 
| 433 | 449 | 
| 434 // Get a parameter value for an unoptimized frame. | 450 // Get a parameter value for an unoptimized frame. | 
| 435 Object* GetParameter(Deoptimizer* deoptimizer, int index); | 451 Object* GetParameter(int index); | 
| 436 | 452 | 
| 437 // Get the expression stack height for a unoptimized frame. | 453 // Get the expression stack height for a unoptimized frame. | 
| 438 unsigned GetExpressionCount(Deoptimizer* deoptimizer); | 454 unsigned GetExpressionCount(); | 
| 439 | 455 | 
| 440 // Get the expression stack value for an unoptimized frame. | 456 // Get the expression stack value for an unoptimized frame. | 
| 441 Object* GetExpression(Deoptimizer* deoptimizer, int index); | 457 Object* GetExpression(int index); | 
| 442 | 458 | 
| 443 static int registers_offset() { | 459 static int registers_offset() { | 
| 444 return OFFSET_OF(FrameDescription, registers_); | 460 return OFFSET_OF(FrameDescription, registers_); | 
| 445 } | 461 } | 
| 446 | 462 | 
| 447 static int double_registers_offset() { | 463 static int double_registers_offset() { | 
| 448 return OFFSET_OF(FrameDescription, double_registers_); | 464 return OFFSET_OF(FrameDescription, double_registers_); | 
| 449 } | 465 } | 
| 450 | 466 | 
| 451 static int frame_size_offset() { | 467 static int frame_size_offset() { | 
| (...skipping 22 matching lines...) Expand all Loading... | |
| 474 // Frame_size_ must hold a uint32_t value. It is only a uintptr_t to | 490 // Frame_size_ must hold a uint32_t value. It is only a uintptr_t to | 
| 475 // keep the variable-size array frame_content_ of type intptr_t at | 491 // keep the variable-size array frame_content_ of type intptr_t at | 
| 476 // the end of the structure aligned. | 492 // the end of the structure aligned. | 
| 477 uintptr_t frame_size_; // Number of bytes. | 493 uintptr_t frame_size_; // Number of bytes. | 
| 478 JSFunction* function_; | 494 JSFunction* function_; | 
| 479 intptr_t registers_[Register::kNumRegisters]; | 495 intptr_t registers_[Register::kNumRegisters]; | 
| 480 double double_registers_[DoubleRegister::kNumAllocatableRegisters]; | 496 double double_registers_[DoubleRegister::kNumAllocatableRegisters]; | 
| 481 intptr_t top_; | 497 intptr_t top_; | 
| 482 intptr_t pc_; | 498 intptr_t pc_; | 
| 483 intptr_t fp_; | 499 intptr_t fp_; | 
| 500 StackFrame::Type type_; | |
| 484 Smi* state_; | 501 Smi* state_; | 
| 485 #ifdef DEBUG | 502 #ifdef DEBUG | 
| 486 Code::Kind kind_; | 503 Code::Kind kind_; | 
| 487 #endif | 504 #endif | 
| 488 | 505 | 
| 489 // Continuation is the PC where the execution continues after | 506 // Continuation is the PC where the execution continues after | 
| 490 // deoptimizing. | 507 // deoptimizing. | 
| 491 intptr_t continuation_; | 508 intptr_t continuation_; | 
| 492 | 509 | 
| 493 // This must be at the end of the object as the object is allocated larger | 510 // This must be at the end of the object as the object is allocated larger | 
| 494 // than it's definition indicate to extend this array. | 511 // than it's definition indicate to extend this array. | 
| 495 intptr_t frame_content_[1]; | 512 intptr_t frame_content_[1]; | 
| 496 | 513 | 
| 497 intptr_t* GetFrameSlotPointer(unsigned offset) { | 514 intptr_t* GetFrameSlotPointer(unsigned offset) { | 
| 498 ASSERT(offset < frame_size_); | 515 ASSERT(offset < frame_size_); | 
| 499 return reinterpret_cast<intptr_t*>( | 516 return reinterpret_cast<intptr_t*>( | 
| 500 reinterpret_cast<Address>(this) + frame_content_offset() + offset); | 517 reinterpret_cast<Address>(this) + frame_content_offset() + offset); | 
| 501 } | 518 } | 
| 519 | |
| 520 int ComputeFixedSize(); | |
| 502 }; | 521 }; | 
| 503 | 522 | 
| 504 | 523 | 
| 505 class TranslationBuffer BASE_EMBEDDED { | 524 class TranslationBuffer BASE_EMBEDDED { | 
| 506 public: | 525 public: | 
| 507 TranslationBuffer() : contents_(256) { } | 526 TranslationBuffer() : contents_(256) { } | 
| 508 | 527 | 
| 509 int CurrentIndex() const { return contents_.length(); } | 528 int CurrentIndex() const { return contents_.length(); } | 
| 510 void Add(int32_t value); | 529 void Add(int32_t value); | 
| 511 | 530 | 
| (...skipping 22 matching lines...) Expand all Loading... | |
| 534 private: | 553 private: | 
| 535 ByteArray* buffer_; | 554 ByteArray* buffer_; | 
| 536 int index_; | 555 int index_; | 
| 537 }; | 556 }; | 
| 538 | 557 | 
| 539 | 558 | 
| 540 class Translation BASE_EMBEDDED { | 559 class Translation BASE_EMBEDDED { | 
| 541 public: | 560 public: | 
| 542 enum Opcode { | 561 enum Opcode { | 
| 543 BEGIN, | 562 BEGIN, | 
| 544 FRAME, | 563 JS_FRAME, | 
| 564 ARGUMENTS_ADAPTOR_FRAME, | |
| 545 REGISTER, | 565 REGISTER, | 
| 546 INT32_REGISTER, | 566 INT32_REGISTER, | 
| 547 DOUBLE_REGISTER, | 567 DOUBLE_REGISTER, | 
| 548 STACK_SLOT, | 568 STACK_SLOT, | 
| 549 INT32_STACK_SLOT, | 569 INT32_STACK_SLOT, | 
| 550 DOUBLE_STACK_SLOT, | 570 DOUBLE_STACK_SLOT, | 
| 551 LITERAL, | 571 LITERAL, | 
| 552 ARGUMENTS_OBJECT, | 572 ARGUMENTS_OBJECT, | 
| 553 | 573 | 
| 554 // A prefix indicating that the next command is a duplicate of the one | 574 // A prefix indicating that the next command is a duplicate of the one | 
| 555 // that follows it. | 575 // that follows it. | 
| 556 DUPLICATE | 576 DUPLICATE | 
| 557 }; | 577 }; | 
| 558 | 578 | 
| 559 Translation(TranslationBuffer* buffer, int frame_count) | 579 Translation(TranslationBuffer* buffer, int frame_count, int jsframe_count) | 
| 560 : buffer_(buffer), | 580 : buffer_(buffer), | 
| 561 index_(buffer->CurrentIndex()) { | 581 index_(buffer->CurrentIndex()) { | 
| 562 buffer_->Add(BEGIN); | 582 buffer_->Add(BEGIN); | 
| 563 buffer_->Add(frame_count); | 583 buffer_->Add(frame_count); | 
| 584 buffer_->Add(jsframe_count); | |
| 564 } | 585 } | 
| 565 | 586 | 
| 566 int index() const { return index_; } | 587 int index() const { return index_; } | 
| 567 | 588 | 
| 568 // Commands. | 589 // Commands. | 
| 569 void BeginFrame(int node_id, int literal_id, unsigned height); | 590 void BeginJSFrame(int node_id, int literal_id, unsigned height); | 
| 591 void BeginArgumentsAdaptorFrame(int literal_id, unsigned height); | |
| 570 void StoreRegister(Register reg); | 592 void StoreRegister(Register reg); | 
| 571 void StoreInt32Register(Register reg); | 593 void StoreInt32Register(Register reg); | 
| 572 void StoreDoubleRegister(DoubleRegister reg); | 594 void StoreDoubleRegister(DoubleRegister reg); | 
| 573 void StoreStackSlot(int index); | 595 void StoreStackSlot(int index); | 
| 574 void StoreInt32StackSlot(int index); | 596 void StoreInt32StackSlot(int index); | 
| 575 void StoreDoubleStackSlot(int index); | 597 void StoreDoubleStackSlot(int index); | 
| 576 void StoreLiteral(int literal_id); | 598 void StoreLiteral(int literal_id); | 
| 577 void StoreArgumentsObject(); | 599 void StoreArgumentsObject(); | 
| 578 void MarkDuplicate(); | 600 void MarkDuplicate(); | 
| 579 | 601 | 
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 649 | 671 | 
| 650 case LITERAL: | 672 case LITERAL: | 
| 651 return literal_; | 673 return literal_; | 
| 652 | 674 | 
| 653 default: | 675 default: | 
| 654 UNREACHABLE(); | 676 UNREACHABLE(); | 
| 655 return Handle<Object>::null(); | 677 return Handle<Object>::null(); | 
| 656 } | 678 } | 
| 657 } | 679 } | 
| 658 | 680 | 
| 659 static void ComputeSlotMappingForArguments(JavaScriptFrame* frame, | 681 static Vector<SlotRef> ComputeSlotMappingForArguments( | 
| 660 int inlined_frame_index, | 682 JavaScriptFrame* frame, | 
| 661 Vector<SlotRef>* args_slots); | 683 int inlined_frame_index, | 
| 684 int formal_parameter_count); | |
| 662 | 685 | 
| 663 private: | 686 private: | 
| 664 Address addr_; | 687 Address addr_; | 
| 665 Handle<Object> literal_; | 688 Handle<Object> literal_; | 
| 666 SlotRepresentation representation_; | 689 SlotRepresentation representation_; | 
| 667 | 690 | 
| 668 static Address SlotAddress(JavaScriptFrame* frame, int slot_index) { | 691 static Address SlotAddress(JavaScriptFrame* frame, int slot_index) { | 
| 669 if (slot_index >= 0) { | 692 if (slot_index >= 0) { | 
| 670 const int offset = JavaScriptFrameConstants::kLocal0Offset; | 693 const int offset = JavaScriptFrameConstants::kLocal0Offset; | 
| 671 return frame->fp() + offset - (slot_index * kPointerSize); | 694 return frame->fp() + offset - (slot_index * kPointerSize); | 
| 672 } else { | 695 } else { | 
| 673 const int offset = JavaScriptFrameConstants::kLastParameterOffset; | 696 const int offset = JavaScriptFrameConstants::kLastParameterOffset; | 
| 674 return frame->fp() + offset - ((slot_index + 1) * kPointerSize); | 697 return frame->fp() + offset - ((slot_index + 1) * kPointerSize); | 
| 675 } | 698 } | 
| 676 } | 699 } | 
| 677 | 700 | 
| 678 static SlotRef ComputeSlotForNextArgument(TranslationIterator* iterator, | 701 static SlotRef ComputeSlotForNextArgument(TranslationIterator* iterator, | 
| 679 DeoptimizationInputData* data, | 702 DeoptimizationInputData* data, | 
| 680 JavaScriptFrame* frame); | 703 JavaScriptFrame* frame); | 
| 704 | |
| 705 static void ComputeSlotsForArguments( | |
| 706 Vector<SlotRef>* args_slots, | |
| 707 TranslationIterator* iterator, | |
| 708 DeoptimizationInputData* data, | |
| 709 JavaScriptFrame* frame); | |
| 681 }; | 710 }; | 
| 682 | 711 | 
| 683 | 712 | 
| 684 #ifdef ENABLE_DEBUGGER_SUPPORT | 713 #ifdef ENABLE_DEBUGGER_SUPPORT | 
| 685 // Class used to represent an unoptimized frame when the debugger | 714 // Class used to represent an unoptimized frame when the debugger | 
| 686 // needs to inspect a frame that is part of an optimized frame. The | 715 // needs to inspect a frame that is part of an optimized frame. The | 
| 687 // internally used FrameDescription objects are not GC safe so for use | 716 // internally used FrameDescription objects are not GC safe so for use | 
| 688 // by the debugger frame information is copied to an object of this type. | 717 // by the debugger frame information is copied to an object of this type. | 
| 718 // Represents parameters in unadapted form so their number might mismatch | |
| 719 // formal parameter count. | |
| 689 class DeoptimizedFrameInfo : public Malloced { | 720 class DeoptimizedFrameInfo : public Malloced { | 
| 690 public: | 721 public: | 
| 691 DeoptimizedFrameInfo(Deoptimizer* deoptimizer, int frame_index); | 722 DeoptimizedFrameInfo(Deoptimizer* deoptimizer, | 
| 723 int frame_index, | |
| 724 bool has_arguments_adaptor); | |
| 692 virtual ~DeoptimizedFrameInfo(); | 725 virtual ~DeoptimizedFrameInfo(); | 
| 693 | 726 | 
| 694 // GC support. | 727 // GC support. | 
| 695 void Iterate(ObjectVisitor* v); | 728 void Iterate(ObjectVisitor* v); | 
| 696 | 729 | 
| 697 // Return the number of incoming arguments. | 730 // Return the number of incoming arguments. | 
| 698 int parameters_count() { return parameters_count_; } | 731 int parameters_count() { return parameters_count_; } | 
| 699 | 732 | 
| 700 // Return the height of the expression stack. | 733 // Return the height of the expression stack. | 
| 701 int expression_count() { return expression_count_; } | 734 int expression_count() { return expression_count_; } | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 741 Object** parameters_; | 774 Object** parameters_; | 
| 742 Object** expression_stack_; | 775 Object** expression_stack_; | 
| 743 | 776 | 
| 744 friend class Deoptimizer; | 777 friend class Deoptimizer; | 
| 745 }; | 778 }; | 
| 746 #endif | 779 #endif | 
| 747 | 780 | 
| 748 } } // namespace v8::internal | 781 } } // namespace v8::internal | 
| 749 | 782 | 
| 750 #endif // V8_DEOPTIMIZER_H_ | 783 #endif // V8_DEOPTIMIZER_H_ | 
| OLD | NEW |