/// <summary> /// /// T Build(IServiceProvider sp); /// </summary> XamlIlEmitContext InitCodeGen(Func <string, IXamlIlType, IXamlIlTypeBuilder> createSubType, IXamlIlEmitter codeGen, XamlIlContext context, bool needContextLocal) { IXamlIlLocal contextLocal = null; if (needContextLocal) { contextLocal = codeGen.DefineLocal(context.ContextType); codeGen .Emit(OpCodes.Ldarg_0) .Emit(OpCodes.Newobj, context.Constructor) .Emit(OpCodes.Stloc, contextLocal); } var emitContext = new XamlIlEmitContext(codeGen, _configuration, context, contextLocal, createSubType, Emitters); return(emitContext); }
XamlIlEmitContext InitCodeGen( IFileSource file, Func <string, IXamlIlType, IXamlIlTypeBuilder> createSubType, IXamlIlEmitter codeGen, XamlIlContext context, bool needContextLocal) { IXamlIlLocal contextLocal = null; if (needContextLocal) { contextLocal = codeGen.DefineLocal(context.ContextType); // Pass IService provider as the first argument to context factory codeGen .Emit(OpCodes.Ldarg_0); context.Factory(codeGen); codeGen.Emit(OpCodes.Stloc, contextLocal); } var emitContext = new XamlIlEmitContext(codeGen, _configuration, context, contextLocal, createSubType, file, Emitters); return(emitContext); }
/// <summary> /// populate = true: /// void Populate(IServiceProvider sp, T target); /// populate = false /// T Build(IServiceProvider sp); /// </summary> public void Compile(IXamlIlAstNode root, IXamlIlCodeGen codeGen, XamlIlContext context, bool populate) { var contextLocal = codeGen.Generator.DefineLocal(context.ContextType); codeGen.Generator .Emit(OpCodes.Ldarg_0) .Emit(OpCodes.Newobj, context.Constructor) .Emit(OpCodes.Stloc, contextLocal); var rootGrp = (XamlIlValueWithManipulationNode)root; var emitContext = new XamlIlEmitContext(_configuration, context, contextLocal, Emitters); if (populate) { codeGen.Generator .Emit(OpCodes.Ldloc, contextLocal) .Emit(OpCodes.Ldarg_1) .Emit(OpCodes.Stfld, context.RootObjectField) .Emit(OpCodes.Ldarg_1); emitContext.Emit(rootGrp.Manipulation, codeGen, null); codeGen.Generator.Emit(OpCodes.Ret); } else { codeGen.Generator.Emit(OpCodes.Ldloc, contextLocal); emitContext.Emit(rootGrp.Value, codeGen, rootGrp.Value.Type.GetClrType()); codeGen.Generator .Emit(OpCodes.Stfld, context.RootObjectField); codeGen.Generator .Emit(OpCodes.Ldloc, contextLocal) .Emit(OpCodes.Ldfld, context.RootObjectField) .Emit(OpCodes.Dup); emitContext.Emit(rootGrp.Manipulation, codeGen, null); codeGen.Generator.Emit(OpCodes.Ret); } }
public PooledLocal(XamlIlEmitContext parent, IXamlIlType type, IXamlIlLocal local) { Local = local; _parent = parent; _type = type; }