64 class InterpreterOopMap: ResourceObj { |
64 class InterpreterOopMap: ResourceObj { |
65 friend class OopMapCache; |
65 friend class OopMapCache; |
66 |
66 |
67 public: |
67 public: |
68 enum { |
68 enum { |
69 N = 2, // the number of words reserved |
69 N = 4, // the number of words reserved |
70 // for inlined mask storage |
70 // for inlined mask storage |
71 small_mask_limit = N * BitsPerWord, // the maximum number of bits |
71 small_mask_limit = N * BitsPerWord, // the maximum number of bits |
72 // available for small masks, |
72 // available for small masks, |
73 // small_mask_limit can be set to 0 |
73 // small_mask_limit can be set to 0 |
74 // for testing bit_mask allocation |
74 // for testing bit_mask allocation |
75 |
75 |
76 #ifdef ENABLE_ZAP_DEAD_LOCALS |
|
77 bits_per_entry = 2, |
76 bits_per_entry = 2, |
78 dead_bit_number = 1, |
77 dead_bit_number = 1, |
79 #else |
|
80 bits_per_entry = 1, |
|
81 #endif |
|
82 oop_bit_number = 0 |
78 oop_bit_number = 0 |
83 }; |
79 }; |
84 |
80 |
85 private: |
81 private: |
86 Method* _method; // the method for which the mask is valid |
82 Method* _method; // the method for which the mask is valid |
117 |
113 |
118 uintptr_t entry_at(int offset) const { int i = offset * bits_per_entry; return bit_mask()[i / BitsPerWord] >> (i % BitsPerWord); } |
114 uintptr_t entry_at(int offset) const { int i = offset * bits_per_entry; return bit_mask()[i / BitsPerWord] >> (i % BitsPerWord); } |
119 |
115 |
120 void set_expression_stack_size(int sz) { _expression_stack_size = sz; } |
116 void set_expression_stack_size(int sz) { _expression_stack_size = sz; } |
121 |
117 |
122 #ifdef ENABLE_ZAP_DEAD_LOCALS |
|
123 bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; } |
|
124 #endif |
|
125 |
|
126 // Lookup |
118 // Lookup |
127 bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; } |
119 bool match(methodHandle method, int bci) const { return _method == method() && _bci == bci; } |
128 bool is_empty() const; |
120 bool is_empty() const; |
129 |
121 |
130 // Initialization |
122 // Initialization |
142 |
134 |
143 void iterate_oop(OffsetClosure* oop_closure) const; |
135 void iterate_oop(OffsetClosure* oop_closure) const; |
144 void print() const; |
136 void print() const; |
145 |
137 |
146 int number_of_entries() const { return mask_size() / bits_per_entry; } |
138 int number_of_entries() const { return mask_size() / bits_per_entry; } |
|
139 bool is_dead(int offset) const { return (entry_at(offset) & (1 << dead_bit_number)) != 0; } |
147 bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; } |
140 bool is_oop (int offset) const { return (entry_at(offset) & (1 << oop_bit_number )) != 0; } |
148 |
141 |
149 int expression_stack_size() const { return _expression_stack_size; } |
142 int expression_stack_size() const { return _expression_stack_size; } |
150 |
143 |
151 #ifdef ENABLE_ZAP_DEAD_LOCALS |
144 #ifdef ENABLE_ZAP_DEAD_LOCALS |