[ https://issues.apache.org/jira/browse/FELIX-2927?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Derek Baum resolved FELIX-2927. ------------------------------- Resolution: Fixed Fix Version/s: gogo.runtime-0.10.0 fixed by refactoring Reflective.java to give conversion cost for coercion. > [gogo] coercion mechanism invokes foo(String) instead of foo(int) - even with > explicit int argument > --------------------------------------------------------------------------------------------------- > > Key: FELIX-2927 > URL: https://issues.apache.org/jira/browse/FELIX-2927 > Project: Felix > Issue Type: Bug > Components: Gogo Runtime > Affects Versions: gogo.runtime-0.8.0 > Reporter: Derek Baum > Assignee: Derek Baum > Fix For: gogo.runtime-0.10.0 > > > Equinox 3.7.M6 supports OSGi R4.3 which adds the overloaded method > BundleContext.getBundle(String). > This causes gogo startup to fail, as it expects to invoke getBundle(int) but > actually invokes getBundle(String). > Prior to R4.3, the gogo command: bundle 1 > resulted in the String "1" being coerced into a long, so that getBundle(long) > could be invoked. > Now that getBundle(String) exists, the result depends on the order that > methods are returned from Class.getMethods(), which varies between platforms: > On Mac java version "1.6.0_24": > g! type bundle > bundle is Bundle context:bundle(long) > bundle is Bundle context:bundle() > bundle is Bundle context:bundle(String) > On Windows 2003 server, java version "1.6.0_24": > g! type bundle > bundle is Bundle context:bundle() > bundle is Bundle context:bundle(String) > bundle is Bundle context:bundle(long) > The first "exact" match wins, where "exact" just means that all supplied > arguments are used. > On the Mac, getBundle(long) still wins, but on Windows getBundle(String) wins > and the gogo startup scripts fails. > What's worse, is that even when you realise what is happening, it is still > not possible to invoke getBundle(long): > g! 1L = new Long 1 > g! bundle $1L > because in this case the long is coerced to a String to invoke get > Bundle(String) and the getBundle(long) method is ignored. > There are at least two problems here: > 1. the gogo coercion mechanism simply invokes the first method it can, > regardless of whether any arguments needed to be converted. > It should instead try to score each method, perhaps adding to the score each > time an argument needs to be converted, > then it could invoke the method with the lowest score. > However, there may still be occasions when two methods have the same score > and gogo needs to behave deterministically > and allow either method to be invoked by supplying less ambiguous arguments. > 2. all arguments in gogo start out as Strings, which make it awkward to > prefer a method that takes an integer: > for example: g! bundle (new Long 1) > getBundle(long) is the most likely target method, but gogo does not any > syntax to indicate that arguments should be treated as numbers rather than > Strings. One possibility would be to recognize numbers in gogo's Tokenizer > similar to the way that true/false are handled: > g! t = true > true > g! tt = 'true' > true > g! set t > Boolean t true > String tt true > The above shows that the bare word: true is tokenized as a Boolean, where as > the quoted word 'true' is tokenized as a String. > So bare numbers could be tokenized as Numbers, and the existing coercion > mechanism would convert them back to Strings as needed; > alternative by quoting something that looks like a number, you force it to be > tokenized as a String. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira