[Ikvm-developers] Remapping, inversion and alter egos
Brought to you by:
jfrijters
From: Jeroen F. <je...@su...> - 2004-04-02 15:06:21
|
Hi, I finally got around to implementing the remapping inversion (as discussed here: http://weblog.ikvm.net/PermaLink.aspx?guid=3D07bca016-be8a-4174-878f-e451= 2 43c0ff9) While doing this, I realized there are still some details that need to be resolved. 1) I want to be able to call System.Object instance methods on Java objects. There are two possible ways: a) static helper methods on cli.System.Object (current situation) b) allow casting of Java objects to cli.System.Object (even though they do not extend cli.System.Object, in the Java world view) Even though it feels a bit weird, I'm currently leaning towards b). I think mainly because I really hate method name mangling and this way no mangling is needed. 2) If we go with b), should "instanceof cli.System.Object" always return true, or is it helpful to have it return true only for non-Java object? What about String and arrays? 3) Again, only applicable if we go with b). In the Java world cli.System.String is distinct from java.lang.String (because the Java compilers obviously don't understand that they are alter egos). This allows for some funny Java code (from StringHelper.java): static boolean startsWith(cli.System.String s, String prefix, int toffset) { if(toffset < 0) { return false; } s =3D (cli.System.String)(Object)s.Substring(Math.min(s.get_Length(), toffset)); return s.StartsWith(prefix); } Another method (also from StringHelper.java) is more elegant: static int hashCode(cli.System.String s) { int h =3D 0; for(int i =3D 0; i < s.get_Length(); i++) { h =3D h * 31 + s.get_Chars(i); } return h; } The previous version was not as concise: static int hashCode(String s) { int h =3D 0; for(int i =3D 0; i < cli.System.String.get_Length(s); i++) { h =3D h * 31 + cli.System.String.get_Chars(s, i); } return h; } Note that both compile down to exactly the same code. In the startsWith method there is an additional cast, but that can trivially be optimized out (by the IKVM compiler). (Note also that the get_Length call is in the loop condition, this is on purpose, the .NET JIT generates faster code this way.) As you can probably tell, I already implemented b). Overall, I like it, but I'd like to hear other opinions on it. So, please let me know how you feel about this. Thanks! Regards, Jeroen |