RFR: 8194759: Support caching class mirror objects

Ioi Lam ioi.lam at oracle.com
Thu Feb 15 01:00:22 UTC 2018


>
> #if INCLUDE_CDS
> void java_lang_Class::serialize(SerializeClosure* f) {
>   f->do_u4((u4*)&offsets_computed);
>   f->do_u4((u4*)&classRedefinedCount_offset);
>   f->do_u4((u4*)&_class_loader_offset);
>   f->do_u4((u4*)&_component_mirror_offset);
>   f->do_u4((u4*)&_module_offset);
>   f->do_u4((u4*)&_init_lock_offset);
>   CLASS_INJECTED_FIELDS(SERIALIZE_INJECTED_FIELD_OFFSET);
> }
> #endif
>
> -> there are many of these functions and it's easy to get out of sync,
> especially when someone adds a new field in the future. We should handle
> these with macros. I'll send my suggestion in a separate mail.
Here's an example of doing this with macros. There are plenty examples 
of these "doer macros" in hotspot.

To see what it does, run "gcc -E foo.c"

This way, you don't need to repeat the same set of names 3 times.

Thanks
- Ioi

--------- foo.c
#define java_lang_String_FIELDS_DO(f) \
   f(int, java_lang_String, value_offset, 0) \
   f(int, java_lang_String, hash_offset,  0) \
   f(int, java_lang_String, coder_offset, 0) \

#define JAVACLASSES_DEFINE_FIELD(type, klass, name, initval)    \
   type klass::name = initval;

#define JAVACLASSES_DECLARE_FIELD(type, klass, name, initval)   \
   type name;

#define JAVACLASSES_SERIALIZE_FIELD(type, klass, name, initval) \
   f->do_ ## type(&name);

class java_lang_String : AllStatic {
  private:
   java_lang_String_FIELDS_DO(JAVACLASSES_DECLARE_FIELD)

  public:
   static void serialize(SerializeClosure* f) NOT_CDS_RETURN;
};

java_lang_String_FIELDS_DO(JAVACLASSES_DEFINE_FIELD)

void java_lang_String::serialize(SerializeClosure* f) {
   java_lang_String_FIELDS_DO(JAVACLASSES_SERIALIZE_FIELD)
};

// for classes that don't have injected fields, the serialize function
// can be further simplified

#define INCLUDE_CDS 1

#if INCLUDE_CDS
#define JAVACLASSES_STANDARD_SERIALIZE_FUNCTION(doer) \
     static void serialize(SerializeClosure* f) { \
       doer(JAVACLASSES_SERIALIZE_FIELD) \
     }
#else
#define JAVACLASSES_STANDARD_SERIALIZE_FUNCTION(doer) \
     static void serialize(SerializeClosure* f) {}
#endif

class java_lang_String : AllStatic {
JAVACLASSES_STANDARD_SERIALIZE_FUNCTION(java_lang_String_FIELDS_DO)
};
---------


More information about the hotspot-runtime-dev mailing list