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