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