Index: src/assembler.h |
diff --git a/src/assembler.h b/src/assembler.h |
index 66811777fad6a93e98239c3172e462aea33e0e79..b71c5704daa0f3684448a13915a21794f7ac9976 100644 |
--- a/src/assembler.h |
+++ b/src/assembler.h |
@@ -585,6 +585,67 @@ class ExternalReference BASE_EMBEDDED { |
// ----------------------------------------------------------------------------- |
+// Position recording support |
+ |
+enum PositionRecordingType { FORCED_POSITION, NORMAL_POSITION }; |
Søren Thygesen Gjesse
2010/11/04 15:08:24
Thanks for using an enum instead of a boolean.
|
+ |
+class PositionsRecorder BASE_EMBEDDED { |
+ public: |
+ explicit PositionsRecorder(Assembler* assembler) |
+ : assembler_(assembler), |
+ current_position_(RelocInfo::kNoPosition), |
+ current_position_recording_type_(NORMAL_POSITION), |
+ written_position_(RelocInfo::kNoPosition), |
+ current_statement_position_(RelocInfo::kNoPosition), |
+ written_statement_position_(RelocInfo::kNoPosition) { } |
+ |
+ // Set current position to pos. If recording_type is FORCED_POSITION then |
+ // WriteRecordedPositions will write this position even if it is equal to |
+ // statement position previously written for another pc. |
+ void RecordPosition(int pos, |
+ PositionRecordingType recording_type = NORMAL_POSITION); |
+ |
+ // Set current statement position to pos. |
+ void RecordStatementPosition(int pos); |
+ |
+ // Write recorded positions to relocation information. |
+ bool WriteRecordedPositions(); |
+ |
+ int current_position() const { return current_position_; } |
+ |
+ int current_statement_position() const { return current_statement_position_; } |
+ |
+ private: |
+ Assembler* assembler_; |
+ |
+ int current_position_; |
+ PositionRecordingType current_position_recording_type_; |
+ int written_position_; |
+ |
+ int current_statement_position_; |
+ int written_statement_position_; |
+}; |
+ |
+ |
+class PreserveStatementPositionScope BASE_EMBEDDED { |
+ public: |
+ PreserveStatementPositionScope(PositionsRecorder* positions_recorder) |
+ : positions_recorder_(positions_recorder), |
+ statement_position_(positions_recorder->current_statement_position()) {} |
+ |
+ ~PreserveStatementPositionScope() { |
+ if (statement_position_ != RelocInfo::kNoPosition) { |
+ positions_recorder_->RecordStatementPosition(statement_position_); |
+ } |
+ } |
+ |
+ private: |
+ PositionsRecorder* positions_recorder_; |
+ int statement_position_; |
+}; |
+ |
+ |
+// ----------------------------------------------------------------------------- |
// Utility functions |
static inline bool is_intn(int x, int n) { |