271 virtual address handler_table_begin() const = 0;
272 virtual address handler_table_end() const = 0;
273 bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
274 int handler_table_size() const { return handler_table_end() - handler_table_begin(); }
275
276 virtual address exception_begin() const = 0;
277
278 virtual address nul_chk_table_begin() const = 0;
279 virtual address nul_chk_table_end() const = 0;
280 bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
281 int nul_chk_table_size() const { return nul_chk_table_end() - nul_chk_table_begin(); }
282
283 virtual oop* oop_addr_at(int index) const = 0;
284 virtual Metadata** metadata_addr_at(int index) const = 0;
285 virtual void set_original_pc(const frame* fr, address pc) = 0;
286
287 // Exception cache support
288 // Note: _exception_cache may be read concurrently. We rely on memory_order_consume here.
289 ExceptionCache* exception_cache() const { return _exception_cache; }
290 void set_exception_cache(ExceptionCache *ec) { _exception_cache = ec; }
291 void release_set_exception_cache(ExceptionCache *ec) { OrderAccess::release_store_ptr(&_exception_cache, ec); }
292 address handler_for_exception_and_pc(Handle exception, address pc);
293 void add_handler_for_exception_and_pc(Handle exception, address pc, address handler);
294 void clean_exception_cache(BoolObjectClosure* is_alive);
295
296 void add_exception_cache_entry(ExceptionCache* new_entry);
297 ExceptionCache* exception_cache_entry_for_exception(Handle exception);
298
299 // MethodHandle
300 bool is_method_handle_return(address return_pc);
301 address deopt_mh_handler_begin() const { return _deopt_mh_handler_begin; }
302
303 address deopt_handler_begin() const { return _deopt_handler_begin; }
304 virtual address get_original_pc(const frame* fr) = 0;
305 // Deopt
306 // Return true is the PC is one would expect if the frame is being deopted.
307 bool is_deopt_pc (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
308 bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
309 bool is_deopt_entry(address pc);
310
311 virtual bool can_convert_to_zombie() = 0;
|
271 virtual address handler_table_begin() const = 0;
272 virtual address handler_table_end() const = 0;
273 bool handler_table_contains(address addr) const { return handler_table_begin() <= addr && addr < handler_table_end(); }
274 int handler_table_size() const { return handler_table_end() - handler_table_begin(); }
275
276 virtual address exception_begin() const = 0;
277
278 virtual address nul_chk_table_begin() const = 0;
279 virtual address nul_chk_table_end() const = 0;
280 bool nul_chk_table_contains(address addr) const { return nul_chk_table_begin() <= addr && addr < nul_chk_table_end(); }
281 int nul_chk_table_size() const { return nul_chk_table_end() - nul_chk_table_begin(); }
282
283 virtual oop* oop_addr_at(int index) const = 0;
284 virtual Metadata** metadata_addr_at(int index) const = 0;
285 virtual void set_original_pc(const frame* fr, address pc) = 0;
286
287 // Exception cache support
288 // Note: _exception_cache may be read concurrently. We rely on memory_order_consume here.
289 ExceptionCache* exception_cache() const { return _exception_cache; }
290 void set_exception_cache(ExceptionCache *ec) { _exception_cache = ec; }
291 void release_set_exception_cache(ExceptionCache *ec) { OrderAccess::release_store(&_exception_cache, ec); }
292 address handler_for_exception_and_pc(Handle exception, address pc);
293 void add_handler_for_exception_and_pc(Handle exception, address pc, address handler);
294 void clean_exception_cache(BoolObjectClosure* is_alive);
295
296 void add_exception_cache_entry(ExceptionCache* new_entry);
297 ExceptionCache* exception_cache_entry_for_exception(Handle exception);
298
299 // MethodHandle
300 bool is_method_handle_return(address return_pc);
301 address deopt_mh_handler_begin() const { return _deopt_mh_handler_begin; }
302
303 address deopt_handler_begin() const { return _deopt_handler_begin; }
304 virtual address get_original_pc(const frame* fr) = 0;
305 // Deopt
306 // Return true is the PC is one would expect if the frame is being deopted.
307 bool is_deopt_pc (address pc) { return is_deopt_entry(pc) || is_deopt_mh_entry(pc); }
308 bool is_deopt_mh_entry(address pc) { return pc == deopt_mh_handler_begin(); }
309 bool is_deopt_entry(address pc);
310
311 virtual bool can_convert_to_zombie() = 0;
|