diff options
Diffstat (limited to 'features/org.eclipse.equinox.executable.feature/library/eclipse.c')
-rw-r--r-- | features/org.eclipse.equinox.executable.feature/library/eclipse.c | 54 |
1 files changed, 20 insertions, 34 deletions
diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipse.c b/features/org.eclipse.equinox.executable.feature/library/eclipse.c index fb01ab71c..fa7db0cfc 100644 --- a/features/org.eclipse.equinox.executable.feature/library/eclipse.c +++ b/features/org.eclipse.equinox.executable.feature/library/eclipse.c @@ -252,8 +252,6 @@ home directory."); #define PERM_GEN _T_ECLIPSE("--launcher.XXMaxPermSize") #define XXPERMGEN _T_ECLIPSE("-XX:MaxPermSize=") -#define ADDMODULES _T_ECLIPSE("--add-modules") -#define PERMIT_ILLEGAL_ACCESS _T_ECLIPSE("--permit-illegal-access") #define ACTION_OPENFILE _T_ECLIPSE("openFile") #define GTK_VERSION _T_ECLIPSE("--launcher.GTK_version") @@ -1037,40 +1035,28 @@ static _TCHAR** mergeConfigurationFilesVMArgs() { } static void adjustVMArgs(_TCHAR *javaVM, _TCHAR *jniLib, _TCHAR **vmArgv[]) { - /* JVMs whose version is >= 9 need an extra VM argument (--add-modules) to start eclipse but earlier versions - * do not recognize this argument, remove it from the list of VM arguments when the JVM version is below 9 */ + /* Sun/Oracle VMs below version 8 need some extra perm gen space */ + /* Detecting Sun VM is expensive - only do so if necessary */ + if (permGen != NULL) { + int specified = 0, i = -1; + + /* first check to see if it is already specified */ + while ((*vmArgv)[++i] != NULL) { + /* we are also counting the number of args here */ + if (!specified && _tcsncmp((*vmArgv)[i], XXPERMGEN, _tcslen(XXPERMGEN)) == 0) { + specified = 1; + } + } - int i = 0; + if (!specified && isMaxPermSizeVM(javaVM, jniLib)) { + _TCHAR ** oldArgs = *vmArgv; + _TCHAR *newArg = malloc((_tcslen(XXPERMGEN) + _tcslen(permGen) + 1) * sizeof(_TCHAR)); + _stprintf(newArg, _T_ECLIPSE("%s%s"), XXPERMGEN, permGen); - if (!isModularVM(javaVM, jniLib)) { - while ((*vmArgv)[i] != NULL) { - if (_tcsncmp((*vmArgv)[i], ADDMODULES, _tcslen(ADDMODULES)) == 0 || _tcsncmp((*vmArgv)[i], PERMIT_ILLEGAL_ACCESS, _tcslen(PERMIT_ILLEGAL_ACCESS)) == 0) { - int j = 0, k = 0; - - if ((_tcschr((*vmArgv)[i], '=') != NULL) && ((*vmArgv)[i][13] == '=')) { - /* --add-modules=<value> */ - j = i + 1; - } else if (_tcslen(ADDMODULES) == _tcslen((*vmArgv)[i])) { - /* --add-modules <value> OR --add-modules <end-of-vmArgv> */ - ((*vmArgv)[i + 1] != NULL) ? (j = i + 2) : (j = i + 1); - } else if (_tcslen(PERMIT_ILLEGAL_ACCESS) == _tcslen((*vmArgv)[i])) { - /* --permit-illegal-access */ - j = i + 1; - } else { - /* Probable new argument e.g. --add-modules-if-required or misspelled argument e.g. --add-modulesq */ - i++; - continue; - } - - /* shift all remaining arguments, but keep i, so that we can find repeated occurrences of --add-modules */ - k = i; - (*vmArgv)[k] = (*vmArgv)[j]; - while ((*vmArgv)[j] != NULL) { - (*vmArgv)[++k] = (*vmArgv)[++j]; - } - } else { - i++; - } + *vmArgv = malloc((i + 2) * sizeof(_TCHAR *)); + memcpy(*vmArgv, oldArgs, i * sizeof(_TCHAR *)); + (*vmArgv)[i] = newArg; + (*vmArgv)[i + 1] = 0; } } } |