private void loadType(FTypeRef tref)
{
string podName = tref.podName;
string typeName = tref.typeName;
// if pod is "sys", then we can perform a shortcut and use
// one of the predefined fields in Sys
if (!tref.isGenericInstance() && podName == "sys")
{
PERWAPI.Field field = emitter.findField("Fan.Sys.Sys", typeName + "Type", "Fan.Sys.Type");
code.FieldInst(FieldOp.ldsfld, field);
if (tref.isNullable()) typeToNullable();
return;
}
// lazy allocate my parent's type literal map: sig -> fieldName
if (parent.typeLiteralFields == null) parent.typeLiteralFields = new Hashtable();
Hashtable map = parent.typeLiteralFields;
// types are lazy loaded and then cached in a private static field called
// type$count which will get generated by FTypeEmit (we keep track of signature
// to fieldname in the typeConstFields map)
string sig = tref.signature;
string fieldName = (string)map[sig];
if (fieldName == null)
{
fieldName = "type$" + map.Count;
map[sig] = fieldName;
}
//int fieldRef = emit.field(parent.className + "." + fieldName + ":Lfan/sys/Type;");
//code.op2(GETSTATIC, fieldRef);
//code.op(DUP);
//int nonNull = code.branch(IFNONNULL);
//code.op(POP);
//code.op2(LDC_W, emit.strConst(sig));
//code.op(ICONST_1);
//code.op2(INVOKESTATIC, parent.sysFindType());
//code.op(DUP);
//code.op2(PUTSTATIC, fieldRef);
//code.mark(nonNull);
//emitter.EmitField(string name, string type, FieldAttr attr)
//PERWAPI.Field field = emitter.EmitField("Fan.Sys.Sys", typeName + "Type", "Fan.Sys.Type");
//code.FieldInst(FieldOp.ldsfld, field);
// TODO - store in static field (all that crap above this)
code.ldstr(sig);
Method method = emitter.findMethod("Fan.Sys.Type", "find",
new string[] { "System.String" }, "Fan.Sys.Type");
code.MethInst(MethodOp.call, method);
}