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 |