< prev index next >

src/hotspot/share/code/codeBlob.hpp

Print this page
*** 146,10 ***
--- 146,11 ---
    virtual bool is_safepoint_stub() const              { return false; }
    virtual bool is_adapter_blob() const                { return false; }
    virtual bool is_vtable_blob() const                 { return false; }
    virtual bool is_method_handles_adapter_blob() const { return false; }
    virtual bool is_compiled() const                    { return false; }
+   virtual bool is_buffered_inline_type_blob() const   { return false; }
    virtual bool is_optimized_entry_blob() const                  { return false; }
  
    inline bool is_compiled_by_c1() const    { return _type == compiler_c1; };
    inline bool is_compiled_by_c2() const    { return _type == compiler_c2; };
    inline bool is_compiled_by_jvmci() const { return _type == compiler_jvmci; };

*** 394,17 ***
  class BufferBlob: public RuntimeBlob {
    friend class VMStructs;
    friend class AdapterBlob;
    friend class VtableBlob;
    friend class MethodHandlesAdapterBlob;
    friend class OptimizedEntryBlob;
    friend class WhiteBox;
  
   private:
    // Creation support
    BufferBlob(const char* name, int size);
!   BufferBlob(const char* name, int size, CodeBuffer* cb);
  
    // This ordinary operator delete is needed even though not used, so the
    // below two-argument operator delete will be treated as a placement
    // delete rather than an ordinary sized delete; see C++14 3.7.4.2/p2.
    void operator delete(void* p);
--- 395,19 ---
  class BufferBlob: public RuntimeBlob {
    friend class VMStructs;
    friend class AdapterBlob;
    friend class VtableBlob;
    friend class MethodHandlesAdapterBlob;
+   friend class BufferedInlineTypeBlob;
    friend class OptimizedEntryBlob;
    friend class WhiteBox;
  
   private:
    // Creation support
    BufferBlob(const char* name, int size);
!   BufferBlob(const char* name, int header_size, int size, CodeBuffer* cb);
+   BufferBlob(const char* name, int size, CodeBuffer* cb, int frame_complete, int frame_size, OopMapSet* oop_maps, bool caller_must_gc_arguments = false);
  
    // This ordinary operator delete is needed even though not used, so the
    // below two-argument operator delete will be treated as a placement
    // delete rather than an ordinary sized delete; see C++14 3.7.4.2/p2.
    void operator delete(void* p);

*** 433,18 ***
  //----------------------------------------------------------------------------------------------------
  // AdapterBlob: used to hold C2I/I2C adapters
  
  class AdapterBlob: public BufferBlob {
  private:
!   AdapterBlob(int size, CodeBuffer* cb);
  
  public:
    // Creation
!   static AdapterBlob* create(CodeBuffer* cb);
  
    // Typing
    virtual bool is_adapter_blob() const { return true; }
  };
  
  //---------------------------------------------------------------------------------------------------
  class VtableBlob: public BufferBlob {
  private:
--- 436,24 ---
  //----------------------------------------------------------------------------------------------------
  // AdapterBlob: used to hold C2I/I2C adapters
  
  class AdapterBlob: public BufferBlob {
  private:
!   AdapterBlob(int size, CodeBuffer* cb, int frame_complete, int frame_size, OopMapSet* oop_maps, bool caller_must_gc_arguments = false);
  
  public:
    // Creation
!   static AdapterBlob* create(CodeBuffer* cb,
+                              int frame_complete,
+                              int frame_size,
+                              OopMapSet* oop_maps,
+                              bool caller_must_gc_arguments = false);
  
    // Typing
    virtual bool is_adapter_blob() const { return true; }
+ 
+   bool caller_must_gc_arguments(JavaThread* thread) const { return true; }
  };
  
  //---------------------------------------------------------------------------------------------------
  class VtableBlob: public BufferBlob {
  private:

*** 473,10 ***
--- 482,32 ---
  
    // Typing
    virtual bool is_method_handles_adapter_blob() const { return true; }
  };
  
+ //----------------------------------------------------------------------------------------------------
+ // BufferedInlineTypeBlob : used for pack/unpack handlers
+ 
+ class BufferedInlineTypeBlob: public BufferBlob {
+ private:
+   const int _pack_fields_off;
+   const int _pack_fields_jobject_off;
+   const int _unpack_fields_off;
+ 
+   BufferedInlineTypeBlob(int size, CodeBuffer* cb, int pack_fields_off, int pack_fields_jobject_off, int unpack_fields_off);
+ 
+ public:
+   // Creation
+   static BufferedInlineTypeBlob* create(CodeBuffer* cb, int pack_fields_off, int pack_fields_jobject_off, int unpack_fields_off);
+ 
+   address pack_fields() const { return code_begin() + _pack_fields_off; }
+   address pack_fields_jobject() const { return code_begin() + _pack_fields_jobject_off; }
+   address unpack_fields() const { return code_begin() + _unpack_fields_off; }
+ 
+   // Typing
+   virtual bool is_buffered_inline_type_blob() const { return true; }
+ };
  
  //----------------------------------------------------------------------------------------------------
  // RuntimeStub: describes stubs used by compiled code to call a (static) C++ runtime routine
  
  class RuntimeStub: public RuntimeBlob {
< prev index next >