From 893450cdb32713511dd32075701fd28500a46266 Mon Sep 17 00:00:00 2001 From: Alexandru-Constantin Bledea Date: Wed, 30 Aug 2017 12:08:26 +0300 Subject: [PATCH] [Fernflower] autoboxing primitives should not always be ignored --- .../decompiler/exps/InvocationExprent.java | 13 +++++++++++-- testData/classes/pkg/TestPrimitives.class | Bin 6439 -> 6576 bytes testData/results/TestPrimitives.dec | 12 ++++++++++++ testData/src/pkg/TestPrimitives.java | 5 +++++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java index 4cd7b67..a53576d 100644 --- a/src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java +++ b/src/org/jetbrains/java/decompiler/modules/decompiler/exps/InvocationExprent.java @@ -61,6 +61,7 @@ public class InvocationExprent extends Exprent { private String name; private String classname; private boolean isStatic; + private boolean canIgnoreBoxing = true; private int functype = TYP_GENERAL; private Exprent instance; private MethodDescriptor descriptor; @@ -84,7 +85,6 @@ public class InvocationExprent extends Exprent { name = cn.elementname; classname = cn.classname; this.bootstrapArguments = bootstrapArguments; - switch (opcode) { case CodeConstants.opc_invokestatic: invocationTyp = INVOKE_STATIC; @@ -155,6 +155,7 @@ public class InvocationExprent extends Exprent { name = expr.getName(); classname = expr.getClassname(); isStatic = expr.isStatic(); + canIgnoreBoxing = expr.canIgnoreBoxing; functype = expr.getFunctype(); instance = expr.getInstance(); if (instance != null) { @@ -217,8 +218,12 @@ public class InvocationExprent extends Exprent { tracer.addMapping(bytecode); + if (instance instanceof InvocationExprent) { + ((InvocationExprent) instance).markUsingBoxingResult(); + } + if (isStatic) { - if (isBoxingCall()) { + if (isBoxingCall() && canIgnoreBoxing) { // process general "boxing" calls, e.g. 'Object[] data = { true }' or 'Byte b = 123' // here 'byte' and 'short' values do not need an explicit narrowing type cast ExprProcessor.getCastedExprent(lstParameters.get(0), descriptor.params[0], buf, indent, false, false, false, tracer); @@ -441,6 +446,10 @@ public class InvocationExprent extends Exprent { return false; } + public void markUsingBoxingResult() { + canIgnoreBoxing = false; + } + // TODO: move to CodeConstants ??? private static String getClassNameForPrimitiveType(int type) { switch (type) { diff --git a/testData/classes/pkg/TestPrimitives.class b/testData/classes/pkg/TestPrimitives.class index fa6cc59684414f119896ce8f8f09b6349647834f..1dad0d2fa50e49c17bf63e6886a417c2e77226d6 100644 GIT binary patch delta 2730 zcmZ{ld2mxz6vn@sguIu>rL<{Ffr7SxIKxOw3k(>XDY4GL49o~E$gadTwt;j@lY$@y z)QYHx5CIXYf+#8l!75ZxbaZe*1#!n60XM`A5phA!xe4hj^yQB;=iZm!Ip;3tyPFEP z4UXtAPUNp1W!e%R*r#jIm{>|snHb+rY?MC*tJBv#7uefl2iA==@FHH~;qoP2qI>ZwyRR82!0YV2p<^G1 zdy~yuI^O1p``H}O@eT()$mU%R`W~D2Io=0sKGgA%ftT?yn?nZn;uAKXYWR%9f6nF$ z&haIiuUt5c=+`=qXgGRqtpf}k!#6s<<$rv~=6g0jusN>bN5{y~r(SUuojFo^djFv; zo;|_lCmlcQ_(jLBI({=S94B@BuH%%BKXjbd@u!9}yoA4aQGW~QwV^XlR zK0U+!`mi?=uDP;iZlJoN*cS|z`0FBpkiT4@Q-d!Ui4Ao2k2YYA#9Z7cF%R=4Zo&eI zn-P^*h(!{&;8uy-(5T@biGOic;&v=%?>~tf8%s6e;6W#e zd$3FsP9A6y_hPvwbRM`QRv;#$(C_NuAN&CVuDsa@!ca9-sT$^V9b>AYkYWtRlL}K9XW!?D=f*GilkOakUhQb(j6EvX**@Ip)G$AMHy)kh4-8DQ?H$i z5(}nDQ}x9}Uu8k_88J;ws^~3g=5>!EaXUZgXwjy=6nH)ppSPPQx0FxvKiY#kK zUQOgU3zF{)lcXVv+|!OMC31oV$#;xN5*$VLNbhUfp~*<26Ky+Rck+DQbiNTql0Yf4 zt{pj@$QhPoSdpY=9gs7L^jVO6L%CX#z7EK8BK;O5-*P5NCp#c3i40hf+$l_ws4DVc zhIxmAL{?dl+-*#f0(U^x5?Np`Bg009!nSE8~$Ga{}WW<7ucfA0KD3jDLm#Ik9 zH}>Xa_c&<|)R#%cqppf8o?zuokOLE>J#}F-wLzlu;_LzwYfrKy*acA)fvayHX@(5%XdYrZQP-i0R;n*SsPuwnE6cetO$ delta 2524 zcmZ{l4Nz276vzK}cis1R-1vq?pu!8r z$II;a6&A1R*v-CQWAVC%#lUFv>G)O0Z#oX@_+7^#4S(<_92U@fmWdvhS>etJHesQ} z6<8#3B^FCG<0^?IxLP8J7Kx=;CUFgxYd9it6n{#rz_qOXC9x9MY51FseXtBZi-0T8*i^&sG%0kn3OK!m zMQq1NVPHMkg(F9?9V^N2?W~<7MI72$iv{mwKDp_3Y| ziaQGeWhf_kQBRD_bco4jZrqy8DfCj(LpTgf#l>Vf$lWwvX6}ir3QndcaiDTWK3piE z13eSWR3e6CX_#TH64TiaX_sIId0}lP{E98bEL0KC&#F-auDw!RirLVVR*N~%l~#w# zV5l7GRSwIul8+*sg%Oq9gAcWsr*iO7l*?5PK8oC+a_~_$^HmN$ z%CHe`itMAT7pQD}^d$kxMu3V{<83m#h-N>Iyqss_ zh0ln+P(vy&2NJFE#}hfhhU7D4lDb%t=O$Uni9}AaA-M*aq}EqtM?dm>A}_EZxn`K8 zd7;Q7{m3#R%WX)mF(zraD6%X$$8thbkw|?IJ>R6r`6ki%1{6udNRgZSk(ESFw#l0J56M8XJs+>>kicuIoF2d zZexBY_cIkT`zbOQD1~6p5VC}CeH|y&V-guD(7(TgxDn())`@G9EaKbFzZTe!GGf}wXm)TOH=%R zafe3HoKV~q7B(7}t`BC-<7u8e?(fjrRhG5xNF2Il)Y@}A*0rk#Tzhxuk}#V+rxiq} z|5}>&>ySjJ6Wzb$i2r-SOs^+%SajC364Pc`AH8Aj#YUA+N_r>VLp#%p^Vn;)n$sJ? eUO{(Us8eI93h$%Na^QY5Z?HE;V3Ru42mS@RGI}`x diff --git a/testData/results/TestPrimitives.dec b/testData/results/TestPrimitives.dec index 043ed9f..8809dcc 100644 --- a/testData/results/TestPrimitives.dec +++ b/testData/results/TestPrimitives.dec @@ -157,6 +157,10 @@ public class TestPrimitives { res = c > 255;// 166 return res;// 167 } + + void testAutoBoxingCallRequired(boolean value) { + Boolean.valueOf(value).hashCode();// 171 + }// 172 } class 'pkg/TestPrimitives' { @@ -530,6 +534,12 @@ class 'pkg/TestPrimitives' { 98 156 9a 157 } + + method 'testAutoBoxingCallRequired (Z)V' { + 1 161 + 4 161 + 8 162 + } } Lines mapping: @@ -628,6 +638,8 @@ Lines mapping: 165 <-> 156 166 <-> 157 167 <-> 158 +171 <-> 162 +172 <-> 163 Not mapped: 46 50 diff --git a/testData/src/pkg/TestPrimitives.java b/testData/src/pkg/TestPrimitives.java index 8167339..55bd806 100644 --- a/testData/src/pkg/TestPrimitives.java +++ b/testData/src/pkg/TestPrimitives.java @@ -166,4 +166,9 @@ public class TestPrimitives { res = (c > 255); return res; } + + void testAutoBoxingCallRequired(boolean value) { + Boolean.valueOf(value).hashCode(); + } + }