public virtual void TestNotPackTwice() { BranchBuilder bb = tr.Branch("refs/heads/master"); RevCommit first = bb.Commit().Message("M").Add("M", "M").Create(); bb.Commit().Message("B").Add("B", "Q").Create(); bb.Commit().Message("A").Add("A", "A").Create(); RevCommit second = tr.Commit().Parent(first).Message("R").Add("R", "Q").Create(); tr.Update("refs/tags/t1", second); ICollection <PackFile> oldPacks = ((ObjectDirectory)tr.GetRepository().ObjectDatabase ).GetPacks(); NUnit.Framework.Assert.AreEqual(0, oldPacks.Count); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(11, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); gc.SetExpireAgeMillis(0); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(0, stats.numberOfLooseObjects); Iterator <PackFile> pIt = ((ObjectDirectory)repo.ObjectDatabase).GetPacks().Iterator (); long c = pIt.Next().GetObjectCount(); if (c == 9) { NUnit.Framework.Assert.AreEqual(2, pIt.Next().GetObjectCount()); } else { NUnit.Framework.Assert.AreEqual(2, c); NUnit.Framework.Assert.AreEqual(9, pIt.Next().GetObjectCount()); } }
public void Branches1() { var branchBuilder = new BranchBuilder(); var l0 = branchBuilder.AddLabel(); var l64 = branchBuilder.AddLabel(); var l255 = branchBuilder.AddLabel(); branchBuilder.MarkLabel(0, l0); branchBuilder.MarkLabel(64, l64); branchBuilder.MarkLabel(255, l255); branchBuilder.AddBranch(0, l255, (byte)ILOpCode.Bge_s); branchBuilder.AddBranch(16, l0, (byte)ILOpCode.Bge_un_s); // blob boundary branchBuilder.AddBranch(33, l255, (byte)ILOpCode.Ble_s); // blob boundary branchBuilder.AddBranch(35, l0, (byte)ILOpCode.Ble_un_s); // branches immediately next to each other branchBuilder.AddBranch(37, l255, (byte)ILOpCode.Blt_s); // branches immediately next to each other branchBuilder.AddBranch(40, l64, (byte)ILOpCode.Blt_un_s); branchBuilder.AddBranch(254, l0, (byte)ILOpCode.Brfalse_s); // long branch at the end var dstBuilder = new BlobBuilder(); var srcBuilder = new BlobBuilder(capacity: 17); WriteFakeILWithBranches(srcBuilder, branchBuilder, size: 256); branchBuilder.FixupBranches(srcBuilder, dstBuilder); AssertEx.Equal(new byte[] { (byte)ILOpCode.Bge, 0xFA, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Bge_un_s, 0xEE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Ble, 0xD9, 0x00, 0x00, 0x00, (byte)ILOpCode.Ble_un_s, 0xDB, (byte)ILOpCode.Blt, 0xD5, 0x00, 0x00, 0x00, 0x01, (byte)ILOpCode.Blt_un_s, 0x16, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Brfalse, 0xFD, 0xFE, 0xFF, 0xFF, }, dstBuilder.ToArray()); }
CommitBuilder(TestRepository testRepository, BranchBuilder b) { _testRepository = testRepository; branch = b; global::GitSharp.Core.Ref @ref = _testRepository.db.getRef(branch.@ref); if (@ref != null) { parent(_testRepository.pool.parseCommit(@ref.ObjectId)); } }
public virtual void TestKeepFiles() { BranchBuilder bb = tr.Branch("refs/heads/master"); bb.Commit().Add("A", "A").Add("B", "B").Create(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(4, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackFiles); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(0, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(4, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(1, stats.numberOfPackFiles); Iterator <PackFile> packIt = ((ObjectDirectory)repo.ObjectDatabase).GetPacks().Iterator (); PackFile singlePack = packIt.Next(); NUnit.Framework.Assert.IsFalse(packIt.HasNext()); FilePath keepFile = new FilePath(singlePack.GetPackFile().GetPath() + ".keep"); NUnit.Framework.Assert.IsFalse(keepFile.Exists()); NUnit.Framework.Assert.IsTrue(keepFile.CreateNewFile()); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(4, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(4, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(1, stats.numberOfPackFiles); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(0, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(8, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(2, stats.numberOfPackFiles); // check that no object is packed twice Iterator <PackFile> packs = ((ObjectDirectory)repo.ObjectDatabase).GetPacks().Iterator (); PackIndex ind1 = packs.Next().GetIndex(); NUnit.Framework.Assert.AreEqual(4, ind1.GetObjectCount()); PackIndex ind2 = packs.Next().GetIndex(); NUnit.Framework.Assert.AreEqual(4, ind2.GetObjectCount()); foreach (PackIndex.MutableEntry e in ind1) { if (ind2.HasObject(e.ToObjectId())) { NUnit.Framework.Assert.IsFalse(ind2.HasObject(e.ToObjectId()), "the following object is in both packfiles: " + e.ToObjectId()); } } }
CommitBuilder(TestRepository testRepository, CommitBuilder prior) { _testRepository = testRepository; branch = prior.branch; DirCacheBuilder b = tree.builder(); for (int i = 0; i < prior.tree.getEntryCount(); i++) { b.add(prior.tree.getEntry(i)); } b.finish(); parents.Add(prior.create()); }
public virtual void TestPack2Commits() { BranchBuilder bb = tr.Branch("refs/heads/master"); bb.Commit().Add("A", "A").Add("B", "B").Create(); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(0, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(8, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(1, stats.numberOfPackFiles); }
public void AddingNewBranch() { var branch = BranchBuilder.CreateDefault().Build(); Driver.LogBudgetUser(); Driver.BasePage() .NavMenu.OpenManagementTab() .BranchesList() .AddNewBranch() .GoToPersonsList(1) .AddPersons() .GoToPersonsList() .AddPersons(3) .SaveBranch(branch) .SearchBranch(branch); }
public virtual void TestPackCommitsAndLooseOneWithPruneNow() { BranchBuilder bb = tr.Branch("refs/heads/master"); RevCommit first = bb.Commit().Add("A", "A").Add("B", "B").Create(); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); tr.Update("refs/heads/master", first); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); gc.SetExpireAgeMillis(0); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(0, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(8, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(2, stats.numberOfPackFiles); }
public virtual void TestIndexSavesObjects() { BranchBuilder bb = tr.Branch("refs/heads/master"); bb.Commit().Add("A", "A").Add("B", "B").Create(); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); bb.Commit().Add("A", "A3"); // this new content in index should survive stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(9, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(1, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(8, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(1, stats.numberOfPackFiles); }
public virtual void TestPackCommitsAndLooseOneNoReflog() { BranchBuilder bb = tr.Branch("refs/heads/master"); RevCommit first = bb.Commit().Add("A", "A").Add("B", "B").Create(); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); tr.Update("refs/heads/master", first); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(0, stats.numberOfPackedObjects); FileUtils.Delete(new FilePath(repo.Directory, "logs/HEAD"), FileUtils.RETRY | FileUtils .SKIP_MISSING); FileUtils.Delete(new FilePath(repo.Directory, "logs/refs/heads/master"), FileUtils .RETRY | FileUtils.SKIP_MISSING); gc.Gc(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(4, stats.numberOfLooseObjects); NUnit.Framework.Assert.AreEqual(4, stats.numberOfPackedObjects); NUnit.Framework.Assert.AreEqual(1, stats.numberOfPackFiles); }
private static void WriteFakeILWithBranches(BlobBuilder builder, BranchBuilder branchBuilder, int size) { Assert.Equal(0, builder.Count); const byte filling = 0x01; int ilOffset = 0; foreach (var branch in branchBuilder.Branches) { builder.WriteBytes(filling, branch.ILOffset - ilOffset); Assert.Equal(branch.ILOffset, builder.Count); builder.WriteByte(branch.ShortOpCode); builder.WriteByte(0xff); ilOffset = branch.ILOffset + 2; } builder.WriteBytes(filling, size - ilOffset); Assert.Equal(size, builder.Count); }
public virtual void TestPruneNone() { BranchBuilder bb = tr.Branch("refs/heads/master"); bb.Commit().Add("A", "A").Add("B", "B").Create(); bb.Commit().Add("A", "A2").Add("B", "B2").Create(); new FilePath(repo.Directory, Constants.LOGS + "/refs/heads/master").Delete(); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); gc.SetExpireAgeMillis(0); gc.Prune(Sharpen.Collections.EmptySet <ObjectId>()); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); tr.Blob("x"); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(9, stats.numberOfLooseObjects); gc.Prune(Sharpen.Collections.EmptySet <ObjectId>()); stats = gc.GetStatistics(); NUnit.Framework.Assert.AreEqual(8, stats.numberOfLooseObjects); }
public void BranchErrors() { var codeBuilder = new BlobBuilder(); var il = new InstructionEncoder(codeBuilder); Assert.Throws <InvalidOperationException>(() => il.DefineLabel()); il = new InstructionEncoder(codeBuilder, new BranchBuilder()); il.DefineLabel(); il.DefineLabel(); var l2 = il.DefineLabel(); var branchBuilder = new BranchBuilder(); il = new InstructionEncoder(codeBuilder, branchBuilder); var l0 = il.DefineLabel(); Assert.Throws <ArgumentException>(() => il.Branch(ILOpCode.Nop, l0)); Assert.Throws <ArgumentNullException>(() => il.Branch(ILOpCode.Br, default(LabelHandle))); Assert.Throws <ArgumentException>(() => il.Branch(ILOpCode.Br, l2)); }
public ExceptionRegionEncoder WriteInstructions(BlobBuilder codeBuilder, BranchBuilder branchBuilder, out int bodyOffset) { if (branchBuilder == null || branchBuilder.BranchCount == 0) { return(WriteInstructions(codeBuilder, out bodyOffset)); } // When emitting branches we emitted short branches. int initialCodeSize = codeBuilder.Count; Blob codeSizeFixup; if (IsTiny(initialCodeSize)) { // If the method is tiny so far then all branches have to be short // (the max distance between any label and a branch instruction is < 64). bodyOffset = WriteHeader(initialCodeSize); codeSizeFixup = default(Blob); } else { // Otherwise, it's fat format and we can fixup the size later on: bodyOffset = WriteHeader(initialCodeSize, true, out codeSizeFixup); } int codeStartOffset = Builder.Count; branchBuilder.FixupBranches(codeBuilder, Builder); if (!codeSizeFixup.IsDefault) { new BlobWriter(codeSizeFixup).WriteInt32(Builder.Count - codeStartOffset); } else { Debug.Assert(initialCodeSize == Builder.Count - codeStartOffset); } return(CreateExceptionEncoder()); }
public virtual void TestExclude() { FileRepository repo = CreateBareRepository(); TestRepository <FileRepository> testRepo = new TestRepository <FileRepository>(repo ); BranchBuilder bb = testRepo.Branch("refs/heads/master"); RevBlob contentA = testRepo.Blob("A"); RevCommit c1 = bb.Commit().Add("f", contentA).Create(); testRepo.GetRevWalk().ParseHeaders(c1); PackIndex pf1 = WritePack(repo, Sharpen.Collections.Singleton(c1), Sharpen.Collections .EmptySet <PackIndex>()); AssertContent(pf1, Arrays.AsList(c1.Id, c1.Tree.Id, contentA.Id)); RevBlob contentB = testRepo.Blob("B"); RevCommit c2 = bb.Commit().Add("f", contentB).Create(); testRepo.GetRevWalk().ParseHeaders(c2); PackIndex pf2 = WritePack(repo, Sharpen.Collections.Singleton(c2), Sharpen.Collections .Singleton(pf1)); AssertContent(pf2, Arrays.AsList(c2.Id, c2.Tree.Id, contentB.Id)); }
public void BranchErrors() { var codeBuilder = new BlobBuilder(); var il = new InstructionEncoder(codeBuilder); Assert.Throws<InvalidOperationException>(() => il.DefineLabel()); il = new InstructionEncoder(codeBuilder, new BranchBuilder()); il.DefineLabel(); il.DefineLabel(); var l2 = il.DefineLabel(); var branchBuilder = new BranchBuilder(); il = new InstructionEncoder(codeBuilder, branchBuilder); var l0 = il.DefineLabel(); Assert.Throws<ArgumentException>(() => il.Branch(ILOpCode.Nop, l0)); Assert.Throws<ArgumentNullException>(() => il.Branch(ILOpCode.Br, default(LabelHandle))); Assert.Throws<ArgumentException>(() => il.Branch(ILOpCode.Br, l2)); }
public void Branches1() { var branchBuilder = new BranchBuilder(); var l0 = branchBuilder.AddLabel(); var l64 = branchBuilder.AddLabel(); var l255 = branchBuilder.AddLabel(); branchBuilder.MarkLabel(0, l0); branchBuilder.MarkLabel(64, l64); branchBuilder.MarkLabel(255, l255); branchBuilder.AddBranch(0, l255, (byte)ILOpCode.Bge_s); branchBuilder.AddBranch(16, l0, (byte)ILOpCode.Bge_un_s); // blob boundary branchBuilder.AddBranch(33, l255, (byte)ILOpCode.Ble_s); // blob boundary branchBuilder.AddBranch(35, l0, (byte)ILOpCode.Ble_un_s); // branches immediately next to each other branchBuilder.AddBranch(37, l255, (byte)ILOpCode.Blt_s); // branches immediately next to each other branchBuilder.AddBranch(40, l64, (byte)ILOpCode.Blt_un_s); branchBuilder.AddBranch(254, l0, (byte)ILOpCode.Brfalse_s); // long branch at the end var dstBuilder = new BlobBuilder(); var srcBuilder = new BlobBuilder(size: 17); WriteFakeILWithBranches(srcBuilder, branchBuilder, size: 256); branchBuilder.FixupBranches(srcBuilder, dstBuilder); AssertEx.Equal(new byte[] { (byte)ILOpCode.Bge, 0xFA, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Bge_un_s, 0xEE, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Ble, 0xD9, 0x00, 0x00, 0x00, (byte)ILOpCode.Ble_un_s, 0xDB, (byte)ILOpCode.Blt, 0xD5, 0x00, 0x00, 0x00, 0x01, (byte)ILOpCode.Blt_un_s, 0x16, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, (byte)ILOpCode.Brfalse, 0xFD, 0xFE, 0xFF, 0xFF, }, dstBuilder.ToArray()); }
private static MethodDefinitionHandle BasicValidationEmit(MetadataBuilder metadata, BlobBuilder ilBuilder) { metadata.AddModule( 0, metadata.GetOrAddString("ConsoleApplication.exe"), metadata.GetOrAddGuid(Guid.NewGuid()), default(GuidHandle), default(GuidHandle)); metadata.AddAssembly( metadata.GetOrAddString("ConsoleApplication"), version: new Version(0, 0, 0, 0), culture: default(StringHandle), publicKey: default(BlobHandle), flags: default(AssemblyFlags), hashAlgorithm: AssemblyHashAlgorithm.Sha1); var mscorlibAssemblyRef = metadata.AddAssemblyReference( name: metadata.GetOrAddString("mscorlib"), version: new Version(4, 0, 0, 0), culture: default(StringHandle), publicKeyOrToken: metadata.GetOrAddBlob(ImmutableArray.Create<byte>(0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89)), flags: default(AssemblyFlags), hashValue: default(BlobHandle)); var systemObjectTypeRef = metadata.AddTypeReference( mscorlibAssemblyRef, metadata.GetOrAddString("System"), metadata.GetOrAddString("Object")); var systemConsoleTypeRefHandle = metadata.AddTypeReference( mscorlibAssemblyRef, metadata.GetOrAddString("System"), metadata.GetOrAddString("Console")); var consoleWriteLineSignature = new BlobBuilder(); new BlobEncoder(consoleWriteLineSignature). MethodSignature(). Parameters(1, returnType => returnType.Void(), parameters => { parameters.AddParameter().Type().String(); parameters.EndParameters(); }); var consoleWriteLineMemberRef = metadata.AddMemberReference( systemConsoleTypeRefHandle, metadata.GetOrAddString("WriteLine"), metadata.GetOrAddBlob(consoleWriteLineSignature)); var parameterlessCtorSignature = new BlobBuilder(); new BlobEncoder(parameterlessCtorSignature). MethodSignature(isInstanceMethod: true). Parameters(0, returnType => returnType.Void(), parameters => parameters.EndParameters()); var parameterlessCtorBlobIndex = metadata.GetOrAddBlob(parameterlessCtorSignature); var objectCtorMemberRef = metadata.AddMemberReference( systemObjectTypeRef, metadata.GetOrAddString(".ctor"), parameterlessCtorBlobIndex); var mainSignature = new BlobBuilder(); new BlobEncoder(mainSignature). MethodSignature(). Parameters(0, returnType => returnType.Void(), parameters => parameters.EndParameters()); var methodBodies = new MethodBodiesEncoder(ilBuilder); var codeBuilder = new BlobBuilder(); var branchBuilder = new BranchBuilder(); InstructionEncoder il; // // Program::.ctor // int ctorBodyOffset; il = new InstructionEncoder(codeBuilder); // ldarg.0 il.LoadArgument(0); // call instance void [mscorlib]System.Object::.ctor() il.Call(objectCtorMemberRef); // ret il.OpCode(ILOpCode.Ret); methodBodies.AddMethodBody().WriteInstructions(codeBuilder, out ctorBodyOffset); codeBuilder.Clear(); // // Program::Main // int mainBodyOffset; il = new InstructionEncoder(codeBuilder, branchBuilder); var endLabel = il.DefineLabel(); // .try int tryOffset = il.Offset; // ldstr "hello" il.LoadString(metadata.GetOrAddUserString("hello")); // call void [mscorlib]System.Console::WriteLine(string) il.Call(consoleWriteLineMemberRef); // leave.s END il.Branch(ILOpCode.Leave, endLabel); // .finally int handlerOffset = il.Offset; // ldstr "world" il.LoadString(metadata.GetOrAddUserString("world")); // call void [mscorlib]System.Console::WriteLine(string) il.Call(consoleWriteLineMemberRef); // .endfinally il.OpCode(ILOpCode.Endfinally); int handlerEnd = il.Offset; // END: il.MarkLabel(endLabel); // ret il.OpCode(ILOpCode.Ret); var body = methodBodies.AddMethodBody(exceptionRegionCount: 1); var eh = body.WriteInstructions(codeBuilder, branchBuilder, out mainBodyOffset); eh.StartRegions(); eh.AddFinally(tryOffset, handlerOffset - tryOffset, handlerOffset, handlerEnd - handlerOffset); eh.EndRegions(); codeBuilder.Clear(); branchBuilder.Clear(); var mainMethodDef = metadata.AddMethodDefinition( MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig, MethodImplAttributes.IL | MethodImplAttributes.Managed, metadata.GetOrAddString("Main"), metadata.GetOrAddBlob(mainSignature), mainBodyOffset, paramList: default(ParameterHandle)); var ctorDef = metadata.AddMethodDefinition( MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, MethodImplAttributes.IL | MethodImplAttributes.Managed, metadata.GetOrAddString(".ctor"), parameterlessCtorBlobIndex, ctorBodyOffset, paramList: default(ParameterHandle)); metadata.AddTypeDefinition( default(TypeAttributes), default(StringHandle), metadata.GetOrAddString("<Module>"), baseType: default(EntityHandle), fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: mainMethodDef); metadata.AddTypeDefinition( TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.AutoLayout | TypeAttributes.BeforeFieldInit, metadata.GetOrAddString("ConsoleApplication"), metadata.GetOrAddString("Program"), systemObjectTypeRef, fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: mainMethodDef); return mainMethodDef; }
public InstructionEncoder(BlobBuilder builder, BranchBuilder branchBuilder = null) { Builder = builder; _branchBuilderOpt = branchBuilder; }
public unsafe void TinyBody() { var bodyBuilder = new BlobBuilder(); var codeBuilder = new BlobBuilder(); var branchBuilder = new BranchBuilder(); var il = new InstructionEncoder(codeBuilder, branchBuilder); var bodyEncoder = new MethodBodyEncoder( bodyBuilder, maxStack: 2, exceptionRegionCount: 0, localVariablesSignature: default(StandaloneSignatureHandle), attributes: MethodBodyAttributes.None); Assert.True(bodyEncoder.IsTiny(10)); Assert.True(bodyEncoder.IsTiny(63)); Assert.False(bodyEncoder.IsTiny(64)); codeBuilder.WriteBytes(1, 61); var l1 = il.DefineLabel(); il.MarkLabel(l1); Assert.Equal(61, branchBuilder.Labels.Single()); il.Branch(ILOpCode.Br, l1); var brInfo = branchBuilder.Branches.Single(); Assert.Equal(61, brInfo.ILOffset); Assert.Equal(l1, brInfo.Label); Assert.Equal((byte)ILOpCode.Br_s, brInfo.ShortOpCode); AssertEx.Equal(new byte[] { 1, (byte)ILOpCode.Br_s, unchecked ((byte)-1) }, codeBuilder.ToArray(60, 3)); int bodyOffset; bodyEncoder.WriteInstructions(codeBuilder, branchBuilder, out bodyOffset); var bodyBytes = bodyBuilder.ToArray(); AssertEx.Equal(new byte[] { 0xFE, // tiny header 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2B, 0xFE }, bodyBytes); fixed(byte *bodyPtr = &bodyBytes[0]) { var body = MethodBodyBlock.Create(new BlobReader(bodyPtr, bodyBytes.Length)); Assert.Equal(0, body.ExceptionRegions.Length); Assert.Equal(default(StandaloneSignatureHandle), body.LocalSignature); Assert.Equal(8, body.MaxStack); Assert.Equal(bodyBytes.Length, body.Size); var ilBytes = body.GetILBytes(); AssertEx.Equal(new byte[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2B, 0xFE }, ilBytes); } }
public CommitBuilder(TestRepository testRepository) { _testRepository = testRepository; branch = null; }
public unsafe void TinyBody() { var bodyBuilder = new BlobBuilder(); var codeBuilder = new BlobBuilder(); var branchBuilder = new BranchBuilder(); var il = new InstructionEncoder(codeBuilder, branchBuilder); var bodyEncoder = new MethodBodyEncoder( bodyBuilder, maxStack: 2, exceptionRegionCount: 0, localVariablesSignature: default(StandaloneSignatureHandle), attributes: MethodBodyAttributes.None); Assert.True(bodyEncoder.IsTiny(10)); Assert.True(bodyEncoder.IsTiny(63)); Assert.False(bodyEncoder.IsTiny(64)); codeBuilder.WriteBytes(1, 61); var l1 = il.DefineLabel(); il.MarkLabel(l1); Assert.Equal(61, branchBuilder.Labels.Single()); il.Branch(ILOpCode.Br, l1); var brInfo = branchBuilder.Branches.Single(); Assert.Equal(61, brInfo.ILOffset); Assert.Equal(l1, brInfo.Label); Assert.Equal((byte)ILOpCode.Br_s, brInfo.ShortOpCode); AssertEx.Equal(new byte[] { 1, (byte)ILOpCode.Br_s, unchecked((byte)-1) }, codeBuilder.ToArray(60, 3)); int bodyOffset; bodyEncoder.WriteInstructions(codeBuilder, branchBuilder, out bodyOffset); var bodyBytes = bodyBuilder.ToArray(); AssertEx.Equal(new byte[] { 0xFE, // tiny header 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2B, 0xFE }, bodyBytes); fixed (byte* bodyPtr = &bodyBytes[0]) { var body = MethodBodyBlock.Create(new BlobReader(bodyPtr, bodyBytes.Length)); Assert.Equal(0, body.ExceptionRegions.Length); Assert.Equal(default(StandaloneSignatureHandle), body.LocalSignature); Assert.Equal(8, body.MaxStack); Assert.Equal(bodyBytes.Length, body.Size); var ilBytes = body.GetILBytes(); AssertEx.Equal(new byte[] { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x2B, 0xFE }, ilBytes); } }
private static MethodDefinitionHandle BasicValidationEmit(MetadataBuilder metadata, BlobBuilder ilBuilder) { metadata.AddModule( 0, metadata.GetOrAddString("ConsoleApplication.exe"), metadata.GetOrAddGuid(Guid.NewGuid()), default(GuidHandle), default(GuidHandle)); metadata.AddAssembly( metadata.GetOrAddString("ConsoleApplication"), version: new Version(0, 0, 0, 0), culture: default(StringHandle), publicKey: default(BlobHandle), flags: default(AssemblyFlags), hashAlgorithm: AssemblyHashAlgorithm.Sha1); var mscorlibAssemblyRef = metadata.AddAssemblyReference( name: metadata.GetOrAddString("mscorlib"), version: new Version(4, 0, 0, 0), culture: default(StringHandle), publicKeyOrToken: metadata.GetOrAddBlob(ImmutableArray.Create <byte>(0xB7, 0x7A, 0x5C, 0x56, 0x19, 0x34, 0xE0, 0x89)), flags: default(AssemblyFlags), hashValue: default(BlobHandle)); var systemObjectTypeRef = metadata.AddTypeReference( mscorlibAssemblyRef, metadata.GetOrAddString("System"), metadata.GetOrAddString("Object")); var systemConsoleTypeRefHandle = metadata.AddTypeReference( mscorlibAssemblyRef, metadata.GetOrAddString("System"), metadata.GetOrAddString("Console")); var consoleWriteLineSignature = new BlobBuilder(); new BlobEncoder(consoleWriteLineSignature). MethodSignature(). Parameters(1, returnType => returnType.Void(), parameters => parameters.AddParameter().Type().String()); var consoleWriteLineMemberRef = metadata.AddMemberReference( systemConsoleTypeRefHandle, metadata.GetOrAddString("WriteLine"), metadata.GetOrAddBlob(consoleWriteLineSignature)); var parameterlessCtorSignature = new BlobBuilder(); new BlobEncoder(parameterlessCtorSignature). MethodSignature(isInstanceMethod: true). Parameters(0, returnType => returnType.Void(), parameters => { }); var parameterlessCtorBlobIndex = metadata.GetOrAddBlob(parameterlessCtorSignature); var objectCtorMemberRef = metadata.AddMemberReference( systemObjectTypeRef, metadata.GetOrAddString(".ctor"), parameterlessCtorBlobIndex); var mainSignature = new BlobBuilder(); new BlobEncoder(mainSignature). MethodSignature(). Parameters(0, returnType => returnType.Void(), parameters => { }); var methodBodies = new MethodBodiesEncoder(ilBuilder); var codeBuilder = new BlobBuilder(); var branchBuilder = new BranchBuilder(); InstructionEncoder il; // // Program::.ctor // int ctorBodyOffset; il = new InstructionEncoder(codeBuilder); // ldarg.0 il.LoadArgument(0); // call instance void [mscorlib]System.Object::.ctor() il.Call(objectCtorMemberRef); // ret il.OpCode(ILOpCode.Ret); methodBodies.AddMethodBody().WriteInstructions(codeBuilder, out ctorBodyOffset); codeBuilder.Clear(); // // Program::Main // int mainBodyOffset; il = new InstructionEncoder(codeBuilder, branchBuilder); var endLabel = il.DefineLabel(); // .try int tryOffset = il.Offset; // ldstr "hello" il.LoadString(metadata.GetOrAddUserString("hello")); // call void [mscorlib]System.Console::WriteLine(string) il.Call(consoleWriteLineMemberRef); // leave.s END il.Branch(ILOpCode.Leave, endLabel); // .finally int handlerOffset = il.Offset; // ldstr "world" il.LoadString(metadata.GetOrAddUserString("world")); // call void [mscorlib]System.Console::WriteLine(string) il.Call(consoleWriteLineMemberRef); // .endfinally il.OpCode(ILOpCode.Endfinally); int handlerEnd = il.Offset; // END: il.MarkLabel(endLabel); // ret il.OpCode(ILOpCode.Ret); var body = methodBodies.AddMethodBody(exceptionRegionCount: 1); var eh = body.WriteInstructions(codeBuilder, branchBuilder, out mainBodyOffset); eh.StartRegions(); eh.AddFinally(tryOffset, handlerOffset - tryOffset, handlerOffset, handlerEnd - handlerOffset); eh.EndRegions(); codeBuilder.Clear(); branchBuilder.Clear(); var mainMethodDef = metadata.AddMethodDefinition( MethodAttributes.Public | MethodAttributes.Static | MethodAttributes.HideBySig, MethodImplAttributes.IL | MethodImplAttributes.Managed, metadata.GetOrAddString("Main"), metadata.GetOrAddBlob(mainSignature), mainBodyOffset, paramList: default(ParameterHandle)); var ctorDef = metadata.AddMethodDefinition( MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName, MethodImplAttributes.IL | MethodImplAttributes.Managed, metadata.GetOrAddString(".ctor"), parameterlessCtorBlobIndex, ctorBodyOffset, paramList: default(ParameterHandle)); metadata.AddTypeDefinition( default(TypeAttributes), default(StringHandle), metadata.GetOrAddString("<Module>"), baseType: default(EntityHandle), fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: mainMethodDef); metadata.AddTypeDefinition( TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.AutoLayout | TypeAttributes.BeforeFieldInit, metadata.GetOrAddString("ConsoleApplication"), metadata.GetOrAddString("Program"), systemObjectTypeRef, fieldList: MetadataTokens.FieldDefinitionHandle(1), methodList: mainMethodDef); return(mainMethodDef); }