comparison src/share/vm/services/diagnosticArgument.cpp @ 10405:f2110083203d

8005849: JEP 167: Event-Based JVM Tracing Reviewed-by: acorn, coleenp, sla Contributed-by: Karen Kinnear <karen.kinnear@oracle.com>, Bengt Rutisson <bengt.rutisson@oracle.com>, Calvin Cheung <calvin.cheung@oracle.com>, Erik Gahlin <erik.gahlin@oracle.com>, Erik Helin <erik.helin@oracle.com>, Jesper Wilhelmsson <jesper.wilhelmsson@oracle.com>, Keith McGuigan <keith.mcguigan@oracle.com>, Mattias Tobiasson <mattias.tobiasson@oracle.com>, Markus Gronlund <markus.gronlund@oracle.com>, Mikael Auno <mikael.auno@oracle.com>, Nils Eliasson <nils.eliasson@oracle.com>, Nils Loodin <nils.loodin@oracle.com>, Rickard Backman <rickard.backman@oracle.com>, Staffan Larsen <staffan.larsen@oracle.com>, Stefan Karlsson <stefan.karlsson@oracle.com>, Yekaterina Kantserova <yekaterina.kantserova@oracle.com>
author sla
date Mon, 10 Jun 2013 11:30:51 +0200
parents b0301c02f38e
children ef57c43512d6
comparison
equal deleted inserted replaced
10404:d0add7016434 10405:f2110083203d
22 * 22 *
23 */ 23 */
24 24
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "memory/allocation.inline.hpp" 26 #include "memory/allocation.inline.hpp"
27 #include "memory/resourceArea.hpp"
27 #include "runtime/thread.hpp" 28 #include "runtime/thread.hpp"
28 #include "services/diagnosticArgument.hpp" 29 #include "services/diagnosticArgument.hpp"
29 30
30 void GenDCmdArgument::read_value(const char* str, size_t len, TRAPS) { 31 void GenDCmdArgument::read_value(const char* str, size_t len, TRAPS) {
31 /* NOTE:Some argument types doesn't require a value, 32 /* NOTE:Some argument types doesn't require a value,
84 } 85 }
85 } 86 }
86 87
87 template <> void DCmdArgument<jlong>::parse_value(const char* str, 88 template <> void DCmdArgument<jlong>::parse_value(const char* str,
88 size_t len, TRAPS) { 89 size_t len, TRAPS) {
89 if (str == NULL || sscanf(str, JLONG_FORMAT, &_value) != 1) { 90 int scanned = -1;
90 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 91 if (str == NULL
91 "Integer parsing error in diagnostic command arguments\n"); 92 || sscanf(str, JLONG_FORMAT"%n", &_value, &scanned) != 1
93 || (size_t)scanned != len)
94 {
95 ResourceMark rm;
96
97 char* buf = NEW_RESOURCE_ARRAY(char, len + 1);
98 strncpy(buf, str, len);
99 buf[len] = '\0';
100 Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(),
101 "Integer parsing error in command argument '%s'. Could not parse: %s.", _name, buf);
92 } 102 }
93 } 103 }
94 104
95 template <> void DCmdArgument<jlong>::init_value(TRAPS) { 105 template <> void DCmdArgument<jlong>::init_value(TRAPS) {
96 if (has_default()) { 106 if (has_default()) {
97 this->parse_value(_default_string, strlen(_default_string), THREAD); 107 this->parse_value(_default_string, strlen(_default_string), THREAD);
98 if (HAS_PENDING_EXCEPTION) { 108 if (HAS_PENDING_EXCEPTION) {
99 fatal("Default string must be parsable"); 109 fatal("Default string must be parseable");
100 } 110 }
101 } else { 111 } else {
102 set_value(0); 112 set_value(0);
103 } 113 }
104 } 114 }
114 if (len == strlen("true") && strncasecmp(str, "true", len) == 0) { 124 if (len == strlen("true") && strncasecmp(str, "true", len) == 0) {
115 set_value(true); 125 set_value(true);
116 } else if (len == strlen("false") && strncasecmp(str, "false", len) == 0) { 126 } else if (len == strlen("false") && strncasecmp(str, "false", len) == 0) {
117 set_value(false); 127 set_value(false);
118 } else { 128 } else {
119 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 129 ResourceMark rm;
120 "Boolean parsing error in diagnostic command arguments"); 130
131 char* buf = NEW_RESOURCE_ARRAY(char, len + 1);
132 strncpy(buf, str, len);
133 buf[len] = '\0';
134 Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(),
135 "Boolean parsing error in command argument '%s'. Could not parse: %s.", _name, buf);
121 } 136 }
122 } 137 }
123 } 138 }
124 139
125 template <> void DCmdArgument<bool>::init_value(TRAPS) { 140 template <> void DCmdArgument<bool>::init_value(TRAPS) {
166 181
167 template <> void DCmdArgument<NanoTimeArgument>::parse_value(const char* str, 182 template <> void DCmdArgument<NanoTimeArgument>::parse_value(const char* str,
168 size_t len, TRAPS) { 183 size_t len, TRAPS) {
169 if (str == NULL) { 184 if (str == NULL) {
170 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 185 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
171 "Integer parsing error nanotime value: syntax error"); 186 "Integer parsing error nanotime value: syntax error, value is null");
172 } 187 }
173 188
174 int argc = sscanf(str, JLONG_FORMAT, &_value._time); 189 int argc = sscanf(str, JLONG_FORMAT, &_value._time);
175 if (argc != 1) { 190 if (argc != 1) {
176 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 191 THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),