@@ -178,33 +178,30 @@ template <> void DCmdArgument<bool>::init_value(TRAPS) {
178178
179179template <> void DCmdArgument<bool >::destroy_value() { }
180180
181+ template <> void DCmdArgument<char *>::destroy_value() {
182+ FREE_C_HEAP_ARRAY (char , _value);
183+ set_value (nullptr );
184+ }
185+
181186template <> void DCmdArgument<char *>::parse_value(const char * str,
182187 size_t len, TRAPS) {
183188 if (str == nullptr ) {
184- _value = nullptr ;
189+ destroy_value () ;
185190 } else {
186- _value = NEW_C_HEAP_ARRAY (char , len + 1 , mtInternal);
191+ // Use realloc as we may have a default set.
192+ _value = REALLOC_C_HEAP_ARRAY (char , _value, len + 1 , mtInternal);
187193 int n = os::snprintf (_value, len + 1 , " %.*s" , (int )len, str);
188194 assert ((size_t )n <= len, " Unexpected number of characters in string" );
189195 }
190196}
191197
192198template <> void DCmdArgument<char *>::init_value(TRAPS) {
193- if (has_default () && _default_string != nullptr ) {
199+ set_value (nullptr ); // Must be initialized before calling parse_value
200+ if (has_default ()) {
194201 this ->parse_value (_default_string, strlen (_default_string), THREAD);
195- if (HAS_PENDING_EXCEPTION) {
196- fatal (" Default string must be parsable" );
197- }
198- } else {
199- set_value (nullptr );
200202 }
201203}
202204
203- template <> void DCmdArgument<char *>::destroy_value() {
204- FREE_C_HEAP_ARRAY (char , _value);
205- set_value (nullptr );
206- }
207-
208205template <> void DCmdArgument<NanoTimeArgument>::parse_value(const char * str,
209206 size_t len, TRAPS) {
210207 if (str == nullptr ) {
0 commit comments