Re: Overloaded Java method handing changes between 2.7.2 and 2.7.3?
John Hubbard <[email protected]> Fri, 7 Jun 2024 16:52:03 -0600
| Newsgroups | gmane.comp.lang.jython.user |
|---|---|
| Message-ID | <CAO2imXwt0XXCaCJLwUwmvCouoguvzJ1iHmW_9MvENhZG4qWj0g@mail.gmail.com> |
--===============5068183228458953249== Content-Type: multipart/alternative; boundary="000000000000066183061a54a8bb" --000000000000066183061a54a8bb Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks Jeff for the quick reply. The GH-221 tickets that the commit addressed sounds kind of like this because our AttributeTable class does in fact use varargs but there is a comment[1] in the ticket for what sounds exactly like my issue and tpoliaw's reply suggests that this isn't intended to fix it though. I went ahead and built the latest version of master locally and used that for testing and unfortunately it doesn't address my problem. Now that I've actually built this myself, and armed with a pointer at where to look, I'll see if I can identify where things changed and work on a solution. Don't worry about holding off on a 2.7.4 on our account. Thanks again! [1] https://github.com/jython/jython/issues/221#issuecomment-1784005688 -- Cheers -john On Fri, Jun 7, 2024 at 4:10=E2=80=AFAM Jeff Allen <[email protected]> wrot= e: > This is maybe better as an issue, although it sounds like one that alread= y > defeated us. > > 1. The code by which a call is matched to a method always looked somewhat > heuristic to me. (I believe this comes from a Greek word meaning "luck".) > As I understand it, it takes the first match, a match ocurring where the > arguments say they can produce the Java type in the signature. The sort > order of overloaded methods is therefore important. I think "What Would > Java Do?" is the aspiration, but I suspect this cannot be achieved just b= y > sorting. (Have we changed the sort? I didn't think so.) The best expressi= on > of expected behaviour is probably in the tests `test_joverload.py` and > `javatests/Reflection.java`. > > 2. There has been some work in the matching to address variable numbers o= f > arguments, so some code change, late in 2.7.3 (I think) and in 2.7.4 > (currently in beta). I might have blamed: > https://github.com/jython/jython/commit/dd271a5edaa06925d45ef2d1477e3ec1c= f6adfc7 > but I think it is later than you need to explain the change. However, I > think it is a good place to start. These are the source files right files > (probably). Another possible cause is in "normalisations" that can occur > during assignment which I think we tweaked (to solve another problem, not > just for the heck of it). > > 3. You're asking to hook the `__tojava__` methods, which I don't *think* > you can do. It would be on built-in types too. > > How is it with 2.7.4b2? I think I wouldn't delay 2.7.4 for this, but > there's always a small hope your problem has gone away. > > Bets wishes, > Jeff > > > On 06/06/2024 22:38, John Hubbard wrote: > > Hello, > > Has something changed between Jython 2.7.2 and Jython 2.7.2 with regards > to how calls from Jython to an overloaded Java method are resolved? > > *Background* > I am trying to update our application from Jython 2.7.2 to Jython 2.7.3 > and I have run into what I think is a change in how Jython handles > overloaded Java methods. The primary motivation for the update is proper > handling of * imports under JDK 17 (and JUnit 5); see Jython GitHub issue= s > 105, 304 and maybe 309. > > Our application is primarily Java based but uses Jython for high level > scripts which perform high level sequencing. One of the most common thin= gs > those scripts do is construct 'bags of data' which are handled by our > AttributeTable class (full jdoc here > <https://share.nso.edu/shared/dkist/jhubbard/atst/atst/cs/interfaces/IAtt= ributeTable.html>). > That class is backed by a Map<String, String[]> and stores heterogenous > data via various via getters and setters like: > > insert(String name, String value) > insert(String name, int value) > > insert(String name, boolean value) > > ... > > String getString(String name) > > int getInt(String name) > > > With Jython 2.7.2 I could could write a script like: > > tbl =3D AttributeTable(); > name =3D 'name' > value =3D 27 > tbl.insert(name, value) > > and it would behave as expected. Jython would resolve the insert call to > the Java AttributeTable.insert(String, int) method, the Java side would > then convert the integer 27 into the String "27" and store it in the map > for later use. > > *Problem* > With Jython 2.7.3 I think that the truthiness of the value is being > evaluated and AttributeTable.insert(String, boolean) is what is getting > triggered. For example the following code: > > def savePropertyValue(appName, propertyName, propertyValue): > print('savePropertyValue(' + str(appName) + ', ' + str(propertyName) > + ', ' + str(propertyValue) + ')') > at =3D AttributeTable() > at.insert(propertyName, propertyValue) > at.show('savePropertyValue() AttributeTable ') > > produces > > savePropertyValue(atst.ics.visp, atst.ics.visp.slitStepSz, 0.05) > savePropertyValue() AttributeTable atst.ics.visp.slitStepSz: true > > > So the value 0.05 was passed into the jython savePropertyValue function > but what ended up being inserted into the Java AttributeTable object was > the boolean true. > > *Questions* > > 1. What is the expected behavior when interacting with overloaded Java > objects? Were we just lucky before and this was never expected to wor= k? > 2. Is anyone aware of changes on the Java side that may have triggered > this? I'd like some background on what might have caused this so I ca= n > investigate what might be improved to fix this. > 3. Is it possible to inject custom PyObject --> Java Object coercion > routines? The interpreters are setup at a high level; if I could mask= the > Java AttributeTable class with a Python class that better handled > overloaded methods and then somehow coerce/convert it to an Java > AttributeTable before sending it back into Java land I might be able t= o > work around this. > > Thanks > > -- > Cheers > -john > > > _______________________________________________ > Jython-users mailing [email protected]://lists.= sourceforge.net/lists/listinfo/jython-users > > -- > > Jeff Allen > > _______________________________________________ > Jython-users mailing list > [email protected] > https://lists.sourceforge.net/lists/listinfo/jython-users > --000000000000066183061a54a8bb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Thanks Jeff for the quick reply.=C2=A0=C2=A0<div><br></div= ><div>The GH-221 tickets that the commit addressed sounds kind of like this= because our AttributeTable class does in fact use varargs but there is a c= omment[1] in the ticket for what sounds exactly like my issue and tpoliaw&#= 39;s reply suggests that this isn't intended to fix it though.=C2=A0=C2= =A0<div><br></div><div><div><div>I went ahead and built the latest version = of master locally and used that for testing and unfortunately it doesn'= t address my problem.=C2=A0 Now that I've actually built this myself, a= nd armed with a pointer at where to look, I'll see if I can identify wh= ere things changed and work on a solution.=C2=A0 Don't worry=C2=A0about= holding off on a 2.7.4 on our account.</div><div><br></div><div>Thanks aga= in!</div><div><br></div><div>[1]=C2=A0<a href=3D"https://github.com/jython/= jython/issues/221#issuecomment-1784005688" target=3D"_blank">https://github= .com/jython/jython/issues/221#issuecomment-1784005688</a><br clear=3D"all">= <div><div dir=3D"ltr" class=3D"gmail_signature" data-smartmail=3D"gmail_sig= nature"><div dir=3D"ltr">--<div>Cheers=C2=A0</div><div>-john</div></div></d= iv></div><br></div></div></div></div></div><br><div class=3D"gmail_quote"><= div dir=3D"ltr" class=3D"gmail_attr">On Fri, Jun 7, 2024 at 4:10=E2=80=AFAM= Jeff Allen <<a href=3D"mailto:[email protected]" target=3D"_blank">ja.= [email protected]</a>> wrote:<br></div><blockquote class=3D"gmail_quote" s= tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad= ding-left:1ex"><u></u> =20 =20 =20 <div> <div>This is maybe better as an issue, although it sounds like one that already defeated us.<br> </div> <div><br> </div> <div>1. The code by which a call is matched to a method always looked somewhat heuristic to me. (I believe this comes from a Greek word meaning "luck".) As I understa= nd it, it takes the first match, a match ocurring where the arguments say they can produce the Java type in the signature. The sort order of overloaded methods is therefore important. I think "What Would Java Do?" is the aspiration, but I suspect this cannot be achiev= ed just by sorting. (Have we changed the sort? I didn't think so.) The best expression of expected behaviour is probably in the tests `test_joverload.py` and `javatests/Reflection.java`.</div> <div><br> </div> <div>2. There has been some work in the matching to address variable numbers of arguments, so some code change, late in 2.7.3 (I think) and in 2.7.4 (currently in beta). I might have blamed: <a href=3D"https://github.com/jython/jython/commit/dd271a5edaa06925d45ef2d1= 477e3ec1cf6adfc7" target=3D"_blank">https://github.com/jython/jython/commit= /dd271a5edaa06925d45ef2d1477e3ec1cf6adfc7</a> but I think it is later than you need to explain the change. However, I think it is a good place to start. These are the source files right files (probably).=C2=A0 Another possible cause is in "normalisations" that can occur during assignment which I t= hink we tweaked (to solve another problem, not just for the heck of it).<br> </div> <div><br> </div> <div>3. You're asking to hook the `__tojava__` methods, which I don't *think* you can do. It would be on built-in types too.<br> </div> <div><br> </div> <div>How is it with 2.7.4b2? I think I wouldn't delay 2.7.4 for this, but there's always a small hop= e your problem has gone away.<br> </div> <div><br> </div> <div>Bets wishes,<br> </div> <div>Jeff<br> </div> <div><br> </div> <div><br> </div> <div>On 06/06/2024 22:38, John Hubbard wrote:<br> </div> <blockquote type=3D"cite"> =20 <div dir=3D"ltr"> <div dir=3D"ltr">Hello,=C2=A0</div> <div dir=3D"ltr"><br> </div> <div dir=3D"ltr">Has something changed between Jython 2.7.2 and Jython 2.7.2 with regards to how calls from Jython to an overloaded Java method are resolved?=C2=A0=C2=A0<br> <div><br> </div> <div><b>Background</b><br> </div> <div>I am trying to update our application from Jython 2.7.2 to Jython 2.7.3 and I have run into what I think is a change in how Jython handles overloaded Java methods.=C2=A0 The primar= y motivation for the update is proper handling of * imports under JDK 17 (and JUnit 5); see Jython GitHub issues 105, 304 and maybe 309.=C2=A0=C2=A0</div> <div><br> </div> <div>Our application is primarily Java based but uses Jython for high level scripts which perform high level sequencing.=C2= =A0 One of the most common things those scripts do is construct 'bags of data' which are handled by our AttributeTable = class (full jdoc <a href=3D"https://share.nso.edu/shared/dkist/jhubba= rd/atst/atst/cs/interfaces/IAttributeTable.html" target=3D"_blank">here</a>= ).=C2=A0 That class is backed by a Map<String, String[]> and stores heterogenous data via various via getters and setters like:</di= v> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">insert(String name, String value)</font></div> <div><font face=3D"monospace">insert(String name, int value)</f= ont></div> </blockquote> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">insert(String name, boolean value)</font></div> </blockquote> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">...</font></div> </blockquote> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">String getString(String name)</fo= nt></div> </blockquote> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">int getInt(String name)</font></d= iv> </blockquote> <div><br> </div> <div>With Jython 2.7.2 I could could write a script like:</div> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:= 0px"> <div><font face=3D"monospace">tbl =3D AttributeTable();</font><= /div> <div><font face=3D"monospace">name =3D 'name'</font></d= iv> <div><font face=3D"monospace">value =3D 27</font></div> <div><font face=3D"monospace">tbl.insert(name, value)</font></d= iv> </blockquote> <div>and it would behave as expected.=C2=A0 Jython would resolve the insert call to=C2=A0 the Java AttributeTable.insert(String, int) method, the Java side would then convert the integer 27 into the String "27" and store it in the map for late= r use.=C2=A0=C2=A0</div> <div><br> </div> <div><b>Problem</b></div> <div>With Jython 2.7.3 I think that the truthiness of the value is being evaluated and AttributeTable.insert(String, boolean)=C2=A0is what is getting triggered.=C2=A0 For example t= he following code:</div> </div> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:0p= x"> <div> <div> <div><font face=3D"monospace">def savePropertyValue(appName, propertyName, propertyValue):</font></div> </div> </div> <div> <div> <div><font face=3D"monospace">=C2=A0 print('savePropertyV= alue(' + str(appName) + ', ' + str(propertyName)</font></d= iv> </div> </div> <div> <div> <div><font face=3D"monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 + ', ' + str(propertyValue) + ')')</font></div> </div> </div> <div> <div> <div><font face=3D"monospace">=C2=A0 at =3D AttributeTable()<= /font></div> </div> </div> <div> <div> <div><font face=3D"monospace">=C2=A0 at.insert(propertyName, propertyValue)</font></div> </div> </div> <div> <div> <div><font face=3D"monospace">=C2=A0 at.show('savePropert= yValue() AttributeTable ')</font></div> </div> </div> </blockquote> <div dir=3D"ltr"> <div>produces=C2=A0</div> </div> <blockquote style=3D"margin:0px 0px 0px 40px;border:none;padding:0p= x"> <div dir=3D"ltr"> <div><font face=3D"monospace">savePropertyValue(atst.ics.visp, atst.ics.visp.slitStepSz, 0.05)<br> savePropertyValue() AttributeTable atst.ics.visp.slitStepSz: true</font><br> </div> </div> </blockquote> <div dir=3D"ltr"> <div><br> </div> <div>So the value 0.05 was passed into the jython savePropertyValue function but what ended up being inserted into the Java AttributeTable object was the boolean true.=C2=A0= =C2=A0</div> <div><br> </div> <div><b>Questions</b></div> <div> <ol> <li>What is the expected behavior when interacting with overloaded Java objects?=C2=A0 Were we just lucky before an= d this was never expected to work?</li> <li>Is anyone aware of changes on the Java side that may have triggered this?=C2=A0 I'd like some background on = what might have caused this so I can investigate what might be improved to fix this.</li> <li>Is it possible to inject custom PyObject --> Java Object coercion routines?=C2=A0 The interpreters are setup = at a high level; if I could mask the Java AttributeTable class with a Python class that better handled overloaded methods and then somehow coerce/convert it to an Java AttributeTable before sending it back into Java land I might be able to work around this.</li> </ol> <div>Thanks</div> </div> <div><br> </div> <div> <div> <div dir=3D"ltr" class=3D"gmail_signature"> <div dir=3D"ltr">-- <div>Cheers</div> <div>-john</div> </div> </div> </div> </div> </div> </div> <br> <fieldset></fieldset> <br> <fieldset></fieldset> <pre>_______________________________________________ Jython-users mailing list <a href=3D"mailto:[email protected]" target=3D"_blank">Jyt= [email protected]</a> <a href=3D"https://lists.sourceforge.net/lists/listinfo/jython-users" targe= t=3D"_blank">https://lists.sourceforge.net/lists/listinfo/jython-users</a> </pre> </blockquote> <pre cols=3D"72">--=20 Jeff Allen </pre> </div> _______________________________________________<br> Jython-users mailing list<br> <a href=3D"mailto:[email protected]" target=3D"_blank">Jyt= [email protected]</a><br> <a href=3D"https://lists.sourceforge.net/lists/listinfo/jython-users" rel= =3D"noreferrer" target=3D"_blank">https://lists.sourceforge.net/lists/listi= nfo/jython-users</a><br> </blockquote></div> --000000000000066183061a54a8bb-- --===============5068183228458953249== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline --===============5068183228458953249== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Jython-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/jython-users --===============5068183228458953249==--