Chromium Code Reviews| Index: src/objects.h |
| diff --git a/src/objects.h b/src/objects.h |
| index a9c2439e61bbf077ad484031025d9fff7d03369e..512167c2da59ef5dcfd8d308c56c567dd59fa2c3 100644 |
| --- a/src/objects.h |
| +++ b/src/objects.h |
| @@ -4448,6 +4448,82 @@ class NormalizedMapCache: public FixedArray { |
| void set(int index, Object* value); |
| }; |
| +// HandlerTable is a fixed array containing entries for exception handlers in |
| +// the code object it is associated with. The tables comes in two flavors: |
| +// 1) Based on ranges: Used for unoptimized code. Contains one entry per |
| +// exception handler and a range representing the try-block covered by that |
| +// handler. Layout looks as follows: |
| +// [ range-start , range-end , handler-offset , handler-data ] |
| +// 2) Based on return addresses: Used for turbofanned code. Contains one entry |
| +// per call-site that could throw an exception. Layout looks as follows: |
| +// [ return-address-offset , handler-offset ] |
| +class HandlerTable : public FixedArray { |
| + public: |
| + // Conservative prediction whether a given handler will locally catch an |
| + // exception or cause a re-throw to outside the code boundary. Since this is |
| + // undecidable it is merely an approximation (e.g. useful for debugger). |
| + enum CatchPrediction { |
| + UNCAUGHT, // the handler will (likely) rethrow the exception. |
| + CAUGHT, // the exception will be caught by the handler. |
| + PROMISE // the exception will be caught and cause a promise rejection. |
| + }; |
| + |
| + // Getters for handler table based on ranges. |
| + inline int GetRangeStart(int index) const; |
| + inline int GetRangeEnd(int index) const; |
| + inline int GetRangeHandler(int index) const; |
| + inline int GetRangeData(int index) const; |
| + |
| + // Setters for handler table based on ranges. |
| + inline void SetRangeStart(int index, int value); |
| + inline void SetRangeEnd(int index, int value); |
| + inline void SetRangeHandler(int index, int offset, CatchPrediction pred); |
| + inline void SetRangeData(int index, int value); |
| + |
| + // Setters for handler table based on return addresses. |
| + inline void SetReturnOffset(int index, int value); |
| + inline void SetReturnHandler(int index, int offset, CatchPrediction pred); |
| + |
| + // Lookup handler in a table based on ranges. |
| + int LookupRange(int pc_offset, int* data, CatchPrediction* prediction); |
| + |
| + // Lookup handler in a table based on return addresses. |
| + int LookupReturn(int pc_offset); |
| + |
| + // Returns the conservative catch predication. |
| + inline CatchPrediction GetRangePrediction(int index) const; |
| + |
| + // Returns the number of entries in the table. |
| + inline int NumberOfRangeEntries() const; |
| + |
| + // Returns the required length of the underlying fixed array. |
| + static int LengthForRange(int entries) { return entries * kRangeEntrySize; } |
| + static int LengthForReturn(int entries) { return entries * kReturnEntrySize; } |
| + |
| + DECLARE_CAST(HandlerTable) |
| + |
| +#ifdef ENABLE_DISASSEMBLER |
| + void HandlerTableRangePrint(std::ostream& os); // NOLINT |
| + void HandlerTableReturnPrint(std::ostream& os); // NOLINT |
| +#endif |
| + |
| + private: |
| + // Layout description for handler table based on ranges. |
| + static const int kRangeStartIndex = 0; |
| + static const int kRangeEndIndex = 1; |
| + static const int kRangeHandlerIndex = 2; |
| + static const int kRangeDataIndex = 3; |
| + static const int kRangeEntrySize = 4; |
| + |
| + // Layout description for handler table based on return addresses. |
| + static const int kReturnOffsetIndex = 0; |
| + static const int kReturnHandlerIndex = 1; |
| + static const int kReturnEntrySize = 2; |
| + |
| + // Encoding of the {handler} field. |
| + class HandlerPredictionField : public BitField<CatchPrediction, 0, 2> {}; |
| + class HandlerOffsetField : public BitField<int, 2, 30> {}; |
| +}; |
| // ByteArray represents fixed sized byte arrays. Used for the relocation info |
| // that is attached to code objects. |
| @@ -4571,6 +4647,9 @@ class BytecodeArray : public FixedArrayBase { |
| void CopyBytecodesTo(BytecodeArray* to); |
| + int LookupRangeInHandlerTable(int code_offset, int* context_register, |
|
Michael Starzinger
2016/08/02 11:04:05
nit: s/context_register/data/ here, because for FC
|
| + HandlerTable::CatchPrediction* prediction); |
| + |
| // Layout description. |
| static const int kConstantPoolOffset = FixedArrayBase::kHeaderSize; |
| static const int kHandlerTableOffset = kConstantPoolOffset + kPointerSize; |
| @@ -4878,83 +4957,6 @@ class LiteralsArray : public FixedArray { |
| }; |
| -// HandlerTable is a fixed array containing entries for exception handlers in |
| -// the code object it is associated with. The tables comes in two flavors: |
| -// 1) Based on ranges: Used for unoptimized code. Contains one entry per |
| -// exception handler and a range representing the try-block covered by that |
| -// handler. Layout looks as follows: |
| -// [ range-start , range-end , handler-offset , handler-data ] |
| -// 2) Based on return addresses: Used for turbofanned code. Contains one entry |
| -// per call-site that could throw an exception. Layout looks as follows: |
| -// [ return-address-offset , handler-offset ] |
| -class HandlerTable : public FixedArray { |
| - public: |
| - // Conservative prediction whether a given handler will locally catch an |
| - // exception or cause a re-throw to outside the code boundary. Since this is |
| - // undecidable it is merely an approximation (e.g. useful for debugger). |
| - enum CatchPrediction { |
| - UNCAUGHT, // the handler will (likely) rethrow the exception. |
| - CAUGHT, // the exception will be caught by the handler. |
| - PROMISE // the exception will be caught and cause a promise rejection. |
| - }; |
| - |
| - // Getters for handler table based on ranges. |
| - inline int GetRangeStart(int index) const; |
| - inline int GetRangeEnd(int index) const; |
| - inline int GetRangeHandler(int index) const; |
| - inline int GetRangeData(int index) const; |
| - |
| - // Setters for handler table based on ranges. |
| - inline void SetRangeStart(int index, int value); |
| - inline void SetRangeEnd(int index, int value); |
| - inline void SetRangeHandler(int index, int offset, CatchPrediction pred); |
| - inline void SetRangeData(int index, int value); |
| - |
| - // Setters for handler table based on return addresses. |
| - inline void SetReturnOffset(int index, int value); |
| - inline void SetReturnHandler(int index, int offset, CatchPrediction pred); |
| - |
| - // Lookup handler in a table based on ranges. |
| - int LookupRange(int pc_offset, int* data, CatchPrediction* prediction); |
| - |
| - // Lookup handler in a table based on return addresses. |
| - int LookupReturn(int pc_offset, CatchPrediction* prediction); |
| - |
| - // Returns the conservative catch predication. |
| - inline CatchPrediction GetRangePrediction(int index) const; |
| - |
| - // Returns the number of entries in the table. |
| - inline int NumberOfRangeEntries() const; |
| - |
| - // Returns the required length of the underlying fixed array. |
| - static int LengthForRange(int entries) { return entries * kRangeEntrySize; } |
| - static int LengthForReturn(int entries) { return entries * kReturnEntrySize; } |
| - |
| - DECLARE_CAST(HandlerTable) |
| - |
| -#ifdef ENABLE_DISASSEMBLER |
| - void HandlerTableRangePrint(std::ostream& os); // NOLINT |
| - void HandlerTableReturnPrint(std::ostream& os); // NOLINT |
| -#endif |
| - |
| - private: |
| - // Layout description for handler table based on ranges. |
| - static const int kRangeStartIndex = 0; |
| - static const int kRangeEndIndex = 1; |
| - static const int kRangeHandlerIndex = 2; |
| - static const int kRangeDataIndex = 3; |
| - static const int kRangeEntrySize = 4; |
| - |
| - // Layout description for handler table based on return addresses. |
| - static const int kReturnOffsetIndex = 0; |
| - static const int kReturnHandlerIndex = 1; |
| - static const int kReturnEntrySize = 2; |
| - |
| - // Encoding of the {handler} field. |
| - class HandlerPredictionField : public BitField<CatchPrediction, 0, 2> {}; |
| - class HandlerOffsetField : public BitField<int, 2, 30> {}; |
| -}; |
| - |
| class TemplateList : public FixedArray { |
| public: |
| static Handle<TemplateList> New(Isolate* isolate, int size); |
| @@ -5341,6 +5343,9 @@ class Code: public HeapObject { |
| BailoutId TranslatePcOffsetToAstId(uint32_t pc_offset); |
| uint32_t TranslateAstIdToPcOffset(BailoutId ast_id); |
| + int LookupRangeInHandlerTable(int code_offset, int* context_register, |
|
Michael Starzinger
2016/08/02 11:04:05
nit: s/context_register/data/
|
| + HandlerTable::CatchPrediction* prediction); |
| + |
| #define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge, |
| enum Age { |
| kToBeExecutedOnceCodeAge = -3, |
| @@ -5554,6 +5559,11 @@ class AbstractCode : public HeapObject { |
| // Return the source position table. |
| inline ByteArray* source_position_table(); |
| + // Return the exception handler table. |
| + inline int LookupRangeInHandlerTable( |
| + int code_offset, int* context_register, |
|
Michael Starzinger
2016/08/02 11:04:05
nit: s/context_register/data/
|
| + HandlerTable::CatchPrediction* prediction); |
| + |
| // Returns the size of instructions and the metadata. |
| inline int SizeIncludingMetadata(); |