Skip to content

Commit 4a7e94e

Browse files
committed
Clean up launcher option parsing using C++17 std::string_view.
1 parent aab94ef commit 4a7e94e

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed

sdk/src/org.graalvm.launcher.native/src/launcher.cc

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,14 @@
103103
#define VM_LIBRARY_PATH_ARG_OFFSET (sizeof(VM_LIBRARY_PATH_ARG_PREFIX)-1)
104104
#define VM_STACK_SIZE_ARG_OFFSET (sizeof(VM_STACK_SIZE_ARG_PREFIX)-1)
105105

106-
#define IS_VM_ARG(ARG) (ARG.rfind(VM_ARG_PREFIX, 0) != std::string::npos)
107-
#define IS_VM_CP_ARG(ARG) (ARG.rfind(VM_CP_ARG_PREFIX, 0) != std::string::npos)
108-
#define IS_VM_CLASSPATH_ARG(ARG) (ARG.rfind(VM_CLASSPATH_ARG_PREFIX, 0) != std::string::npos)
109-
#define IS_VM_P_ARG(ARG) (ARG.rfind(VM_P_ARG_PREFIX, 0) != std::string::npos)
110-
#define IS_VM_MODULE_PATH_ARG(ARG) (ARG.rfind(VM_MODULE_PATH_ARG_PREFIX, 0) != std::string::npos)
111-
#define IS_VM_LIBRARY_PATH_ARG(ARG) (ARG.rfind(VM_LIBRARY_PATH_ARG_PREFIX, 0) != std::string::npos)
112-
#define IS_VM_STACK_SIZE_ARG(ARG) (ARG.rfind(VM_STACK_SIZE_ARG_PREFIX, 0) != std::string::npos)
106+
#define STARTS_WITH(ARG, PREFIX) (ARG.rfind(PREFIX, 0) != std::string::npos)
107+
#define IS_VM_ARG(ARG) STARTS_WITH(ARG, VM_ARG_PREFIX)
108+
#define IS_VM_CP_ARG(ARG) STARTS_WITH(ARG, VM_CP_ARG_PREFIX)
109+
#define IS_VM_CLASSPATH_ARG(ARG) STARTS_WITH(ARG, VM_CLASSPATH_ARG_PREFIX)
110+
#define IS_VM_P_ARG(ARG) STARTS_WITH(ARG, VM_P_ARG_PREFIX)
111+
#define IS_VM_MODULE_PATH_ARG(ARG) STARTS_WITH(ARG, VM_MODULE_PATH_ARG_PREFIX)
112+
#define IS_VM_LIBRARY_PATH_ARG(ARG) STARTS_WITH(ARG, VM_LIBRARY_PATH_ARG_PREFIX)
113+
#define IS_VM_STACK_SIZE_ARG(ARG) STARTS_WITH(ARG, VM_STACK_SIZE_ARG_PREFIX)
113114

114115
#define NMT_ARG_NAME "XX:NativeMemoryTracking"
115116
#define NMT_ENV_NAME "NMT_LEVEL_"
@@ -343,15 +344,15 @@ static std::string vm_path(std::string exeDir, bool jvmMode) {
343344
return liblangPath.str();
344345
}
345346

346-
static size_t parse_size(const char* str);
347+
static size_t parse_size(std::string_view str);
347348

348349
static void parse_vm_option(
349350
std::vector<std::string> *vmArgs,
350351
std::stringstream *cp,
351352
std::stringstream *modulePath,
352353
std::stringstream *libraryPath,
353354
size_t* stack_size,
354-
std::string option) {
355+
std::string_view option) {
355356
if (IS_VM_CP_ARG(option)) {
356357
*cp << CP_SEP_STR << option.substr(VM_CP_ARG_OFFSET);
357358
} else if (IS_VM_CLASSPATH_ARG(option)) {
@@ -364,7 +365,7 @@ static void parse_vm_option(
364365
*libraryPath << CP_SEP_STR << option.substr(VM_LIBRARY_PATH_ARG_OFFSET);
365366
} else if (IS_VM_ARG(option)) {
366367
if (IS_VM_STACK_SIZE_ARG(option)) {
367-
*stack_size = parse_size(option.substr(VM_STACK_SIZE_ARG_OFFSET).c_str());
368+
*stack_size = parse_size(option.substr(VM_STACK_SIZE_ARG_OFFSET));
368369
}
369370
std::stringstream opt;
370371
opt << '-' << option.substr(VM_ARG_OFFSET);
@@ -550,7 +551,7 @@ static void parse_vm_options(struct MainThreadArgs& parsedArgs) {
550551
if (!relaunch) {
551552
/* handle CLI arguments */
552553
for (int i = 1; i < argc; i++) {
553-
parse_vm_option(&vmArgs, &cp, &modulePath, &libraryPath, &stack_size, std::string(argv[i]));
554+
parse_vm_option(&vmArgs, &cp, &modulePath, &libraryPath, &stack_size, argv[i]);
554555
}
555556

556557
/* handle optional vm args from LanguageLibraryConfig.option_vars */
@@ -595,7 +596,7 @@ static void parse_vm_options(struct MainThreadArgs& parsedArgs) {
595596
std::cerr << "VM arguments specified: " << vmArgCount << " but argument " << i << "missing" << std::endl;
596597
break;
597598
}
598-
parse_vm_option(&vmArgs, &cp, &modulePath, &libraryPath, &stack_size, std::string(cur));
599+
parse_vm_option(&vmArgs, &cp, &modulePath, &libraryPath, &stack_size, cur);
599600
/* clean up env variable */
600601
setenv(envKey, "");
601602
}
@@ -1039,20 +1040,20 @@ static int jvm_main_thread(struct MainThreadArgs& parsedArgs) {
10391040
* Returns the parsed size in bytes or 0 if invalid.
10401041
* Inspired by: https://github.com/openjdk/jdk/blob/8c1b915c7ef2b3a6e65705b91f4eb464caaec4e7/src/java.base/share/native/libjli/java.c#L920-L954
10411042
*/
1042-
static size_t parse_size(const char* str) {
1043-
const char* s = str;
1043+
static size_t parse_size(std::string_view str) {
10441044
size_t n = 0;
1045-
while (*s >= '0' && *s <= '9') {
1046-
int digit = *s - '0';
1045+
size_t pos = 0;
1046+
while (pos < str.size() && str[pos] >= '0' && str[pos] <= '9') {
1047+
int digit = str[pos] - '0';
10471048
n = n * 10 + digit;
1048-
s++;
1049+
pos++;
10491050
}
1050-
if (s == str || strlen(s) > 1) {
1051+
if (pos == 0 || str.size() - pos != 1) {
10511052
// invalid
10521053
return 0;
10531054
}
10541055
size_t multiplier = 1;
1055-
switch (*s) {
1056+
switch (str[pos]) {
10561057
case 'T':
10571058
case 't':
10581059
multiplier *= 1024;

0 commit comments

Comments
 (0)