< prev index next >

src/hotspot/share/oops/method.hpp

Print this page

@@ -88,11 +88,14 @@
     _dont_inline           = 1 << 2,
     _hidden                = 1 << 3,
     _has_injected_profile  = 1 << 4,
     _running_emcp          = 1 << 5,
     _intrinsic_candidate   = 1 << 6,
-    _reserved_stack_access = 1 << 7
+    _reserved_stack_access = 1 << 7,
+    _known_not_returning_vt= 1 << 8,            // <- See byte_value_for_known_not_returning_vt()
+    _known_returning_vt    = 1 << 9,            // <- for these 2 bits.
+    _unused_bits_mask      = 0xfc00   
   };
   mutable u2 _flags;
 
   JFR_ONLY(DEFINE_TRACE_FLAG;)
 

@@ -693,10 +696,11 @@
   // interpreter support
   static ByteSize const_offset()                 { return byte_offset_of(Method, _constMethod       ); }
   static ByteSize access_flags_offset()          { return byte_offset_of(Method, _access_flags      ); }
   static ByteSize from_compiled_offset()         { return byte_offset_of(Method, _from_compiled_entry); }
   static ByteSize code_offset()                  { return byte_offset_of(Method, _code); }
+  static ByteSize flags_offset()                 { return byte_offset_of(Method, _flags); }
   static ByteSize method_data_offset()           {
     return byte_offset_of(Method, _method_data);
   }
   static ByteSize method_counters_offset()       {
     return byte_offset_of(Method, _method_counters);

@@ -894,10 +898,37 @@
 
   void set_has_reserved_stack_access(bool x) {
     _flags = x ? (_flags | _reserved_stack_access) : (_flags & ~_reserved_stack_access);
   }
 
+  static int byte_value_for_known_not_returning_vt() {
+    // The higher byte of Method::_flags has only the
+    // _known_not_returning_vt and _known_returning_vt bits, and all other bits
+    // are zero, so we can test for is_known_not_returning_vt() in the interpreter
+    // by essentially comparing (_flags >> 8) == Method::byte_value_for_known_not_returning_vt()
+    assert(_unused_bits_mask == 0xfc00, "must be");
+    return (_known_not_returning_vt >> 8);
+  }
+
+  bool is_known_not_returning_vt() {
+    return (_flags & _known_not_returning_vt) != 0;
+  }
+
+  void set_known_not_returning_vt() {
+    _flags |= _known_not_returning_vt;
+  }
+
+  bool is_known_returning_vt() {
+    return (_flags & _known_returning_vt) != 0;
+  }
+
+  void set_known_returning_vt() {
+    _flags |= _known_returning_vt;
+  }
+
+  void check_returning_vt(TRAPS);
+
   JFR_ONLY(DEFINE_TRACE_FLAG_ACCESSOR;)
 
   ConstMethod::MethodType method_type() const {
       return _constMethod->method_type();
   }
< prev index next >