From 0d355cf973a80a3d15132ceabd55f6510f729d88 Mon Sep 17 00:00:00 2001 From: Matthew Fortune Date: Wed, 13 Jul 2016 21:34:52 +0000 Subject: [PATCH] Fix return type handling for Proxy classes libjava/ * java/lang/reflect/natVMProxy.cc (unbox): Use ffi_arg for integer return types smaller than a word. * testsuite/libjava.jar/ReturnInvocationHandler.java: New file. * testsuite/libjava.jar/ReturnProxyTest.jar: Likewise. * testsuite/libjava.jar/ReturnProxyTest.java: Likewise. * testsuite/libjava.jar/ReturnProxyTest.out: Likewise. * testsuite/libjava.jar/ReturnProxyTest.xfail: Likewise. * testsuite/libjava.jar/ReturnTypes.java: Likewise. * testsuite/libjava.jar/ReturnTypesImpl.java: Likewise. From-SVN: r238312 --- libjava/ChangeLog | 12 ++++++++ libjava/java/lang/reflect/natVMProxy.cc | 10 +++---- .../libjava.jar/ReturnInvocationHandler.java | 24 ++++++++++++++++ .../testsuite/libjava.jar/ReturnProxyTest.jar | Bin 0 -> 2671 bytes .../libjava.jar/ReturnProxyTest.java | 27 ++++++++++++++++++ .../testsuite/libjava.jar/ReturnProxyTest.out | 12 ++++++++ .../libjava.jar/ReturnProxyTest.xfail | 1 + .../testsuite/libjava.jar/ReturnTypes.java | 9 ++++++ .../libjava.jar/ReturnTypesImpl.java | 27 ++++++++++++++++++ 9 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 libjava/testsuite/libjava.jar/ReturnInvocationHandler.java create mode 100644 libjava/testsuite/libjava.jar/ReturnProxyTest.jar create mode 100644 libjava/testsuite/libjava.jar/ReturnProxyTest.java create mode 100644 libjava/testsuite/libjava.jar/ReturnProxyTest.out create mode 100644 libjava/testsuite/libjava.jar/ReturnProxyTest.xfail create mode 100644 libjava/testsuite/libjava.jar/ReturnTypes.java create mode 100644 libjava/testsuite/libjava.jar/ReturnTypesImpl.java diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 06b354d7777c..f7c282f9bd1c 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,15 @@ +2016-07-13 Matthew Fortune + + * java/lang/reflect/natVMProxy.cc (unbox): Use ffi_arg for + integer return types smaller than a word. + * testsuite/libjava.jar/ReturnInvocationHandler.java: New file. + * testsuite/libjava.jar/ReturnProxyTest.jar: Likewise. + * testsuite/libjava.jar/ReturnProxyTest.java: Likewise. + * testsuite/libjava.jar/ReturnProxyTest.out: Likewise. + * testsuite/libjava.jar/ReturnProxyTest.xfail: Likewise. + * testsuite/libjava.jar/ReturnTypes.java: Likewise. + * testsuite/libjava.jar/ReturnTypesImpl.java: Likewise. + 2016-07-13 Matthew Fortune * interpret-run.cc: Use ffi_arg for FFI integer return types. diff --git a/libjava/java/lang/reflect/natVMProxy.cc b/libjava/java/lang/reflect/natVMProxy.cc index e46263d858cf..19cde207835c 100644 --- a/libjava/java/lang/reflect/natVMProxy.cc +++ b/libjava/java/lang/reflect/natVMProxy.cc @@ -272,17 +272,17 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) if (klass == JvPrimClass (byte)) { _Jv_CheckCast (&Byte::class$, o); - *(jbyte*)rvalue = ((Byte*)o)->byteValue(); + *(ffi_arg*)rvalue = ((Byte*)o)->byteValue(); } else if (klass == JvPrimClass (short)) { _Jv_CheckCast (&Short::class$, o); - *(jshort*)rvalue = ((Short*)o)->shortValue(); + *(ffi_arg*)rvalue = ((Short*)o)->shortValue(); } else if (klass == JvPrimClass (int)) { _Jv_CheckCast (&Integer::class$, o); - *(jint*)rvalue = ((Integer*)o)->intValue(); + *(ffi_arg*)rvalue = ((Integer*)o)->intValue(); } else if (klass == JvPrimClass (long)) { @@ -302,12 +302,12 @@ unbox (jobject o, jclass klass, void *rvalue, FFI_TYPE type) else if (klass == JvPrimClass (boolean)) { _Jv_CheckCast (&Boolean::class$, o); - *(jboolean*)rvalue = ((Boolean*)o)->booleanValue(); + *(ffi_arg*)rvalue = ((Boolean*)o)->booleanValue(); } else if (klass == JvPrimClass (char)) { _Jv_CheckCast (&Character::class$, o); - *(jchar*)rvalue = ((Character*)o)->charValue(); + *(ffi_arg*)rvalue = ((Character*)o)->charValue(); } else JvFail ("Bad ffi type in proxy"); diff --git a/libjava/testsuite/libjava.jar/ReturnInvocationHandler.java b/libjava/testsuite/libjava.jar/ReturnInvocationHandler.java new file mode 100644 index 000000000000..18b52b73a55c --- /dev/null +++ b/libjava/testsuite/libjava.jar/ReturnInvocationHandler.java @@ -0,0 +1,24 @@ +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class ReturnInvocationHandler implements InvocationHandler +{ + private Object obj; + public ReturnInvocationHandler(Object obj) + { + this.obj = obj; + } + public Object invoke(Object proxy, Method m, Object[] args) throws Throwable + { + Object result; + try + { + result = m.invoke(obj, args); + } + catch (Exception e) + { + throw e; + } + return result; + } +} diff --git a/libjava/testsuite/libjava.jar/ReturnProxyTest.jar b/libjava/testsuite/libjava.jar/ReturnProxyTest.jar new file mode 100644 index 0000000000000000000000000000000000000000..00daabeccc8f28d1ccde9d8bea763874ab9351a7 GIT binary patch literal 2671 zc-oDY3pCW*9>@O}kH(PK887LsJ=y;f$K(IjDm|&E=fI z)!b`<1Y@WqB8}vYI23BC zi8L_Thw%0C0^^8e3IcPE7!+ix=}4jlQz;Hqe|jihI2*hyN=Ya|3b-Q_m1`v-9x4I= zTu}f}7mE7!wJjyY--}2SE^?Si@jgeQ8h9Lwq;n*VuaZ->e+lH4WZr!E{ z+MSfH&oUhmzgadYht$1$sC=TIIL-VXCf^MB$b1~ zCRr4D9-!t2``G$Ft4vSMK*`&y;xPyH*ey@`(Sfh^VzmI`gORpiT!y3uowGv^IXpC( zNuMSF9IaR)G&JHw^O0{! zKkroF!8NR+14Y$dx%*)MBVTs>-KO(_A4Ccd_=t-AnldR~rzB`Fg+LtHJ_O>8c^cda z`YN5RH@egKOB{#vQo`(E1!L0q7SB;qkPK(k`Phoh+(9)KHNkPe>;KelKGB8-*2Z(E zi?!x`VJwG1003Qy=SuW9j$<(XspDe@xg}X8QLRr-OCWKqpHA*g{weufLXIoAzw^kL zE}~rlX4Yhcy)Y&=2bhO%ejei<-Z)O5!kA3kO2p$+(o*)+Jqt6byMRJpQokgLjFJ(T zfv{im3P(I2RgDf&>-lggByCEtc)n`@t5bD+_$4-$6WT4uH0M*6F{kC6CVd@dhsfUKNH z<#?nL8x3<>?hyvmn-%P8hf&;8PY}yn;00-NSYZ4Hw}i6xa-M_9zlQoPb?*A93sKE1 zuCZ?2@+o04Ljh`|jMY7>3|`kfxyQZw4|+{lRH+ov(Q@vVkMCJ%EX&vmiA|^~ z8u*x{e8#oX7qfo=UB-Ihr_xr*RG}aX@GqiCX(yDYCx-EXiq%lw&5X}GotyQik?;%s z-j0VgD^*9YMt(HnwTn?Z@}|bCif^Qz3EDT#$$^;(cFH7GJU^;v99uUKodeUJjnBzD zD7eY=b$y@c7}9=Qo%PH0GLlTswY)pHvedWRbS560c5O}HompkoF{^JkAFPvk{ry8K zWT1p__X?x$s^q;lJUH&*Usd+j?Ok`7yP(e@Hl>fcGH|aUf6vsOm(KeC@W^#zLR>j#4CC? z{24Ogi@s^OMFy0nl|%_xkgvDa80{-)utA%902(?1MP`6ispkW3?#217YZC&slnbpA zjuwPfekCFBp#h|zjgtYFh?9*(Dn;in0g>neR&PR!o`q-R-o5fJ)4F7fL&u|9ql>w3 zf$g1h@U3<9$Nr`l(|SJ6N|d+uTPHOg*mTn6J&)Jg+!o%nXD&rjn{_Ope#?$Qh&_y! zTzt9g^PnlQyd#e4u9|2nyA=V6g=`7bucPzKG*Y`DZ&Z1xGQ3WW(NIi@)gVDPq&oS= z+$A>3PyI?n zvxlJ+Fp)rcn)~l|SSMr_4adyiXN563vNSSzhN-Zz>;g-h-$WFl;EV-F-Yz{CE5m7t zNDe=K_*nGOk`MbKFk_hXb{%xbC%U5a%XS(l)Xk@cosiF&No_!dy^rPGn3is~2q^T~ zJV3p_EB%Td+N{Q@=Ebq|X4@h>&dV%pg%K9c^y_l92-bu9FWO8cY=Ox1-#(L<4GW>p zAZ?7NavN215UwV__n188W6S?F(l$NR2%Fe$>c&Npl^0EZ2+ym{m6dgu_GVS)CogFW zT3fc0(QJ>m(hhbaqT9vRa}X;3?a2XCmdo!|enR}41NhEMti`Q$6W?&cC<8eWnANy7 z-s1m}*RupFE248EhK21020{GWZ?wS@Yj3I5OB9F#>)l!Z481nrSEIS&!2inre}-L~ dMXRy362N*nwH{hrVtJ~B@KF`wEToo4e*>cn_+[] { ReturnTypes.class }, + new ReturnInvocationHandler(orig)); + ReturnTypes rt = (ReturnTypes)o; + + System.out.println(orig.getBoolean()); + System.out.println(orig.getChar()); + System.out.println(orig.getByte()); + System.out.println(orig.getShort()); + System.out.println(orig.getInt()); + System.out.println(orig.getLong()); + + System.out.println(rt.getBoolean()); + System.out.println(rt.getChar()); + System.out.println(rt.getByte()); + System.out.println(rt.getShort()); + System.out.println(rt.getInt()); + System.out.println(rt.getLong()); + } +} diff --git a/libjava/testsuite/libjava.jar/ReturnProxyTest.out b/libjava/testsuite/libjava.jar/ReturnProxyTest.out new file mode 100644 index 000000000000..b141f06fe40a --- /dev/null +++ b/libjava/testsuite/libjava.jar/ReturnProxyTest.out @@ -0,0 +1,12 @@ +false +a +-1 +-1 +-1 +-1 +false +a +-1 +-1 +-1 +-1 diff --git a/libjava/testsuite/libjava.jar/ReturnProxyTest.xfail b/libjava/testsuite/libjava.jar/ReturnProxyTest.xfail new file mode 100644 index 000000000000..73ffe1d5217d --- /dev/null +++ b/libjava/testsuite/libjava.jar/ReturnProxyTest.xfail @@ -0,0 +1 @@ +main=ReturnProxyTest diff --git a/libjava/testsuite/libjava.jar/ReturnTypes.java b/libjava/testsuite/libjava.jar/ReturnTypes.java new file mode 100644 index 000000000000..9fbd6bd1529c --- /dev/null +++ b/libjava/testsuite/libjava.jar/ReturnTypes.java @@ -0,0 +1,9 @@ +public interface ReturnTypes +{ + public short getShort(); + public char getChar(); + public byte getByte(); + public int getInt(); + public long getLong(); + public boolean getBoolean(); +} diff --git a/libjava/testsuite/libjava.jar/ReturnTypesImpl.java b/libjava/testsuite/libjava.jar/ReturnTypesImpl.java new file mode 100644 index 000000000000..33fab1b5dc09 --- /dev/null +++ b/libjava/testsuite/libjava.jar/ReturnTypesImpl.java @@ -0,0 +1,27 @@ +public class ReturnTypesImpl implements ReturnTypes +{ + public short getShort() + { + return -1; + } + public char getChar() + { + return 'a'; + } + public byte getByte() + { + return -1; + } + public int getInt() + { + return -1; + } + public long getLong() + { + return -1; + } + public boolean getBoolean() + { + return false; + } +} -- 2.47.2