Пример #1
0
        public CodeGenResult Generate()
        {
            try
            {
                NewContext();
                var modelsScript = "";
                foreach (var param in _modelsGeneratorInputs)
                {
                    modelsScript += GenerateModelSourceCode(param) + "\n";
                }

                var usings = CurrentContext.GetNamespaces();
                if (usings.Contains(_namespaceStr))
                {
                    usings.Remove(_namespaceStr);
                }
                modelsScript = CodeGenExtensions.WrapClass(modelsScript, _namespaceStr, usings);

                var res = new CodeGenResult
                {
                    Context    = CurrentContext,
                    CSharpCode = modelsScript
                };
                return(res);
            }
            catch (Exception ex)
            {
                throw new CodeGenException($"Exception in {GetType().Name}.", ex);
            }
        }
Пример #2
0
        private static bool CompileIntegerDivision(CodeGen codeGen, ILinkingInfo linkingInfo, Type type, Register leftReg, ExpressionResult rightExpr)
        {
            var rightReg = type.OtherVolatileIntRegister(leftReg, Register64.RAX, Register64.RDX);

            rightExpr.GenerateMoveTo(rightReg, type, codeGen, linkingInfo);

            if (!leftReg.IsSameRegister(Register64.RAX))
            {
                codeGen.Mov(Register64.RAX, leftReg.AsR64());
            }

            var typeIsByte   = type.SizeOf() == 1;
            var typeIsSigned = type.IsSignedInteger();

            if (typeIsByte)
            {
                if (typeIsSigned)
                {
                    codeGen.Movsx(Register64.RAX, Register8.AL);
                }
                else
                {
                    codeGen.Movzx(Register64.RAX, Register8.AL);
                }
            }
            else
            {
                codeGen.Xor(Register64.RDX, Register64.RDX);
                if (typeIsSigned)
                {
                    codeGen.Test(Register64.RAX, Register64.RAX);
                    codeGen.Jns(CodeGenExtensions.InstructionLength(gen => gen.Not(Register64.RDX)));
                    codeGen.Not(Register64.RDX);
                }
            }

            if (type.IsSignedInteger())
            {
                codeGen.Idiv(rightReg);
            }
            else
            {
                codeGen.Div(rightReg);
            }
            return(typeIsByte);
        }
Пример #3
0
        public void Test()
        {
            const string Source = @"
//Use types from different namespaces and assemblies.
public class GenClass1
{
    public int Num { get; set; }=100;
    
    public Stream SomeProp1 { get; set; }

    public List<string> SomeProp2 { get; set; }

    public Task<Dictionary<string, MemberInfo>> SomeMethod1(){ return null; }
}
";
            //Easy manage depemdensies.
            var ctx = new SourceFileContext();

            ctx.UsedType(typeof(int));
            ctx.UsedType(typeof(Stream));
            ctx.UsedType(typeof(List <string>));

            //Works with generic parameters automatically.
            ctx.UsedType(typeof(Task <Dictionary <string, MemberInfo> >));

            //Add namespace and usings.
            var source = CodeGenExtensions.WrapClass(
                Source,
                "MyNamespace",
                ctx.GetNamespaces()
                );
            var compilerInputData = new CompilerInputData()
            {
                CSharpCode           = source,
                ReferencedAssemblies = ctx.GetAssemblies()
            };
            var     assembly      = Compiler.Compile(compilerInputData);
            var     type          = assembly.GetType("MyNamespace.GenClass1");
            dynamic modelInstance = Activator.CreateInstance(type);
            int     num           = modelInstance.Num;

            Assert.AreEqual(100, num);
        }