Skip to content

Commit

Permalink
Ensure combined rules (#253)
Browse files Browse the repository at this point in the history
* Ensure combined rules

* Change UT

* Fix negative JMP

* Clean code
  • Loading branch information
shargon committed Apr 26, 2020
1 parent b7ee454 commit d6e5297
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 16 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 @@ -78,10 +78,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
36 changes: 24 additions & 12 deletions src/Neo.Compiler.MSIL/Optimizer/NefOptimizeTool.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,33 @@ public static byte[] Optimize(byte[] script, params OptimizeParserType[] parserT
optimizer.AddOptimizeParser(parser);
}

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

//step03 link
using (var ms = new MemoryStream())
do
{
optimizer.LinkNef(ms);
var bytes = ms.ToArray();
return bytes;
//step01 Load
using (var ms = new MemoryStream(script))
{
optimizer.LoadNef(ms);
}
//step02 doOptimize
optimizer.Optimize();

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

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

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

return script;
}
}
}
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 void Test_Optimize_Recalculate_JMPNE_L()
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 d6e5297

Please sign in to comment.