| Index: src/deoptimizer.h
|
| diff --git a/src/deoptimizer.h b/src/deoptimizer.h
|
| index 7ad1ab0b2e7f40227d0c90beea19e4474c644c46..b6e4667a20da9a6075e0cba5af6b0f42a47afaaa 100644
|
| --- a/src/deoptimizer.h
|
| +++ b/src/deoptimizer.h
|
| @@ -77,15 +77,31 @@ class HeapNumberMaterializationDescriptor BASE_EMBEDDED {
|
|
|
| class ObjectMaterializationDescriptor BASE_EMBEDDED {
|
| public:
|
| - ObjectMaterializationDescriptor(Address slot_address, int length)
|
| - : slot_address_(slot_address), object_length_(length) { }
|
| + ObjectMaterializationDescriptor(
|
| + Address slot_address, int frame, int length, int duplicate, bool is_args)
|
| + : slot_address_(slot_address),
|
| + jsframe_index_(frame),
|
| + object_length_(length),
|
| + duplicate_object_(duplicate),
|
| + is_arguments_(is_args) { }
|
|
|
| Address slot_address() const { return slot_address_; }
|
| + int jsframe_index() const { return jsframe_index_; }
|
| int object_length() const { return object_length_; }
|
| + int duplicate_object() const { return duplicate_object_; }
|
| + bool is_arguments() const { return is_arguments_; }
|
| +
|
| + // Only used for allocated receivers in DoComputeConstructStubFrame.
|
| + void patch_slot_address(intptr_t slot) {
|
| + slot_address_ = reinterpret_cast<Address>(slot);
|
| + }
|
|
|
| private:
|
| Address slot_address_;
|
| + int jsframe_index_;
|
| int object_length_;
|
| + int duplicate_object_;
|
| + bool is_arguments_;
|
| };
|
|
|
|
|
| @@ -372,7 +388,7 @@ class Deoptimizer : public Malloced {
|
| int frame_index);
|
|
|
| void DoTranslateObject(TranslationIterator* iterator,
|
| - int object_opcode,
|
| + int object_index,
|
| int field_index);
|
|
|
| enum DeoptimizerTranslatedValueType {
|
| @@ -400,11 +416,28 @@ class Deoptimizer : public Malloced {
|
|
|
| Object* ComputeLiteral(int index) const;
|
|
|
| - void AddObjectStart(intptr_t slot_address, int argc);
|
| + void AddObjectStart(intptr_t slot_address, int argc, bool is_arguments);
|
| + void AddObjectDuplication(intptr_t slot, int object_index);
|
| void AddObjectTaggedValue(intptr_t value);
|
| void AddObjectDoubleValue(double value);
|
| void AddDoubleValue(intptr_t slot_address, double value);
|
|
|
| + bool ArgumentsObjectIsAdapted(int object_index) {
|
| + ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index);
|
| + int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1;
|
| + return jsframe_has_adapted_arguments_[reverse_jsframe_index];
|
| + }
|
| +
|
| + Handle<JSFunction> ArgumentsObjectFunction(int object_index) {
|
| + ObjectMaterializationDescriptor desc = deferred_objects_.at(object_index);
|
| + int reverse_jsframe_index = jsframe_count_ - desc.jsframe_index() - 1;
|
| + return jsframe_functions_[reverse_jsframe_index];
|
| + }
|
| +
|
| + // Helper function for heap object materialization.
|
| + Handle<Object> MaterializeNextHeapObject();
|
| + Handle<Object> MaterializeNextValue();
|
| +
|
| static void GenerateDeoptimizationEntries(
|
| MacroAssembler* masm, int count, BailoutType type);
|
|
|
| @@ -455,10 +488,22 @@ class Deoptimizer : public Malloced {
|
| // Array of output frame descriptions.
|
| FrameDescription** output_;
|
|
|
| + // Deferred values to be materialized.
|
| List<Object*> deferred_objects_tagged_values_;
|
| List<double> deferred_objects_double_values_;
|
| List<ObjectMaterializationDescriptor> deferred_objects_;
|
| List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_;
|
| +
|
| + // Output frame information. Only used during heap object materialization.
|
| + List<Handle<JSFunction> > jsframe_functions_;
|
| + List<bool> jsframe_has_adapted_arguments_;
|
| +
|
| + // Materialized objects. Only used during heap object materialization.
|
| + List<Handle<Object> >* materialized_values_;
|
| + List<Handle<Object> >* materialized_objects_;
|
| + int materialization_value_index_;
|
| + int materialization_object_index_;
|
| +
|
| #ifdef DEBUG
|
| DisallowHeapAllocation* disallow_heap_allocation_;
|
| #endif // DEBUG
|
| @@ -712,7 +757,9 @@ class Translation BASE_EMBEDDED {
|
| SETTER_STUB_FRAME,
|
| ARGUMENTS_ADAPTOR_FRAME,
|
| COMPILED_STUB_FRAME,
|
| + DUPLICATED_OBJECT,
|
| ARGUMENTS_OBJECT,
|
| + CAPTURED_OBJECT,
|
| REGISTER,
|
| INT32_REGISTER,
|
| UINT32_REGISTER,
|
| @@ -744,6 +791,8 @@ class Translation BASE_EMBEDDED {
|
| void BeginGetterStubFrame(int literal_id);
|
| void BeginSetterStubFrame(int literal_id);
|
| void BeginArgumentsObject(int args_length);
|
| + void BeginCapturedObject(int length);
|
| + void DuplicateObject(int object_index);
|
| void StoreRegister(Register reg);
|
| void StoreInt32Register(Register reg);
|
| void StoreUint32Register(Register reg);
|
|
|