hotspot/src/share/vm/services/diagnosticArgument.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 13195 be27e1b6a4b9
child 15228 e92acc84ade3
child 14847 92a59a418262
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     1
/*
11596
3b9802e6c6a2 7131346: Parsing of boolean arguments to diagnostic commands is broken
fparain
parents: 11209
diff changeset
     2
 * Copyright (c) 2011, 2012 Oracle and/or its affiliates. All rights reserved.
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     4
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     7
 * published by the Free Software Foundation.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     8
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    13
 * accompanied this code).
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    14
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    18
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    21
 * questions.
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    22
 *
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    23
 */
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    24
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    25
#include "precompiled.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    26
#include "memory/allocation.inline.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    27
#include "runtime/thread.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    28
#include "services/diagnosticArgument.hpp"
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    29
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    30
void GenDCmdArgument::read_value(const char* str, size_t len, TRAPS) {
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    31
  /* NOTE:Some argument types doesn't require a value,
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    32
   * for instance boolean arguments: "enableFeatureX". is
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    33
   * equivalent to "enableFeatureX=true". In these cases,
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    34
   * str will be null. This is perfectly valid.
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    35
   * All argument types must perform null checks on str.
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    36
   */
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    37
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    38
  if (is_set() && !allow_multiple()) {
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    39
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    40
            "Duplicates in diagnostic command arguments\n");
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    41
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    42
  parse_value(str, len, CHECK);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    43
  set_is_set(true);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    44
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    45
12262
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    46
void GenDCmdArgument::to_string(jlong l, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    47
  jio_snprintf(buf, len, INT64_FORMAT, l);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    48
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    49
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    50
void GenDCmdArgument::to_string(bool b, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    51
  jio_snprintf(buf, len, b ? "true" : "false");
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    52
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    53
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    54
void GenDCmdArgument::to_string(NanoTimeArgument n, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    55
  jio_snprintf(buf, len, INT64_FORMAT, n._nanotime);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    56
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    57
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    58
void GenDCmdArgument::to_string(MemorySizeArgument m, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    59
  jio_snprintf(buf, len, INT64_FORMAT, m._size);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    60
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    61
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    62
void GenDCmdArgument::to_string(char* c, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    63
  jio_snprintf(buf, len, "%s", c);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    64
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    65
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    66
void GenDCmdArgument::to_string(StringArrayArgument* f, char* buf, size_t len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    67
  int length = f->array()->length();
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    68
  size_t written = 0;
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    69
  buf[0] = 0;
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    70
  for (int i = 0; i < length; i++) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    71
    char* next_str = f->array()->at(i);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    72
    size_t next_size = strlen(next_str);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    73
    //Check if there's room left to write next element
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    74
    if (written + next_size > len) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    75
      return;
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    76
    }
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    77
    //Actually write element
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    78
    strcat(buf, next_str);
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    79
    written += next_size;
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    80
    //Check if there's room left for the comma
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    81
    if (i < length-1 && len - written > 0) {
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    82
      strcat(buf, ",");
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    83
    }
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    84
  }
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    85
}
fb3b9fede660 7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents: 11776
diff changeset
    86
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    87
template <> void DCmdArgument<jlong>::parse_value(const char* str,
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    88
                                                  size_t len, TRAPS) {
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    89
    if (str == NULL || sscanf(str, INT64_FORMAT, &_value) != 1) {
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    90
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
    91
      "Integer parsing error in diagnostic command arguments\n");
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    92
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    93
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    94
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    95
template <> void DCmdArgument<jlong>::init_value(TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    96
  if (has_default()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    97
    this->parse_value(_default_string, strlen(_default_string), THREAD);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    98
    if (HAS_PENDING_EXCEPTION) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
    99
      fatal("Default string must be parsable");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   100
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   101
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   102
    set_value(0);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   103
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   104
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   105
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   106
template <> void DCmdArgument<jlong>::destroy_value() { }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   107
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   108
template <> void DCmdArgument<bool>::parse_value(const char* str,
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   109
                                                 size_t len, TRAPS) {
11596
3b9802e6c6a2 7131346: Parsing of boolean arguments to diagnostic commands is broken
fparain
parents: 11209
diff changeset
   110
  // len is the length of the current token starting at str
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   111
  if (len == 0) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   112
    set_value(true);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   113
  } else {
11596
3b9802e6c6a2 7131346: Parsing of boolean arguments to diagnostic commands is broken
fparain
parents: 11209
diff changeset
   114
    if (len == strlen("true") && strncasecmp(str, "true", len) == 0) {
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   115
       set_value(true);
11596
3b9802e6c6a2 7131346: Parsing of boolean arguments to diagnostic commands is broken
fparain
parents: 11209
diff changeset
   116
    } else if (len == strlen("false") && strncasecmp(str, "false", len) == 0) {
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   117
       set_value(false);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   118
    } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   119
      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   120
        "Boolean parsing error in diagnostic command arguments");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   121
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   122
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   123
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   124
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   125
template <> void DCmdArgument<bool>::init_value(TRAPS) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   126
  if (has_default()) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   127
    this->parse_value(_default_string, strlen(_default_string), THREAD);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   128
    if (HAS_PENDING_EXCEPTION) {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   129
      fatal("Default string must be parsable");
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   130
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   131
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   132
    set_value(false);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   133
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   134
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   135
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   136
template <> void DCmdArgument<bool>::destroy_value() { }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   137
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   138
template <> void DCmdArgument<char*>::parse_value(const char* str,
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   139
                                                  size_t len, TRAPS) {
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   140
  if (str == NULL) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   141
    _value = NULL;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   142
  } else {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12262
diff changeset
   143
    _value = NEW_C_HEAP_ARRAY(char, len+1, mtInternal);
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   144
    strncpy(_value, str, len);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   145
    _value[len] = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   146
  }
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   147
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   148
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   149
template <> void DCmdArgument<char*>::init_value(TRAPS) {
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   150
  if (has_default() && _default_string != NULL) {
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   151
    this->parse_value(_default_string, strlen(_default_string), THREAD);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   152
    if (HAS_PENDING_EXCEPTION) {
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   153
     fatal("Default string must be parsable");
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   154
    }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   155
  } else {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   156
    set_value(NULL);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   157
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   158
}
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   159
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   160
template <> void DCmdArgument<char*>::destroy_value() {
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   161
  if (_value != NULL) {
13195
be27e1b6a4b9 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 12262
diff changeset
   162
    FREE_C_HEAP_ARRAY(char, _value, mtInternal);
11209
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   163
    set_value(NULL);
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   164
  }
110525ac80b0 7104647: Adding a diagnostic command framework
fparain
parents:
diff changeset
   165
}
11776
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   166
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   167
template <> void DCmdArgument<NanoTimeArgument>::parse_value(const char* str,
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   168
                                                 size_t len, TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   169
  if (str == NULL) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   170
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   171
              "Integer parsing error nanotime value: syntax error");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   172
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   173
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   174
  int argc = sscanf(str, INT64_FORMAT , &_value._time);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   175
  if (argc != 1) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   176
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   177
              "Integer parsing error nanotime value: syntax error");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   178
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   179
  size_t idx = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   180
  while(idx < len && isdigit(str[idx])) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   181
    idx++;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   182
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   183
  if (idx == len) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   184
    // only accept missing unit if the value is 0
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   185
    if (_value._time != 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   186
      THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   187
                "Integer parsing error nanotime value: unit required");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   188
    } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   189
      _value._nanotime = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   190
      strcpy(_value._unit, "ns");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   191
      return;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   192
    }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   193
  } else if(len - idx > 2) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   194
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   195
              "Integer parsing error nanotime value: illegal unit");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   196
  } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   197
    strncpy(_value._unit, &str[idx], len - idx);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   198
    /*Write an extra null termination. This is safe because _value._unit
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   199
     * is declared as char[3], and length is checked to be not larger than
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   200
     * two above. Also, this is necessary, since length might be 1, and the
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   201
     * default value already in the string is ns, which is two chars.
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   202
     */
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   203
    _value._unit[len-idx] = '\0';
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   204
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   205
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   206
  if (strcmp(_value._unit, "ns") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   207
    _value._nanotime = _value._time;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   208
  } else if (strcmp(_value._unit, "us") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   209
    _value._nanotime = _value._time * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   210
  } else if (strcmp(_value._unit, "ms") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   211
    _value._nanotime = _value._time * 1000 * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   212
  } else if (strcmp(_value._unit, "s") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   213
    _value._nanotime = _value._time * 1000 * 1000 * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   214
  } else if (strcmp(_value._unit, "m") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   215
    _value._nanotime = _value._time * 60 * 1000 * 1000 * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   216
  } else if (strcmp(_value._unit, "h") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   217
    _value._nanotime = _value._time * 60 * 60 * 1000 * 1000 * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   218
  } else if (strcmp(_value._unit, "d") == 0) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   219
    _value._nanotime = _value._time * 24 * 60 * 60 * 1000 * 1000 * 1000;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   220
  } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   221
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   222
               "Integer parsing error nanotime value: illegal unit");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   223
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   224
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   225
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   226
template <> void DCmdArgument<NanoTimeArgument>::init_value(TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   227
  if (has_default()) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   228
    this->parse_value(_default_string, strlen(_default_string), THREAD);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   229
    if (HAS_PENDING_EXCEPTION) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   230
      fatal("Default string must be parsable");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   231
    }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   232
  } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   233
    _value._time = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   234
    _value._nanotime = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   235
    strcmp(_value._unit, "ns");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   236
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   237
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   238
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   239
template <> void DCmdArgument<NanoTimeArgument>::destroy_value() { }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   240
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   241
// WARNING StringArrayArgument can only be used as an option, it cannot be
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   242
// used as an argument with the DCmdParser
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   243
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   244
template <> void DCmdArgument<StringArrayArgument*>::parse_value(const char* str,
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   245
                                                  size_t len, TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   246
  _value->add(str,len);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   247
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   248
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   249
template <> void DCmdArgument<StringArrayArgument*>::init_value(TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   250
  _value = new StringArrayArgument();
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   251
  _allow_multiple = true;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   252
  if (has_default()) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   253
    fatal("StringArrayArgument cannot have default value");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   254
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   255
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   256
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   257
template <> void DCmdArgument<StringArrayArgument*>::destroy_value() {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   258
  if (_value != NULL) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   259
    delete _value;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   260
    set_value(NULL);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   261
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   262
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   263
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   264
template <> void DCmdArgument<MemorySizeArgument>::parse_value(const char* str,
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   265
                                                  size_t len, TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   266
  if (str == NULL) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   267
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   268
              "Integer parsing error nanotime value: syntax error");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   269
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   270
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   271
  if (*str == '-') {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   272
    THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   273
               "Parsing error memory size value: negative values not allowed");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   274
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   275
  int res = sscanf(str, UINT64_FORMAT "%c", &_value._val, &_value._multiplier);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   276
  if (res == 2) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   277
     switch (_value._multiplier) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   278
      case 'k': case 'K':
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   279
         _value._size = _value._val * 1024;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   280
         break;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   281
      case 'm': case 'M':
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   282
         _value._size = _value._val * 1024 * 1024;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   283
         break;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   284
      case 'g': case 'G':
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   285
         _value._size = _value._val * 1024 * 1024 * 1024;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   286
         break;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   287
       default:
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   288
         _value._size = _value._val;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   289
         _value._multiplier = ' ';
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   290
         //default case should be to break with no error, since user
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   291
         //can write size in bytes, or might have a delimiter and next arg
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   292
         break;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   293
     }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   294
   } else if (res == 1) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   295
     _value._size = _value._val;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   296
   } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   297
     THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   298
               "Parsing error memory size value: invalid value");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   299
   }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   300
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   301
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   302
template <> void DCmdArgument<MemorySizeArgument>::init_value(TRAPS) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   303
  if (has_default()) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   304
    this->parse_value(_default_string, strlen(_default_string), THREAD);
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   305
    if (HAS_PENDING_EXCEPTION) {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   306
      fatal("Default string must be parsable");
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   307
    }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   308
  } else {
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   309
    _value._size = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   310
    _value._val = 0;
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   311
    _value._multiplier = ' ';
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   312
  }
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   313
}
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   314
519643dbbefb 7145243: Need additional specializations for argument parsing framework
fparain
parents: 11596
diff changeset
   315
template <> void DCmdArgument<MemorySizeArgument>::destroy_value() { }