Skip to content

Commit 32bb1bf

Browse files
committed
8307160: Fix AWT/2D/A11Y to support the permissive- flag on the Microsoft Visual C compiler
Reviewed-by: rschmelter Backport-of: 8bc1867da78ea0b7664892ee277af413ef503b61
1 parent 6a9bd77 commit 32bb1bf

File tree

12 files changed

+378
-144
lines changed

12 files changed

+378
-144
lines changed

make/autoconf/flags-cflags.m4

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,8 @@ AC_DEFUN([FLAGS_SETUP_CFLAGS_HELPER],
625625
TOOLCHAIN_CFLAGS_JVM="-qtbtable=full -qtune=balanced -fno-exceptions \
626626
-qalias=noansi -qstrict -qtls=default -qnortti -qnoeh -qignerrno -qstackprotect"
627627
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
628-
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -Zc:strictStrings -permissive- -MP"
629-
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -Zc:strictStrings -Zc:wchar_t-"
628+
TOOLCHAIN_CFLAGS_JVM="-nologo -MD -Zc:preprocessor -permissive- -MP"
629+
TOOLCHAIN_CFLAGS_JDK="-nologo -MD -Zc:preprocessor -permissive- -Zc:wchar_t-"
630630
fi
631631
632632
# CFLAGS C language level for JDK sources (hotspot only uses C++)

src/java.desktop/windows/native/libawt/java2d/d3d/D3DGlyphCache.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
#include "D3DTextRenderer.h"
2828
#include "D3DRenderQueue.h"
2929

30-
void D3DGlyphCache_FlushGlyphVertexCache();
30+
static void D3DGlyphCache_FlushGlyphVertexCache();
3131

3232
// static
3333
HRESULT

src/java.desktop/windows/native/libawt/windows/awt_Canvas.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -206,19 +206,31 @@ void AwtCanvas::_SetEraseBackground(void *param)
206206
{
207207
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
208208

209-
SetEraseBackgroundStruct *sebs = (SetEraseBackgroundStruct *)param;
209+
SetEraseBackgroundStruct *sebs = static_cast<SetEraseBackgroundStruct *>(param);
210210
jobject canvas = sebs->canvas;
211211
jboolean doErase = sebs->doErase;
212212
jboolean doEraseOnResize = sebs->doEraseOnResize;
213213

214-
PDATA pData;
215-
JNI_CHECK_PEER_GOTO(canvas, ret);
214+
AwtCanvas *c = NULL;
215+
216+
if (canvas == NULL) {
217+
env->ExceptionClear();
218+
JNU_ThrowNullPointerException(env, "canvas");
219+
delete sebs;
220+
return;
221+
} else {
222+
c = (AwtCanvas*)JNI_GET_PDATA(canvas);
223+
if (c == NULL) {
224+
THROW_NULL_PDATA_IF_NOT_DESTROYED(canvas);
225+
env->DeleteGlobalRef(canvas);
226+
delete sebs;
227+
return;
228+
}
229+
}
216230

217-
AwtCanvas *c = (AwtCanvas*)pData;
218231
c->m_eraseBackground = doErase;
219232
c->m_eraseBackgroundOnResize = doEraseOnResize;
220233

221-
ret:
222234
env->DeleteGlobalRef(canvas);
223235
delete sebs;
224236
}

src/java.desktop/windows/native/libawt/windows/awt_Component.cpp

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6360,18 +6360,46 @@ void AwtComponent::_SetParent(void * param)
63606360
{
63616361
if (AwtToolkit::IsMainThread()) {
63626362
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
6363-
SetParentStruct *data = (SetParentStruct*) param;
6363+
SetParentStruct *data = static_cast<SetParentStruct*>(param);
63646364
jobject self = data->component;
63656365
jobject parent = data->parentComp;
63666366

63676367
AwtComponent *awtComponent = NULL;
63686368
AwtComponent *awtParent = NULL;
63696369

6370-
PDATA pData;
6371-
JNI_CHECK_PEER_GOTO(self, ret);
6372-
awtComponent = (AwtComponent *)pData;
6373-
JNI_CHECK_PEER_GOTO(parent, ret);
6374-
awtParent = (AwtComponent *)pData;
6370+
if (self == NULL) {
6371+
env->ExceptionClear();
6372+
JNU_ThrowNullPointerException(env, "self");
6373+
env->DeleteGlobalRef(parent);
6374+
delete data;
6375+
return;
6376+
} else {
6377+
awtComponent = (AwtComponent *)JNI_GET_PDATA(self);;
6378+
if (awtComponent == NULL) {
6379+
THROW_NULL_PDATA_IF_NOT_DESTROYED(self);
6380+
env->DeleteGlobalRef(self);
6381+
env->DeleteGlobalRef(parent);
6382+
delete data;
6383+
return;
6384+
}
6385+
}
6386+
6387+
if (parent == NULL) {
6388+
env->ExceptionClear();
6389+
JNU_ThrowNullPointerException(env, "parent");
6390+
env->DeleteGlobalRef(self);
6391+
delete data;
6392+
return;
6393+
} else {
6394+
awtParent = (AwtComponent *)JNI_GET_PDATA(parent);
6395+
if (awtParent == NULL) {
6396+
THROW_NULL_PDATA_IF_NOT_DESTROYED(parent);
6397+
env->DeleteGlobalRef(self);
6398+
env->DeleteGlobalRef(parent);
6399+
delete data;
6400+
return;
6401+
}
6402+
}
63756403

63766404
HWND selfWnd = awtComponent->GetHWnd();
63776405
HWND parentWnd = awtParent->GetHWnd();
@@ -6380,7 +6408,7 @@ void AwtComponent::_SetParent(void * param)
63806408
// (only the proxy may be the native focus owner).
63816409
::SetParent(selfWnd, parentWnd);
63826410
}
6383-
ret:
6411+
63846412
env->DeleteGlobalRef(self);
63856413
env->DeleteGlobalRef(parent);
63866414
delete data;
@@ -6539,19 +6567,31 @@ static void _GetInsets(void* param)
65396567
{
65406568
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
65416569

6542-
GetInsetsStruct *gis = (GetInsetsStruct *)param;
6570+
GetInsetsStruct *gis = static_cast<GetInsetsStruct *>(param);
65436571
jobject self = gis->window;
65446572

65456573
gis->insets->left = gis->insets->top =
65466574
gis->insets->right = gis->insets->bottom = 0;
65476575

6548-
PDATA pData;
6549-
JNI_CHECK_PEER_GOTO(self, ret);
6550-
AwtComponent *component = (AwtComponent *)pData;
6576+
AwtComponent *component = NULL;
6577+
6578+
if (self == NULL) {
6579+
env->ExceptionClear();
6580+
JNU_ThrowNullPointerException(env, "self");
6581+
delete gis;
6582+
return;
6583+
} else {
6584+
component = (AwtComponent *)JNI_GET_PDATA(self);
6585+
if (component == NULL) {
6586+
THROW_NULL_PDATA_IF_NOT_DESTROYED(self);
6587+
env->DeleteGlobalRef(self);
6588+
delete gis;
6589+
return;
6590+
}
6591+
}
65516592

65526593
component->GetInsets(gis->insets);
65536594

6554-
ret:
65556595
env->DeleteGlobalRef(self);
65566596
delete gis;
65576597
}

src/java.desktop/windows/native/libawt/windows/awt_DnDDS.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,15 @@ void * operator new(size_t size) {return operator new(size, "stl", 1);}
3939
#pragma pop_macro("bad_alloc")
4040
//"bad_alloc" is undefined from here
4141

42-
#include <awt.h>
4342
#include <shlobj.h>
4443

44+
// These files must be included before awt.h, since the latter redefines malloc
45+
// to Do_Not_Use_Malloc, etc, and that will break these files.
46+
#include "awt_ole.h"
47+
#include "awt_DCHolder.h"
48+
4549
#include "jlong.h"
50+
#include "awt.h"
4651
#include "awt_DataTransferer.h"
4752
#include "awt_DnDDS.h"
4853
#include "awt_DnDDT.h"
@@ -54,9 +59,6 @@ void * operator new(size_t size) {return operator new(size, "stl", 1);}
5459
#include "java_awt_dnd_DnDConstants.h"
5560
#include "sun_awt_windows_WDragSourceContextPeer.h"
5661

57-
#include "awt_ole.h"
58-
#include "awt_DCHolder.h"
59-
6062
bool operator < (const FORMATETC &fr, const FORMATETC &fl) {
6163
return memcmp(&fr, &fl, sizeof(FORMATETC)) < 0;
6264
}

src/java.desktop/windows/native/libawt/windows/awt_DnDDT.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@
2727
#include <shellapi.h>
2828
#include <memory.h>
2929

30+
// awt_ole.h must be included before awt.h, since the latter redefines malloc
31+
// to Do_Not_Use_Malloc, etc, and that will break awt_ole.h.
32+
#include "awt_ole.h"
3033
#include "awt_DataTransferer.h"
3134
#include "java_awt_dnd_DnDConstants.h"
3235
#include "sun_awt_windows_WDropTargetContextPeer.h"
3336
#include "awt_Container.h"
34-
#include "awt_ole.h"
3537
#include "awt_Toolkit.h"
3638
#include "awt_DnDDT.h"
3739
#include "awt_DnDDS.h"

src/java.desktop/windows/native/libawt/windows/awt_Frame.cpp

Lines changed: 62 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1340,15 +1340,27 @@ void AwtFrame::_SetState(void *param)
13401340
{
13411341
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
13421342

1343-
SetStateStruct *sss = (SetStateStruct *)param;
1343+
SetStateStruct *sss = static_cast<SetStateStruct *>(param);
13441344
jobject self = sss->frame;
13451345
jint state = sss->state;
13461346

13471347
AwtFrame *f = NULL;
13481348

1349-
PDATA pData;
1350-
JNI_CHECK_PEER_GOTO(self, ret);
1351-
f = (AwtFrame *)pData;
1349+
if (self == NULL) {
1350+
env->ExceptionClear();
1351+
JNU_ThrowNullPointerException(env, "self");
1352+
delete sss;
1353+
return;
1354+
} else {
1355+
f = (AwtFrame *)JNI_GET_PDATA(self);
1356+
if (f == NULL) {
1357+
THROW_NULL_PDATA_IF_NOT_DESTROYED(self);
1358+
env->DeleteGlobalRef(self);
1359+
delete sss;
1360+
return;
1361+
}
1362+
}
1363+
13521364
HWND hwnd = f->GetHWnd();
13531365
if (::IsWindow(hwnd))
13541366
{
@@ -1405,7 +1417,7 @@ void AwtFrame::_SetState(void *param)
14051417
f->setZoomed(zoom);
14061418
}
14071419
}
1408-
ret:
1420+
14091421
env->DeleteGlobalRef(self);
14101422

14111423
delete sss;
@@ -1569,21 +1581,59 @@ void AwtFrame::_NotifyModalBlocked(void *param)
15691581
{
15701582
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
15711583

1572-
NotifyModalBlockedStruct *nmbs = (NotifyModalBlockedStruct *)param;
1584+
NotifyModalBlockedStruct *nmbs = static_cast<NotifyModalBlockedStruct *>(param);
15731585
jobject self = nmbs->frame;
15741586
jobject peer = nmbs->peer;
15751587
jobject blockerPeer = nmbs->blockerPeer;
15761588
jboolean blocked = nmbs->blocked;
15771589

1578-
PDATA pData;
1590+
AwtFrame *f = NULL;
15791591

1580-
JNI_CHECK_PEER_GOTO(peer, ret);
1581-
AwtFrame *f = (AwtFrame *)pData;
1592+
if (peer == NULL) {
1593+
env->ExceptionClear();
1594+
JNU_ThrowNullPointerException(env, "peer");
1595+
env->DeleteGlobalRef(self);
1596+
env->DeleteGlobalRef(blockerPeer);
1597+
1598+
delete nmbs;
1599+
return;
1600+
} else {
1601+
f = (AwtFrame *)JNI_GET_PDATA(peer);
1602+
if (f == NULL) {
1603+
THROW_NULL_PDATA_IF_NOT_DESTROYED(peer);
1604+
env->DeleteGlobalRef(self);
1605+
env->DeleteGlobalRef(peer);
1606+
env->DeleteGlobalRef(blockerPeer);
1607+
1608+
delete nmbs;
1609+
return;
1610+
}
1611+
}
15821612

15831613
// dialog here may be NULL, for example, if the blocker is a native dialog
15841614
// however, we need to install/unistall modal hooks anyway
1585-
JNI_CHECK_PEER_GOTO(blockerPeer, ret);
1586-
AwtDialog *d = (AwtDialog *)pData;
1615+
AwtDialog *d = NULL;
1616+
1617+
if (blockerPeer == NULL) {
1618+
env->ExceptionClear();
1619+
JNU_ThrowNullPointerException(env, "blockerPeer");
1620+
env->DeleteGlobalRef(self);
1621+
env->DeleteGlobalRef(peer);
1622+
1623+
delete nmbs;
1624+
return;
1625+
} else {
1626+
d = (AwtDialog *)JNI_GET_PDATA(blockerPeer);
1627+
if (d == NULL) {
1628+
THROW_NULL_PDATA_IF_NOT_DESTROYED(blockerPeer);
1629+
env->DeleteGlobalRef(self);
1630+
env->DeleteGlobalRef(peer);
1631+
env->DeleteGlobalRef(blockerPeer);
1632+
1633+
delete nmbs;
1634+
return;
1635+
}
1636+
}
15871637

15881638
if ((f != NULL) && ::IsWindow(f->GetHWnd()))
15891639
{
@@ -1634,7 +1684,7 @@ void AwtFrame::_NotifyModalBlocked(void *param)
16341684
}
16351685
}
16361686
}
1637-
ret:
1687+
16381688
env->DeleteGlobalRef(self);
16391689
env->DeleteGlobalRef(peer);
16401690
env->DeleteGlobalRef(blockerPeer);

src/java.desktop/windows/native/libawt/windows/awt_PrintDialog.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535

3636
class AwtPrintDialog {
3737
public:
38-
static jfieldID AwtPrintDialog::controlID;
39-
static jfieldID AwtPrintDialog::parentID;
40-
static jfieldID AwtPrintDialog::pageID;
41-
static jmethodID AwtPrintDialog::setHWndMID;
38+
static jfieldID controlID;
39+
static jfieldID parentID;
40+
static jfieldID pageID;
41+
static jmethodID setHWndMID;
4242

4343
static BOOL PrintDlg(LPPRINTDLG);
4444

0 commit comments

Comments
 (0)