OLD | NEW |
1 // Copyright 2012 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 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 double value() const { return val_; } | 70 double value() const { return val_; } |
71 | 71 |
72 private: | 72 private: |
73 Address slot_address_; | 73 Address slot_address_; |
74 double val_; | 74 double val_; |
75 }; | 75 }; |
76 | 76 |
77 | 77 |
78 class ObjectMaterializationDescriptor BASE_EMBEDDED { | 78 class ObjectMaterializationDescriptor BASE_EMBEDDED { |
79 public: | 79 public: |
80 ObjectMaterializationDescriptor(Address slot_address, int length) | 80 ObjectMaterializationDescriptor( |
81 : slot_address_(slot_address), object_length_(length) { } | 81 Address slot_address, int frame, int length, int duplicate, bool is_args) |
| 82 : slot_address_(slot_address), |
| 83 jsframe_index_(frame), |
| 84 object_length_(length), |
| 85 duplicate_object_(duplicate), |
| 86 is_arguments_(is_args) { } |
82 | 87 |
83 Address slot_address() const { return slot_address_; } | 88 Address slot_address() const { return slot_address_; } |
| 89 int jsframe_index() const { return jsframe_index_; } |
84 int object_length() const { return object_length_; } | 90 int object_length() const { return object_length_; } |
| 91 int duplicate_object() const { return duplicate_object_; } |
| 92 bool is_arguments() const { return is_arguments_; } |
| 93 |
| 94 // Only used for allocated receivers in DoComputeConstructStubFrame. |
| 95 void patch_slot_address(intptr_t slot) { |
| 96 slot_address_ = reinterpret_cast<Address>(slot); |
| 97 } |
85 | 98 |
86 private: | 99 private: |
87 Address slot_address_; | 100 Address slot_address_; |
| 101 int jsframe_index_; |
88 int object_length_; | 102 int object_length_; |
| 103 int duplicate_object_; |
| 104 bool is_arguments_; |
89 }; | 105 }; |
90 | 106 |
91 | 107 |
92 class OptimizedFunctionVisitor BASE_EMBEDDED { | 108 class OptimizedFunctionVisitor BASE_EMBEDDED { |
93 public: | 109 public: |
94 virtual ~OptimizedFunctionVisitor() {} | 110 virtual ~OptimizedFunctionVisitor() {} |
95 | 111 |
96 // Function which is called before iteration of any optimized functions | 112 // Function which is called before iteration of any optimized functions |
97 // from given native context. | 113 // from given native context. |
98 virtual void EnterContext(Context* context) = 0; | 114 virtual void EnterContext(Context* context) = 0; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
365 int frame_index); | 381 int frame_index); |
366 void DoComputeConstructStubFrame(TranslationIterator* iterator, | 382 void DoComputeConstructStubFrame(TranslationIterator* iterator, |
367 int frame_index); | 383 int frame_index); |
368 void DoComputeAccessorStubFrame(TranslationIterator* iterator, | 384 void DoComputeAccessorStubFrame(TranslationIterator* iterator, |
369 int frame_index, | 385 int frame_index, |
370 bool is_setter_stub_frame); | 386 bool is_setter_stub_frame); |
371 void DoComputeCompiledStubFrame(TranslationIterator* iterator, | 387 void DoComputeCompiledStubFrame(TranslationIterator* iterator, |
372 int frame_index); | 388 int frame_index); |
373 | 389 |
374 void DoTranslateObject(TranslationIterator* iterator, | 390 void DoTranslateObject(TranslationIterator* iterator, |
375 int object_opcode, | 391 int object_index, |
376 int field_index); | 392 int field_index); |
377 | 393 |
378 enum DeoptimizerTranslatedValueType { | 394 enum DeoptimizerTranslatedValueType { |
379 TRANSLATED_VALUE_IS_NATIVE, | 395 TRANSLATED_VALUE_IS_NATIVE, |
380 TRANSLATED_VALUE_IS_TAGGED | 396 TRANSLATED_VALUE_IS_TAGGED |
381 }; | 397 }; |
382 | 398 |
383 void DoTranslateCommand(TranslationIterator* iterator, | 399 void DoTranslateCommand(TranslationIterator* iterator, |
384 int frame_index, | 400 int frame_index, |
385 unsigned output_offset, | 401 unsigned output_offset, |
386 DeoptimizerTranslatedValueType value_type = TRANSLATED_VALUE_IS_TAGGED); | 402 DeoptimizerTranslatedValueType value_type = TRANSLATED_VALUE_IS_TAGGED); |
387 | 403 |
388 // Translate a command for OSR. Updates the input offset to be used for | 404 // Translate a command for OSR. Updates the input offset to be used for |
389 // the next command. Returns false if translation of the command failed | 405 // the next command. Returns false if translation of the command failed |
390 // (e.g., a number conversion failed) and may or may not have updated the | 406 // (e.g., a number conversion failed) and may or may not have updated the |
391 // input offset. | 407 // input offset. |
392 bool DoOsrTranslateCommand(TranslationIterator* iterator, | 408 bool DoOsrTranslateCommand(TranslationIterator* iterator, |
393 int* input_offset); | 409 int* input_offset); |
394 | 410 |
395 unsigned ComputeInputFrameSize() const; | 411 unsigned ComputeInputFrameSize() const; |
396 unsigned ComputeFixedSize(JSFunction* function) const; | 412 unsigned ComputeFixedSize(JSFunction* function) const; |
397 | 413 |
398 unsigned ComputeIncomingArgumentSize(JSFunction* function) const; | 414 unsigned ComputeIncomingArgumentSize(JSFunction* function) const; |
399 unsigned ComputeOutgoingArgumentSize() const; | 415 unsigned ComputeOutgoingArgumentSize() const; |
400 | 416 |
401 Object* ComputeLiteral(int index) const; | 417 Object* ComputeLiteral(int index) const; |
402 | 418 |
403 void AddObjectStart(intptr_t slot_address, int argc); | 419 void AddObjectStart(intptr_t slot_address, int argc, bool is_arguments); |
| 420 void AddObjectDuplication(intptr_t slot, int object_index); |
404 void AddObjectTaggedValue(intptr_t value); | 421 void AddObjectTaggedValue(intptr_t value); |
405 void AddObjectDoubleValue(double value); | 422 void AddObjectDoubleValue(double value); |
406 void AddDoubleValue(intptr_t slot_address, double value); | 423 void AddDoubleValue(intptr_t slot_address, double value); |
407 | 424 |
| 425 bool ArgumentsObjectIsAdapted(int object_index) { |
| 426 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); |
| 427 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; |
| 428 return jsframe_has_adapted_arguments_[reverse_jsframe_index]; |
| 429 } |
| 430 |
| 431 Handle<JSFunction> ArgumentsObjectFunction(int object_index) { |
| 432 ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index); |
| 433 int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1; |
| 434 return jsframe_functions_[reverse_jsframe_index]; |
| 435 } |
| 436 |
| 437 // Helper function for heap object materialization. |
| 438 Handle<Object> MaterializeNextHeapObject(); |
| 439 Handle<Object> MaterializeNextValue(); |
| 440 |
408 static void GenerateDeoptimizationEntries( | 441 static void GenerateDeoptimizationEntries( |
409 MacroAssembler* masm, int count, BailoutType type); | 442 MacroAssembler* masm, int count, BailoutType type); |
410 | 443 |
411 // Weak handle callback for deoptimizing code objects. | 444 // Weak handle callback for deoptimizing code objects. |
412 static void HandleWeakDeoptimizedCode(v8::Isolate* isolate, | 445 static void HandleWeakDeoptimizedCode(v8::Isolate* isolate, |
413 v8::Persistent<v8::Value>* obj, | 446 v8::Persistent<v8::Value>* obj, |
414 void* data); | 447 void* data); |
415 | 448 |
416 // Deoptimize the given code and add to appropriate deoptimization lists. | 449 // Deoptimize the given code and add to appropriate deoptimization lists. |
417 static void DeoptimizeCode(Isolate* isolate, Code* code); | 450 static void DeoptimizeCode(Isolate* isolate, Code* code); |
(...skipping 30 matching lines...) Expand all Loading... |
448 | 481 |
449 // Input frame description. | 482 // Input frame description. |
450 FrameDescription* input_; | 483 FrameDescription* input_; |
451 // Number of output frames. | 484 // Number of output frames. |
452 int output_count_; | 485 int output_count_; |
453 // Number of output js frames. | 486 // Number of output js frames. |
454 int jsframe_count_; | 487 int jsframe_count_; |
455 // Array of output frame descriptions. | 488 // Array of output frame descriptions. |
456 FrameDescription** output_; | 489 FrameDescription** output_; |
457 | 490 |
| 491 // Deferred values to be materialized. |
458 List<Object*> deferred_objects_tagged_values_; | 492 List<Object*> deferred_objects_tagged_values_; |
459 List<double> deferred_objects_double_values_; | 493 List<double> deferred_objects_double_values_; |
460 List<ObjectMaterializationDescriptor> deferred_objects_; | 494 List<ObjectMaterializationDescriptor> deferred_objects_; |
461 List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_; | 495 List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_; |
| 496 |
| 497 // Output frame information. Only used during heap object materialization. |
| 498 List<Handle<JSFunction> > jsframe_functions_; |
| 499 List<bool> jsframe_has_adapted_arguments_; |
| 500 |
| 501 // Materialized objects. Only used during heap object materialization. |
| 502 List<Handle<Object> >* materialized_values_; |
| 503 List<Handle<Object> >* materialized_objects_; |
| 504 int materialization_value_index_; |
| 505 int materialization_object_index_; |
| 506 |
462 #ifdef DEBUG | 507 #ifdef DEBUG |
463 DisallowHeapAllocation* disallow_heap_allocation_; | 508 DisallowHeapAllocation* disallow_heap_allocation_; |
464 #endif // DEBUG | 509 #endif // DEBUG |
465 | 510 |
466 bool trace_; | 511 bool trace_; |
467 | 512 |
468 static const int table_entry_size_; | 513 static const int table_entry_size_; |
469 | 514 |
470 friend class FrameDescription; | 515 friend class FrameDescription; |
471 friend class DeoptimizingCodeListNode; | 516 friend class DeoptimizingCodeListNode; |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
705 class Translation BASE_EMBEDDED { | 750 class Translation BASE_EMBEDDED { |
706 public: | 751 public: |
707 enum Opcode { | 752 enum Opcode { |
708 BEGIN, | 753 BEGIN, |
709 JS_FRAME, | 754 JS_FRAME, |
710 CONSTRUCT_STUB_FRAME, | 755 CONSTRUCT_STUB_FRAME, |
711 GETTER_STUB_FRAME, | 756 GETTER_STUB_FRAME, |
712 SETTER_STUB_FRAME, | 757 SETTER_STUB_FRAME, |
713 ARGUMENTS_ADAPTOR_FRAME, | 758 ARGUMENTS_ADAPTOR_FRAME, |
714 COMPILED_STUB_FRAME, | 759 COMPILED_STUB_FRAME, |
| 760 DUPLICATED_OBJECT, |
715 ARGUMENTS_OBJECT, | 761 ARGUMENTS_OBJECT, |
| 762 CAPTURED_OBJECT, |
716 REGISTER, | 763 REGISTER, |
717 INT32_REGISTER, | 764 INT32_REGISTER, |
718 UINT32_REGISTER, | 765 UINT32_REGISTER, |
719 DOUBLE_REGISTER, | 766 DOUBLE_REGISTER, |
720 STACK_SLOT, | 767 STACK_SLOT, |
721 INT32_STACK_SLOT, | 768 INT32_STACK_SLOT, |
722 UINT32_STACK_SLOT, | 769 UINT32_STACK_SLOT, |
723 DOUBLE_STACK_SLOT, | 770 DOUBLE_STACK_SLOT, |
724 LITERAL | 771 LITERAL |
725 }; | 772 }; |
(...skipping 11 matching lines...) Expand all Loading... |
737 int index() const { return index_; } | 784 int index() const { return index_; } |
738 | 785 |
739 // Commands. | 786 // Commands. |
740 void BeginJSFrame(BailoutId node_id, int literal_id, unsigned height); | 787 void BeginJSFrame(BailoutId node_id, int literal_id, unsigned height); |
741 void BeginCompiledStubFrame(); | 788 void BeginCompiledStubFrame(); |
742 void BeginArgumentsAdaptorFrame(int literal_id, unsigned height); | 789 void BeginArgumentsAdaptorFrame(int literal_id, unsigned height); |
743 void BeginConstructStubFrame(int literal_id, unsigned height); | 790 void BeginConstructStubFrame(int literal_id, unsigned height); |
744 void BeginGetterStubFrame(int literal_id); | 791 void BeginGetterStubFrame(int literal_id); |
745 void BeginSetterStubFrame(int literal_id); | 792 void BeginSetterStubFrame(int literal_id); |
746 void BeginArgumentsObject(int args_length); | 793 void BeginArgumentsObject(int args_length); |
| 794 void BeginCapturedObject(int length); |
| 795 void DuplicateObject(int object_index); |
747 void StoreRegister(Register reg); | 796 void StoreRegister(Register reg); |
748 void StoreInt32Register(Register reg); | 797 void StoreInt32Register(Register reg); |
749 void StoreUint32Register(Register reg); | 798 void StoreUint32Register(Register reg); |
750 void StoreDoubleRegister(DoubleRegister reg); | 799 void StoreDoubleRegister(DoubleRegister reg); |
751 void StoreStackSlot(int index); | 800 void StoreStackSlot(int index); |
752 void StoreInt32StackSlot(int index); | 801 void StoreInt32StackSlot(int index); |
753 void StoreUint32StackSlot(int index); | 802 void StoreUint32StackSlot(int index); |
754 void StoreDoubleStackSlot(int index); | 803 void StoreDoubleStackSlot(int index); |
755 void StoreLiteral(int literal_id); | 804 void StoreLiteral(int literal_id); |
756 void StoreArgumentsObject(bool args_known, int args_index, int args_length); | 805 void StoreArgumentsObject(bool args_known, int args_index, int args_length); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 Object** expression_stack_; | 1003 Object** expression_stack_; |
955 int source_position_; | 1004 int source_position_; |
956 | 1005 |
957 friend class Deoptimizer; | 1006 friend class Deoptimizer; |
958 }; | 1007 }; |
959 #endif | 1008 #endif |
960 | 1009 |
961 } } // namespace v8::internal | 1010 } } // namespace v8::internal |
962 | 1011 |
963 #endif // V8_DEOPTIMIZER_H_ | 1012 #endif // V8_DEOPTIMIZER_H_ |
OLD | NEW |