private void EmitFieldOnlyConstructorWithHash(TypeBuilder fnTB)
{
Type[] ctorTypes = CtorTypes();
Type[] altCtorTypes = new Type[ctorTypes.Length - AltCtorDrops];
for (int i = 0; i < altCtorTypes.Length; i++)
altCtorTypes[i] = ctorTypes[i];
ConstructorBuilder cb = fnTB.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, altCtorTypes);
CljILGen gen = new CljILGen(cb.GetILGenerator());
//Call full constructor
gen.EmitLoadArg(0); // gen.Emit(OpCodes.Ldarg_0);
for (int i = 0; i < altCtorTypes.Length; i++)
gen.EmitLoadArg(i + 1);
//for (int i = 0; i < AltCtorDrops; i++)
// gen.EmitNull();
gen.EmitNull(); // __meta
gen.EmitNull(); // __extmap
gen.Emit(OpCodes.Ldc_I4_0); // __hash
gen.Emit(OpCodes.Ldc_I4_0); // __hasheq
gen.Emit(OpCodes.Call, CtorInfo);
gen.Emit(OpCodes.Ret);
}