--- old/src/share/vm/code/codeBlob.hpp 2017-08-04 21:17:42.721509936 +0200 +++ new/src/share/vm/code/codeBlob.hpp 2017-08-04 21:17:35.717522489 +0200 @@ -120,6 +120,7 @@ virtual bool is_method_handles_adapter_blob() const { return false; } virtual bool is_aot() const { return false; } virtual bool is_compiled() const { return false; } + virtual bool is_buffered_value_type_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; }; @@ -360,6 +361,7 @@ friend class VMStructs; friend class AdapterBlob; friend class MethodHandlesAdapterBlob; + friend class BufferedValueTypeBlob; friend class WhiteBox; private: @@ -426,6 +428,26 @@ virtual bool is_method_handles_adapter_blob() const { return true; } }; +//---------------------------------------------------------------------------------------------------- +// BufferedValueTypeBlob : used for pack/unpack handlers + +class BufferedValueTypeBlob: public BufferBlob { +private: + const int _pack_fields_off; + const int _unpack_fields_off; + + BufferedValueTypeBlob(int size, CodeBuffer* cb, int pack_fields_off, int unpack_fields_off); + +public: + // Creation + static BufferedValueTypeBlob* create(CodeBuffer* cb, int pack_fields_off, int unpack_fields_off); + + address pack_fields() const { return code_begin() + _pack_fields_off; } + address unpack_fields() const { return code_begin() + _unpack_fields_off; } + + // Typing + virtual bool is_buffered_value_type_blob() const { return true; } +}; //---------------------------------------------------------------------------------------------------- // RuntimeStub: describes stubs used by compiled code to call a (static) C++ runtime routine