コード例 #1
0
        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);
        }
コード例 #2
0
        public IXamlIlLocal DefineLocal(IXamlIlType type)
        {
            var rv = _inner.DefineLocal(type);

            _locals[rv] = new LocalInfo {
                Number = _locals.Count, Type = type
            };
            return(rv);
        }
コード例 #3
0
ファイル: XamlIlCompiler.cs プロジェクト: cm4ker/XamlIl
        /// <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);
        }
コード例 #4
0
ファイル: XamlIlCompiler.cs プロジェクト: cm4ker/XamlIl
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
ファイル: CheckingIlEmitter.cs プロジェクト: OmniUI/XamlIl2
 public IXamlIlLocal DefineLocal(IXamlIlType type)
 {
     return(_inner.DefineLocal(type));
 }