--- old/src/share/vm/runtime/commandLineFlagConstraintList.cpp 2015-07-17 15:47:00.258799834 -0700 +++ new/src/share/vm/runtime/commandLineFlagConstraintList.cpp 2015-07-17 15:47:00.142799831 -0700 @@ -39,7 +39,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_bool(const char* name, CommandLineFlagConstraintFunc_bool func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_bool(const char* name, + CommandLineFlagConstraintFunc_bool func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -53,7 +55,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_int(const char* name, CommandLineFlagConstraintFunc_int func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_int(const char* name, + CommandLineFlagConstraintFunc_int func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -67,7 +71,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_intx(const char* name, CommandLineFlagConstraintFunc_intx func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_intx(const char* name, + CommandLineFlagConstraintFunc_intx func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -81,7 +87,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_uint(const char* name, CommandLineFlagConstraintFunc_uint func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_uint(const char* name, + CommandLineFlagConstraintFunc_uint func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -95,7 +103,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_uintx(const char* name, CommandLineFlagConstraintFunc_uintx func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_uintx(const char* name, + CommandLineFlagConstraintFunc_uintx func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -109,7 +119,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_uint64_t(const char* name, CommandLineFlagConstraintFunc_uint64_t func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_uint64_t(const char* name, + CommandLineFlagConstraintFunc_uint64_t func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -123,7 +135,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_size_t(const char* name, CommandLineFlagConstraintFunc_size_t func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_size_t(const char* name, + CommandLineFlagConstraintFunc_size_t func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -137,7 +151,9 @@ public: // the "name" argument must be a string literal - CommandLineFlagConstraint_double(const char* name, CommandLineFlagConstraintFunc_double func) : CommandLineFlagConstraint(name) { + CommandLineFlagConstraint_double(const char* name, + CommandLineFlagConstraintFunc_double func, + ConstraintType type) : CommandLineFlagConstraint(name, type) { _constraint=func; } @@ -161,30 +177,47 @@ void emit_constraint_size_t(const char* /*name*/) { /* NOP */ } void emit_constraint_double(const char* /*name*/) { /* NOP */ } +CommandLineFlagConstraint::ConstraintType CommandLineFlagConstraint::change_to_enum(const char* type) { + static const char* const atParse_str = "AtParse"; + static const char* const afterErgo_str = "AfterErgo"; + static const char* const afterMemoryInit_str = "AfterMemoryInit"; + + if (strncmp(type, afterErgo_str, 9) == 0 && type[9] == '\0') { + return CommandLineFlagConstraint::AfterErgo; + } else if (strncmp(type, afterMemoryInit_str, 15) == 0 && type[15] == '\0') { + return CommandLineFlagConstraint::AfterMemoryInit; + } else if (strncmp(type, atParse_str, 7) == 0 && type[7] == '\0') { + return CommandLineFlagConstraint::AtParse; + } else { + ShouldNotReachHere(); + return CommandLineFlagConstraint::AfterMemoryInit; + } +} + // CommandLineFlagConstraint emitting code functions if function argument is provided -void emit_constraint_bool(const char* name, CommandLineFlagConstraintFunc_bool func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_bool(name, func)); +void emit_constraint_bool(const char* name, CommandLineFlagConstraintFunc_bool func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_bool(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_int(const char* name, CommandLineFlagConstraintFunc_int func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_int(name, func)); +void emit_constraint_int(const char* name, CommandLineFlagConstraintFunc_int func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_int(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_intx(const char* name, CommandLineFlagConstraintFunc_intx func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_intx(name, func)); +void emit_constraint_intx(const char* name, CommandLineFlagConstraintFunc_intx func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_intx(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_uint(const char* name, CommandLineFlagConstraintFunc_uint func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uint(name, func)); +void emit_constraint_uint(const char* name, CommandLineFlagConstraintFunc_uint func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uint(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_uintx(const char* name, CommandLineFlagConstraintFunc_uintx func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uintx(name, func)); +void emit_constraint_uintx(const char* name, CommandLineFlagConstraintFunc_uintx func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uintx(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_uint64_t(const char* name, CommandLineFlagConstraintFunc_uint64_t func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uint64_t(name, func)); +void emit_constraint_uint64_t(const char* name, CommandLineFlagConstraintFunc_uint64_t func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_uint64_t(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_size_t(const char* name, CommandLineFlagConstraintFunc_size_t func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_size_t(name, func)); +void emit_constraint_size_t(const char* name, CommandLineFlagConstraintFunc_size_t func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_size_t(name, func, CommandLineFlagConstraint::change_to_enum(type))); } -void emit_constraint_double(const char* name, CommandLineFlagConstraintFunc_double func) { - CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_double(name, func)); +void emit_constraint_double(const char* name, CommandLineFlagConstraintFunc_double func, const char* type) { + CommandLineFlagConstraintList::add(new CommandLineFlagConstraint_double(name, func, CommandLineFlagConstraint::change_to_enum(type))); } // Generate code to call emit_constraint_xxx function @@ -201,11 +234,12 @@ #define EMIT_CONSTRAINT_LP64_PRODUCT_FLAG(type, name, value, doc) ); emit_constraint_##type(#name // Generate func argument to pass into emit_constraint_xxx functions -#define EMIT_CONSTRAINT_CHECK(func) , func +#define EMIT_CONSTRAINT_CHECK(func, type) , func, #type // the "name" argument must be a string literal #define INITIAL_CONTRAINTS_SIZE 16 GrowableArray* CommandLineFlagConstraintList::_constraints = NULL; +CommandLineFlagConstraint::ConstraintType CommandLineFlagConstraintList::_validating_type = CommandLineFlagConstraint::AtParse; // Check the ranges of all flags that have them or print them out and exit if requested void CommandLineFlagConstraintList::init(void) { @@ -273,11 +307,13 @@ #endif // INCLUDE_ALL_GCS } -CommandLineFlagConstraint* CommandLineFlagConstraintList::find(const char* name) { +// Find constraints by name and return only if found constraint's type is equal or lower than current validating type. +CommandLineFlagConstraint* CommandLineFlagConstraintList::find_if_needs_check(const char* name) { CommandLineFlagConstraint* found = NULL; for (int i=0; iname(), name) == 0) { + if ((strcmp(constraint->name(), name) == 0) && + (constraint->type() <= _validating_type)) { found = constraint; break; }