- Loading...
...
| Code Block |
|---|
// macro body starts here -------------------+ // | // v #define FLAG_LIMIT_DEFINE( type, name, ...) ); constconstexpr JVMTypedFlagLimit<type> limit_##name(0 #define FLAG_LIMIT_DEFINE_DUMMY(type, name, ...) ); constconstexpr DummyLimit nolimit_##name(0 #define FLAG_LIMIT_PTR( type, name, ...) ), LimitGetter<type>::get_limit(&limit_##name, 0 #define FLAG_LIMIT_PTR_NONE( type, name, ...) ), LimitGetter<type>::no_limit(0 #define APPLY_FLAG_RANGE(...) , __VA_ARGS__ #define APPLY_FLAG_CONSTRAINT(func, phase) , next_two_args_are_constraint, (short)CONSTRAINT_ENUM(func), int(JVMFlagConstraint::phase) constexpr JVMTypedFlagLimit<int> limit_dummy ( #ifdef PRODUCT ALL_FLAGS(FLAG_LIMIT_DEFINE_DUMMY, FLAG_LIMIT_DEFINE_DUMMY, FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE_DUMMY, APPLY_FLAG_RANGE, APPLY_FLAG_CONSTRAINT) #else ALL_FLAGS(FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE, FLAG_LIMIT_DEFINE, APPLY_FLAG_RANGE, APPLY_FLAG_CONSTRAINT) #endif ); |
To understand how the macros work, it's best to compile jvmFlagLimit.c with gcc -save-temps. and look at the generated jvmFlagLimit.ii with the macros expanded. Here's an example (prettified manually):
| Code Block |
|---|
// code excerpt prettified manually
constexpr JVMTypedFlagLimit<int> limit_dummy();
constexpr JVMTypedFlagLimit<bool> limit_UseCompressedOops(0);
....
constexpr JVMTypedFlagLimit<intx> limit_ObjectAlignmentInBytes(0, 8, 256,
next_two_args_are_constraint,
(short)constraint_enum_ObjectAlignmentInBytesConstraintFunc, int(JVMFlagConstraint::AtParse));
....
constexpr JVMTypedFlagLimit<intx> limit_JVMCIThreads(0, 1, max_jint); |
...