From dcd15a168596fb59b04dcb5896252b3429dff115 Mon Sep 17 00:00:00 2001 From: Arun Thondapu Date: Wed, 31 May 2017 12:44:10 +0530 Subject: Bug 517507: Remove Java 9 hacks that were added to the launcher in Oxygen M7 Revert "Bug 493761: Platform won't launch on Java 9-ea builds (InjectionException: NoClassDefFoundError: javax/annotation/PostConstruct)" This reverts commit 4295e27d8e41283eadba7aa2e098126b22c5a7a9. This reverts commit 28ff351cfc1b33eb84c70b295e8a86bf8b70d21f. This reverts commit 2e0869c0e8cf5f4125a3237f22ed6f166a065fbb. --- .../library/cocoa/eclipseCocoa.c | 40 ++++++++-------- .../library/eclipse.c | 54 ++++++++-------------- .../library/eclipseNix.c | 26 ++++++----- .../library/eclipseOS.h | 4 +- .../library/win32/eclipseWin.c | 31 +++++++++---- 5 files changed, 81 insertions(+), 74 deletions(-) (limited to 'features') diff --git a/features/org.eclipse.equinox.executable.feature/library/cocoa/eclipseCocoa.c b/features/org.eclipse.equinox.executable.feature/library/cocoa/eclipseCocoa.c index 023223103..6bfa9def6 100644 --- a/features/org.eclipse.equinox.executable.feature/library/cocoa/eclipseCocoa.c +++ b/features/org.eclipse.equinox.executable.feature/library/cocoa/eclipseCocoa.c @@ -44,7 +44,7 @@ char *findCommand(char *command); char* defaultVM = "java"; char* vmLibrary = "JavaVM"; char* shippedVMDir = "../../jre/Contents/Home/bin/"; // relative to launcher -int isModularJVM = 0; +int isSunMaxPermSizeVM = 0; static void adjustLibraryPath(char * vmLibrary); static char * findLib(char * command); @@ -330,8 +330,7 @@ char** getArgVM( char* vm ) return result; } -/* set isModularJVM to 1 if the JVM version is >= 9, 0 otherwise */ -void checkJavaVersion(char* command) { +char * getJavaVersion(char* command) { FILE *fp; char buffer[4096]; char *version = NULL, *firstChar; @@ -339,7 +338,7 @@ void checkJavaVersion(char* command) { sprintf(buffer,"%s -version 2>&1", command); fp = popen(buffer, "r"); if (fp == NULL) { - return; + return NULL; } while (fgets(buffer, sizeof(buffer)-1, fp) != NULL) { if (!version) { @@ -355,20 +354,25 @@ void checkJavaVersion(char* command) { version[numChars] = '\0'; } } - if (version != NULL) { - char *str = version; - /* According to the new Java version-string scheme, the first element is - * the major version number, details at http://openjdk.java.net/jeps/223 */ - char *majorVersion = strtok(str, ".-"); - if (majorVersion != NULL && (strtol(majorVersion, NULL, 10) >= 9)) { - isModularJVM = 1; + if (strstr(buffer, "Java HotSpot(TM)") || strstr(buffer, "OpenJDK")) { + if (version != NULL) { + _TCHAR *value = strtok(version, "."); + if (value != NULL && (strtol(value, NULL, 10) == 1)) { + value = strtok(NULL, "."); + if (strtol(value, NULL, 10) < 8) { + isSunMaxPermSizeVM = 1; + } + } } - free(version); + break; + } + if (strstr(buffer, "IBM") != NULL) { + isSunMaxPermSizeVM = 0; + break; } - break; } pclose(fp); - return; + return version; } char * getJavaHome() { @@ -425,8 +429,8 @@ char * findVMLibrary( char* command ) { if (strstr(cmd, "/JavaVM.framework/") != NULL && (strstr(cmd, "/Current/") != NULL || strstr(cmd, "/A/") != NULL)) { cmd = getJavaHome(); } - // This is necessary to initialize isModularJVM - checkJavaVersion(cmd); + // This is necessary to initialize isSunMaxPermSizeVM + getJavaVersion(cmd); result = JAVA_FRAMEWORK; if (strstr(cmd, "/JavaVM.framework/") == NULL) { char * lib = findLib(cmd); @@ -621,8 +625,8 @@ void processVMArgs(char **vmargs[] ) } } -int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ) { - return isModularJVM; +int isMaxPermSizeVM( _TCHAR * javaVM, _TCHAR * jniLib ) { + return isSunMaxPermSizeVM; } NSString* getApplicationSupport() { 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= */ - j = i + 1; - } else if (_tcslen(ADDMODULES) == _tcslen((*vmArgv)[i])) { - /* --add-modules OR --add-modules */ - ((*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; } } } diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c b/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c index 5cfced7a0..bda8b3cb9 100644 --- a/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c +++ b/features/org.eclipse.equinox.executable.feature/library/eclipseNix.c @@ -168,8 +168,7 @@ JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], return startJavaJNI(libPath, vmArgs, progArgs, jarFile); } -/* returns 1 if the JVM version is >= 9, 0 otherwise */ -int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ) { +int isMaxPermSizeVM( _TCHAR * javaVM, _TCHAR * jniLib ) { if (javaVM == NULL) { return 0; } @@ -195,17 +194,22 @@ int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ) { version[numChars] = '\0'; } } - if (version != NULL) { - _TCHAR *str = version; - /* According to the new Java version-string scheme, the first element is - * the major version number, details at http://openjdk.java.net/jeps/223 */ - _TCHAR *majorVersion = _tcstok(str, ".-"); - if (majorVersion != NULL && (_tcstol(majorVersion, NULL, 10) >= 9)) { - result = 1; + if (_tcsstr(buffer, "Java HotSpot(TM)") || _tcsstr(buffer, "OpenJDK")) { + if (version != NULL) { + _TCHAR *value = _tcstok(version, "."); + if (value != NULL && (_tcstol(value, NULL, 10) == 1)) { + value = _tcstok(NULL, "."); + if (_tcstol(value, NULL, 10) < 8) { + result = 1; + } + } } - free(version); + break; + } + if (_tcsstr(buffer, "IBM") != NULL) { + result = 0; + break; } - break; } pclose(fp); return result; diff --git a/features/org.eclipse.equinox.executable.feature/library/eclipseOS.h b/features/org.eclipse.equinox.executable.feature/library/eclipseOS.h index 0b2b6a782..7e78322b1 100644 --- a/features/org.eclipse.equinox.executable.feature/library/eclipseOS.h +++ b/features/org.eclipse.equinox.executable.feature/library/eclipseOS.h @@ -110,8 +110,8 @@ extern JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* prog /* do any platform specific processing of the user vmargs */ extern void processVMArgs(_TCHAR **vmargs[] ); -/* is this a JVM whose version is >= 9 (then allow the --add-modules VM argument), returns 0 if we don't know */ -extern int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ); +/* is this a Sun/Oracle VM whose version is < 8 (then it needs extra perm gen space), returns 0 if we don't know */ +extern int isMaxPermSizeVM( _TCHAR * javaVM, _TCHAR * jniLib ); /* an array of paths that will need to be on the search path to load the vm shared library */ extern _TCHAR ** getVMLibrarySearchPath(_TCHAR * vmLibrary); diff --git a/features/org.eclipse.equinox.executable.feature/library/win32/eclipseWin.c b/features/org.eclipse.equinox.executable.feature/library/win32/eclipseWin.c index 73a394344..4df9e99dd 100644 --- a/features/org.eclipse.equinox.executable.feature/library/win32/eclipseWin.c +++ b/features/org.eclipse.equinox.executable.feature/library/win32/eclipseWin.c @@ -77,7 +77,10 @@ typedef struct { WORD codepage; } TRANSLATIONS; +#define COMPANY_NAME_KEY _T_ECLIPSE("\\StringFileInfo\\%04x%04x\\CompanyName") #define PRODUCT_VERSION_KEY _T_ECLIPSE("\\StringFileInfo\\%04x%04x\\ProductVersion") +#define SUN_MICROSYSTEMS _T_ECLIPSE("Sun Microsystems") +#define ORACLE _T_ECLIPSE("Oracle") static void sendOpenFileMessage(HWND window) { _TCHAR* id; @@ -597,16 +600,16 @@ JavaResults* startJavaVM( _TCHAR* libPath, _TCHAR* vmArgs[], _TCHAR* progArgs[], return startJavaJNI(libPath, vmArgs, progArgs, jarFile); } -/* returns 1 if the JVM version is >= 9, 0 otherwise */ -int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ) { +int isMaxPermSizeVM( _TCHAR * javaVM, _TCHAR * jniLib ) { _TCHAR *vm = (jniLib != NULL) ? jniLib : javaVM; int result = 0; DWORD infoSize; DWORD handle; void * info; - _TCHAR *versionKey, *version, *majorVersion = NULL; - int versionSize; + _TCHAR *key, *value, *versionKey, *version, *majorVersion = NULL; + size_t i; + int valueSize, versionSize; if (vm == NULL) return 0; @@ -620,15 +623,25 @@ int isModularVM( _TCHAR * javaVM, _TCHAR * jniLib ) { VerQueryValue(info, _T_ECLIPSE("\\VarFileInfo\\Translation"), (void *) &translations, &translationsSize); /* this size is only right because %04x is 4 characters */ + key = malloc((_tcslen(COMPANY_NAME_KEY) + 1) * sizeof(_TCHAR)); versionKey = malloc((_tcslen(PRODUCT_VERSION_KEY) + 1) * sizeof(_TCHAR)); - _stprintf(versionKey, PRODUCT_VERSION_KEY, translations[0].language, translations[0].codepage); - VerQueryValue(info, versionKey, (void *)&version, &versionSize); - if (versionSize >= 1) { - majorVersion = _tcstok(version, ".-"); - if ((majorVersion != NULL) && (_tcstol(majorVersion, NULL, 10) >= 9)) { + for (i = 0; i < (translationsSize / sizeof(TRANSLATIONS)); i++) { + _stprintf(key, COMPANY_NAME_KEY, translations[i].language, translations[i].codepage); + VerQueryValue(info, key, (void *)&value, &valueSize); + + if ((_tcsncmp(value, SUN_MICROSYSTEMS, _tcslen(SUN_MICROSYSTEMS)) == 0) || (_tcsncmp(value, ORACLE, _tcslen(ORACLE)) == 0)) { + _stprintf(versionKey, PRODUCT_VERSION_KEY, translations[i].language, translations[i].codepage); + VerQueryValue(info, versionKey, (void *)&version, &versionSize); + if (versionSize > 1) { + majorVersion = _tcstok(version, "."); + } + if ((majorVersion != NULL) && (_tcstol(majorVersion, NULL, 10) < 8)) { result = 1; } + break; } + } + free(key); free(versionKey); } free(info); -- cgit v1.2.3