A propos of my last bit of banging head against a wall... Oh, and these snippets are definitely offered under the WTFPL.
The main things that the scala-msil compilation balks at when looking at .Net assemblies post framework 1.x are generics; and things marked as var
. Looking at the source in http://lampsvn.epfl.ch/svn-repos/scala/msil/trunk/src/, the first changes to make are, first in msil/util/Signature.java
, add the extra byte code values
public static final int ELEMENT_TYPE_VAR = 0x13; // a class type variable VAR /***/ public static final int ELEMENT_TYPE_GENERICINST = 0x15; // GENERICINST ...
and then start to do something about parsing them in msil/PEFile.java
, in method PEFile.Sig.decodeType0()
case ELEMENT_TYPE_GENERICINST: // Followed by <type> token //ELEMENT_TYPE_GENERICINST <an mdTypeDef metadata token> <argument Count> <arg1> ... <argN> { // base type int tmp = readByte(); if((tmp != ELEMENT_TYPE_VALUETYPE) && (tmp != ELEMENT_TYPE_CLASS)) throw new RuntimeException("*1*>> "+ byte2hex(tmp) + "@" + pos() + " in " + this); int id = decodeInt(); type = pemodule.getTypeDefOrRef(id); if (type == null) throw new RuntimeException("**>> "+ byte2hex(desc) + "@" + pos() + " in " + this); // number of type arguments int num = decodeInt(); System.out.println("num = "+num); for(int i=0;i<num;++i) { Type t = decodeType0(); //TODO: use this information } } break; case ELEMENT_TYPE_VAR: { int index = decodeInt(); System.out.println("var of type "+index); // TODO: actually look up what the index means return Type.GetType("System.Object"); }
This is necessary but not sufficient -- this still leaves problems with types involving templated subtypes or interfaces, for which the first TODO is probably meaningful. As a consequence we're still a long way from a "hello .net 2.0 world!" example yet; let alone a rebuilt scala-compiler.jar
, alas.
No comments:
Post a Comment