public void StLocal(XamlIlAstCompilerLocalNode node, IXamlIlEmitter codeGen) { if (!_locals.TryGetValue(node, out var local)) { _locals[node] = local = codeGen.DefineLocal(node.Type); } codeGen.Emit(OpCodes.Stloc, local); }
public IXamlIlLocal DefineLocal(IXamlIlType type) { var rv = _inner.DefineLocal(type); _locals[rv] = new LocalInfo { Number = _locals.Count, Type = type }; return(rv); }
/// <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); }
void CompileBuild(IXamlIlAstValueNode rootInstance, Func <string, IXamlIlType, IXamlIlTypeBuilder> createSubType, IXamlIlEmitter codeGen, XamlIlContext context, IXamlIlMethod compiledPopulate) { var needContextLocal = !(rootInstance is XamlIlAstNewClrObjectNode newObj && newObj.Arguments.Count == 0); var emitContext = InitCodeGen(createSubType, codeGen, context, needContextLocal); var rv = codeGen.DefineLocal(rootInstance.Type.GetClrType()); emitContext.Emit(rootInstance, codeGen, rootInstance.Type.GetClrType()); codeGen .Emit(OpCodes.Stloc, rv) .Emit(OpCodes.Ldarg_0) .Emit(OpCodes.Ldloc, rv) .Emit(OpCodes.Call, compiledPopulate) .Emit(OpCodes.Ldloc, rv) .Emit(OpCodes.Ret); }
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); }
public IXamlIlLocal DefineLocal(IXamlIlType type) { return(_inner.DefineLocal(type)); }