public static Assembly emitPod(FPod pod, bool load, string path)
{
string podName = pod.m_podName;
Assembly assembly = (Assembly)assemblies[podName];
if (assembly == null)
{
Emitter emitter = new Emitter(podName, path);
// unzip the native.dll if one exists
unzipToTemp(pod, podName + "Native_.dll");
unzipToTemp(pod, podName + "Native_.pdb");
// emit the pod class itself (which declares all constants)
//FPodEmit.EmitAndLoad(emitter, pod);
FPodEmit.emit(emitter, pod);
// the Emitter needs base types to be defined before
// descendant types, so make sure everything gets stubbed
// out in the correct order ahead of time
for (int i=0; i<pod.m_types.Length; i++)
emitter.findType(pod.nname(pod.m_types[i].m_self));
// emit all the rest of the types in this pod
for (int i=0; i<pod.m_types.Length; i++)
{
FType ftype = pod.m_types[i];
FTypeRef tref = ftype.m_pod.typeRef(ftype.m_self);
Type parent = Type.find(tref.podName+"::"+tref.typeName, true);
// make sure we have reflected to setup slots
parent.reflect();
// route based on type
if ((ftype.m_flags & FConst.Mixin) != 0)
{
// interface
FMixinInterfaceEmit iemit = new FMixinInterfaceEmit(emitter, parent, ftype);
iemit.emit();
// body class
FMixinBodyEmit bemit = new FMixinBodyEmit(emitter, parent, ftype);
bemit.emit();
ftypes[ftype] = new FTypeEmit[] { iemit, bemit };
}
else if (parent.@is(Sys.ErrType))
{
// error
FErrEmit emitErr = new FErrEmit(emitter, parent, ftype);
emitErr.emit();
FErrValEmit emitErrVal = new FErrValEmit(emitter, parent, ftype);
emitErrVal.emit();
ftypes[ftype] = new FTypeEmit[] { emitErr, emitErrVal };
}
else
{
// class
FClassEmit emit = new FClassEmit(emitter, parent, ftype);
emit.emit();
ftypes[ftype] = new FTypeEmit[] { emit };
}
}
// commit assembly
byte[] buf = emitter.commit();
if (load)
{
//long start = System.Environment.TickCount;
// load assembly
assembly = (buf == null)
? Assembly.LoadFile(emitter.fileName)
: Assembly.Load(buf);
assemblies[podName] = assembly;
//long end = System.Environment.TickCount;
//System.Console.WriteLine("load " + podName + " in " + (end-start) + " ms");
// load $Pod type
FPodEmit.load(assembly, pod);
}
}
return assembly;
}