private void EmitILForINeedEngineMethods(){
if (!this.needsEngine)
return;
TypeBuilder classwriter = (TypeBuilder)this.classob.classwriter;
FieldBuilder backingField = classwriter.DefineField("vsa Engine", Typeob.VsaEngine, FieldAttributes.Private | FieldAttributes.NotSerialized);
MethodBuilder getMeth = classwriter.DefineMethod("GetEngine", MethodAttributes.Private|MethodAttributes.Virtual, Typeob.VsaEngine, null);
ILGenerator il = getMeth.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, backingField);
il.Emit(OpCodes.Ldnull);
Label endif = il.DefineLabel();
il.Emit(OpCodes.Bne_Un_S, endif);
il.Emit(OpCodes.Ldarg_0);
if (this.body.Engine.doCRS)
il.Emit(OpCodes.Ldsfld, CompilerGlobals.contextEngineField);
else {
if (this.context.document.engine.PEFileKind == PEFileKinds.Dll){
il.Emit(OpCodes.Ldtoken, classwriter);
il.Emit(OpCodes.Call, CompilerGlobals.createVsaEngineWithType);
}else
il.Emit(OpCodes.Call, CompilerGlobals.createVsaEngine);
}
il.Emit(OpCodes.Stfld, backingField);
il.MarkLabel(endif);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, backingField);
il.Emit(OpCodes.Ret);
classwriter.DefineMethodOverride(getMeth, CompilerGlobals.getEngineMethod);
MethodBuilder setMeth = classwriter.DefineMethod("SetEngine", MethodAttributes.Private|MethodAttributes.Virtual, Typeob.Void, new Type[]{Typeob.VsaEngine});
il = setMeth.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Stfld, backingField);
il.Emit(OpCodes.Ret);
classwriter.DefineMethodOverride(setMeth, CompilerGlobals.setEngineMethod);
}