Skip to content

Commit

Permalink
resolve conflicts
Browse files Browse the repository at this point in the history
  • Loading branch information
Shawn committed Apr 26, 2020
2 parents 5c01853 + d6e5297 commit 575c3d7
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 17 deletions.
16 changes: 12 additions & 4 deletions src/Neo.Compiler.MSIL/Optimizer/NefInstruction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,10 +80,18 @@ public int GetAddressInData(int index)
if (AddressSize == 0)
throw new Exception("this data have not Addresses");

byte[] buf = new byte[4];
Array.Copy(Data, AddressSize * index, buf, 0, AddressSize);
var addr = BitConverter.ToInt32(buf, 0);
return addr;
switch (AddressSize)
{
// 1 byte is stored as signed byte
case 1: return (sbyte)Data[index];
case 4:
{
byte[] buf = new byte[4];
Array.Copy(Data, AddressSize * index, buf, 0, AddressSize);
return BitConverter.ToInt32(buf, 0);
}
default: throw new Exception("this data have not a valid address");
}
}

public void SetAddressInData(int index, int addr)
Expand Down
47 changes: 34 additions & 13 deletions src/Neo.Compiler.MSIL/Optimizer/NefOptimizeTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,22 +63,43 @@ public static byte[] Optimize(byte[] script, OptimizeParserType[] parserTypes, o
optimizer.AddOptimizeParser(parser);
}

//step01 Load
using (var ms = new MemoryStream(script))
bool optimized;
addrConvertTable = null;
do
{
optimizer.LoadNef(ms);
}
//step02 doOptimize
optimizer.Optimize();
//step01 Load
using (var ms = new MemoryStream(script))
{
optimizer.LoadNef(ms);
}

//step03 link
using (var ms = new MemoryStream())
{
optimizer.LinkNef(ms);
addrConvertTable = optimizer.GetAddrConvertTable();
var bytes = ms.ToArray();
return bytes;
//step02 doOptimize
optimizer.Optimize();

//step03 link
using (var ms = new MemoryStream())
{
optimizer.LinkNef(ms);

if (addrConvertTable is null)
addrConvertTable = optimizer.GetAddrConvertTable();
else
{
Dictionary<int, int> addrConvertTableTemp = optimizer.GetAddrConvertTable();
addrConvertTable = optimizer.RebuildAddrConvertTable(addrConvertTable, addrConvertTableTemp);
}

var bytes = ms.ToArray();

optimized = bytes.Length < script.Length;
if (optimized) { script = bytes; }
}

// Execute it while decrease the size
}
while (optimized);

return script;
}
}
}
23 changes: 23 additions & 0 deletions src/Neo.Compiler.MSIL/Optimizer/NefOptimizer.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace Neo.Compiler.Optimizer
{
Expand Down Expand Up @@ -115,6 +117,27 @@ public void LoadNef(Stream stream)
}
}

internal Dictionary<int, int> RebuildAddrConvertTable(Dictionary<int, int> addrConvertTable, Dictionary<int, int> addrConvertTableTemp)
{
for (int i = 0; i < addrConvertTable.Count; i++)
{
var findFlag = false;
var kvp = addrConvertTable.ElementAt(i);
foreach (var kvpTemp in addrConvertTableTemp)
{
if (kvp.Value == kvpTemp.Key)
{
addrConvertTable[kvp.Key] = addrConvertTableTemp[kvpTemp.Key];
findFlag = true;
break;
}
}
if (!findFlag)
addrConvertTable.Remove(kvp.Key);
}
return addrConvertTable;
}

/// <summary>
/// Step03 Link
/// </summary>
Expand Down
22 changes: 22 additions & 0 deletions tests/Neo.Compiler.MSIL.UnitTests/UnitTest_NefOptimizer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,28 @@ public class UnitTest_NefOptimizer
// Test_Optimize_Recalculate_Positive_JMPX_L(VM.OpCode.JMPNE_L);
//}

[TestMethod]
public void Test_CombinedRules()
{
using (var scriptBefore = new ScriptBuilder())
using (var scriptAfter = new ScriptBuilder())
{
scriptBefore.Emit(VM.OpCode.PUSH1);
scriptBefore.Emit(VM.OpCode.NOP);
scriptBefore.Emit(VM.OpCode.PUSH0);
scriptBefore.Emit(VM.OpCode.NOP);
scriptBefore.Emit(VM.OpCode.EQUAL);
scriptBefore.Emit(VM.OpCode.PUSH0);
scriptBefore.Emit(VM.OpCode.EQUAL);

var optimized = NefOptimizeTool.Optimize(scriptBefore.ToArray(), OptimizeParserType.DELETE_USELESS_EQUAL, OptimizeParserType.DELETE_NOP);

scriptAfter.Emit(VM.OpCode.PUSH1);

CollectionAssert.AreEqual(scriptAfter.ToArray(), optimized);
}
}

[TestMethod]
public void Test_Optimize_Recalculate_BoolEqualTrue()
{
Expand Down

0 comments on commit 575c3d7

Please sign in to comment.