Skip to content

Commit fa29c6d

Browse files
authored
add: Runtime.LoadScript (#766)
1 parent 33c6ca4 commit fa29c6d

6 files changed

Lines changed: 55 additions & 68 deletions

File tree

src/Neo.Compiler.CSharp/Neo.Compiler.CSharp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
<ItemGroup>
2222
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.2.0" />
23-
<PackageReference Include="Neo" Version="3.4.0" />
23+
<PackageReference Include="Neo" Version="3.4.0-CI01389" />
2424
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
2525
<PackageReference Include="System.CommandLine.NamingConventionBinder" Version="2.0.0-beta4.22272.1" />
2626
</ItemGroup>

src/Neo.SmartContract.Framework/Services/Runtime.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,8 @@ public static extern byte AddressVersion
105105

106106
[Syscall("System.Runtime.GetNetwork")]
107107
public static extern uint GetNetwork();
108+
109+
[Syscall("System.Runtime.LoadScript")]
110+
public static extern object LoadScript(ByteString script, CallFlags flags, params object[] args);
108111
}
109112
}

tests/Neo.Compiler.CSharp.UnitTests/UnitTest_IntegerParse.cs

Lines changed: 33 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,22 @@ public void SByteParse_Test()
1616

1717
var result = testengine.ExecuteTestCaseStandard(methodname, "127");
1818
var value = result.Pop().GetInteger();
19-
Assert.AreEqual(127, value);
19+
Assert.AreEqual(sbyte.MaxValue, value);
2020

2121
testengine.Reset();
2222
result = testengine.ExecuteTestCaseStandard(methodname, "-128");
2323

2424
value = result.Pop().GetInteger();
25-
Assert.AreEqual(-128, value);
25+
Assert.AreEqual(sbyte.MinValue, value);
2626

2727
//test backspace trip
2828
testengine.Reset();
2929
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
30-
31-
value = result.Pop().GetInteger();
32-
Assert.AreEqual(20, value);
30+
Assert.AreEqual(VMState.FAULT, testengine.State);
3331

3432
testengine.Reset();
3533
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
36-
37-
value = result.Pop().GetInteger();
38-
Assert.AreEqual(20, value);
34+
Assert.AreEqual(VMState.FAULT, testengine.State);
3935

4036
testengine.Reset();
4137
result = testengine.ExecuteTestCaseStandard(methodname, "128");
@@ -77,26 +73,22 @@ public void ByteParse_Test()
7773

7874
var result = testengine.ExecuteTestCaseStandard(methodname, "0");
7975
var value = result.Pop().GetInteger();
80-
Assert.AreEqual(0, value);
76+
Assert.AreEqual(byte.MinValue, value);
8177

8278
testengine.Reset();
8379
result = testengine.ExecuteTestCaseStandard(methodname, "255");
8480

8581
value = result.Pop().GetInteger();
86-
Assert.AreEqual(255, value);
82+
Assert.AreEqual(byte.MaxValue, value);
8783

8884
//test backspace trip
8985
testengine.Reset();
9086
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
91-
92-
value = result.Pop().GetInteger();
93-
Assert.AreEqual(20, value);
87+
Assert.AreEqual(VMState.FAULT, testengine.State);
9488

9589
testengine.Reset();
9690
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
97-
98-
value = result.Pop().GetInteger();
99-
Assert.AreEqual(20, value);
91+
Assert.AreEqual(VMState.FAULT, testengine.State);
10092

10193
testengine.Reset();
10294
result = testengine.ExecuteTestCaseStandard(methodname, "-1");
@@ -138,26 +130,22 @@ public void UShortParse_Test()
138130

139131
var result = testengine.ExecuteTestCaseStandard(methodname, "0");
140132
var value = result.Pop().GetInteger();
141-
Assert.AreEqual(0, value);
133+
Assert.AreEqual(ushort.MinValue, value);
142134

143135
testengine.Reset();
144136
result = testengine.ExecuteTestCaseStandard(methodname, "65535");
145137

146138
value = result.Pop().GetInteger();
147-
Assert.AreEqual(65535, value);
139+
Assert.AreEqual(ushort.MaxValue, value);
148140

149141
//test backspace trip
150142
testengine.Reset();
151143
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
152-
153-
value = result.Pop().GetInteger();
154-
Assert.AreEqual(20, value);
144+
Assert.AreEqual(VMState.FAULT, testengine.State);
155145

156146
testengine.Reset();
157147
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
158-
159-
value = result.Pop().GetInteger();
160-
Assert.AreEqual(20, value);
148+
Assert.AreEqual(VMState.FAULT, testengine.State);
161149

162150
testengine.Reset();
163151
result = testengine.ExecuteTestCaseStandard(methodname, "-1");
@@ -199,26 +187,22 @@ public void ShortParse_Test()
199187

200188
var result = testengine.ExecuteTestCaseStandard(methodname, "-32768");
201189
var value = result.Pop().GetInteger();
202-
Assert.AreEqual(-32768, value);
190+
Assert.AreEqual(short.MinValue, value);
203191

204192
testengine.Reset();
205193
result = testengine.ExecuteTestCaseStandard(methodname, "32767");
206194

207195
value = result.Pop().GetInteger();
208-
Assert.AreEqual(32767, value);
196+
Assert.AreEqual(short.MaxValue, value);
209197

210198
//test backspace trip
211199
testengine.Reset();
212200
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
213-
214-
value = result.Pop().GetInteger();
215-
Assert.AreEqual(20, value);
201+
Assert.AreEqual(VMState.FAULT, testengine.State);
216202

217203
testengine.Reset();
218204
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
219-
220-
value = result.Pop().GetInteger();
221-
Assert.AreEqual(20, value);
205+
Assert.AreEqual(VMState.FAULT, testengine.State);
222206

223207
testengine.Reset();
224208
result = testengine.ExecuteTestCaseStandard(methodname, "-32769");
@@ -260,26 +244,22 @@ public void ULongParse_Test()
260244

261245
var result = testengine.ExecuteTestCaseStandard(methodname, "18446744073709551615");
262246
var value = result.Pop().GetInteger();
263-
Assert.AreEqual(18446744073709551615, value);
247+
Assert.AreEqual(ulong.MaxValue, value);
264248

265249
testengine.Reset();
266250
result = testengine.ExecuteTestCaseStandard(methodname, "0");
267251

268252
value = result.Pop().GetInteger();
269-
Assert.AreEqual(0, value);
253+
Assert.AreEqual(ulong.MinValue, value);
270254

271255
//test backspace trip
272256
testengine.Reset();
273257
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
274-
275-
value = result.Pop().GetInteger();
276-
Assert.AreEqual(20, value);
258+
Assert.AreEqual(VMState.FAULT, testengine.State);
277259

278260
testengine.Reset();
279261
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
280-
281-
value = result.Pop().GetInteger();
282-
Assert.AreEqual(20, value);
262+
Assert.AreEqual(VMState.FAULT, testengine.State);
283263

284264
testengine.Reset();
285265
result = testengine.ExecuteTestCaseStandard(methodname, "18446744073709551616");
@@ -319,29 +299,24 @@ public void LongParse_Test()
319299
testengine.AddEntryScript("./TestClasses/Contract_IntegerParse.cs");
320300
string methodname = "testLongparse";
321301

322-
var result = testengine.ExecuteTestCaseStandard(methodname, " -9223372036854775808");
302+
var result = testengine.ExecuteTestCaseStandard(methodname, "-9223372036854775808");
323303
var value = result.Pop().GetInteger();
324-
Assert.AreEqual(-9223372036854775808, value);
304+
Assert.AreEqual(long.MinValue, value);
325305

326306
testengine.Reset();
327307
result = testengine.ExecuteTestCaseStandard(methodname, "9223372036854775807");
328308

329309
value = result.Pop().GetInteger();
330-
Assert.AreEqual(9223372036854775807, value);
310+
Assert.AreEqual(long.MaxValue, value);
331311

332312
//test backspace trip
333313
testengine.Reset();
334314
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
335-
336-
value = result.Pop().GetInteger();
337-
Assert.AreEqual(20, value);
315+
Assert.AreEqual(VMState.FAULT, testengine.State);
338316

339317
testengine.Reset();
340318
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
341-
342-
value = result.Pop().GetInteger();
343-
Assert.AreEqual(20, value);
344-
319+
Assert.AreEqual(VMState.FAULT, testengine.State);
345320

346321
testengine.Reset();
347322
result = testengine.ExecuteTestCaseStandard(methodname, "-9223372036854775809");
@@ -383,25 +358,21 @@ public void UIntParse_Test()
383358

384359
var result = testengine.ExecuteTestCaseStandard(methodname, "4294967295");
385360
var value = result.Pop().GetInteger();
386-
Assert.AreEqual(4294967295, value);
361+
Assert.AreEqual(uint.MaxValue, value);
387362

388363
testengine.Reset();
389364
result = testengine.ExecuteTestCaseStandard(methodname, "0");
390365

391366
value = result.Pop().GetInteger();
392-
Assert.AreEqual(0, value);
367+
Assert.AreEqual(uint.MinValue, value);
393368

394369
testengine.Reset();
395370
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
396-
397-
value = result.Pop().GetInteger();
398-
Assert.AreEqual(20, value);
371+
Assert.AreEqual(VMState.FAULT, testengine.State);
399372

400373
testengine.Reset();
401374
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
402-
403-
value = result.Pop().GetInteger();
404-
Assert.AreEqual(20, value);
375+
Assert.AreEqual(VMState.FAULT, testengine.State);
405376

406377
testengine.Reset();
407378
result = testengine.ExecuteTestCaseStandard(methodname, "-1");
@@ -443,25 +414,21 @@ public void IntParse_Test()
443414

444415
var result = testengine.ExecuteTestCaseStandard(methodname, "2147483647");
445416
var value = result.Pop().GetInteger();
446-
Assert.AreEqual(2147483647, value);
417+
Assert.AreEqual(int.MaxValue, value);
447418

448419
testengine.Reset();
449420
result = testengine.ExecuteTestCaseStandard(methodname, "-2147483648");
450421

451422
value = result.Pop().GetInteger();
452-
Assert.AreEqual(-2147483648, value);
423+
Assert.AreEqual(int.MinValue, value);
453424

454425
testengine.Reset();
455426
result = testengine.ExecuteTestCaseStandard(methodname, "20 ");
456-
457-
value = result.Pop().GetInteger();
458-
Assert.AreEqual(20, value);
427+
Assert.AreEqual(VMState.FAULT, testengine.State);
459428

460429
testengine.Reset();
461430
result = testengine.ExecuteTestCaseStandard(methodname, " 20 ");
462-
463-
value = result.Pop().GetInteger();
464-
Assert.AreEqual(20, value);
431+
Assert.AreEqual(VMState.FAULT, testengine.State);
465432

466433
testengine.Reset();
467434
result = testengine.ExecuteTestCaseStandard(methodname, "2147483648");

tests/Neo.Compiler.CSharp.UnitTests/Utils/TestEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ public EvaluationStack ExecuteTestCaseStandard(int offset, ushort rvcount, NefFi
162162
Console.WriteLine("op:[" +
163163
this.CurrentContext.InstructionPointer.ToString("X04") +
164164
"]" +
165-
this.CurrentContext.CurrentInstruction.OpCode);
165+
this.CurrentContext.CurrentInstruction?.OpCode);
166166
this.ExecuteNext();
167167
}
168168
return this.ResultStack;

tests/Neo.SmartContract.Framework.UnitTests/Services/RuntimeTest.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,17 @@ public void Test_InvocationCounter()
106106
Assert.AreEqual(0x01, item.GetInteger());
107107
}
108108

109+
[TestMethod]
110+
public void Test_LoadScript()
111+
{
112+
var result = _engine.ExecuteTestCaseStandard("dynamicSum", new StackItem[] { new Integer(1), new Integer(3) });
113+
Assert.AreEqual(1, result.Count);
114+
115+
var item = result.Pop();
116+
Assert.IsInstanceOfType(item, typeof(Integer));
117+
Assert.AreEqual(4, item.GetInteger());
118+
}
119+
109120
[TestMethod]
110121
public void Test_Time()
111122
{

tests/Neo.SmartContract.Framework.UnitTests/TestClasses/Contract_Runtime.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,5 +135,11 @@ public static object GetTransactionScript()
135135
var tx = (Transaction)Runtime.ScriptContainer;
136136
return tx?.Script;
137137
}
138+
139+
public static int DynamicSum(int a, int b)
140+
{
141+
ByteString script = (ByteString)new byte[] { 0x9E }; // ADD
142+
return (int)Runtime.LoadScript(script, CallFlags.All, new object[] { a, b });
143+
}
138144
}
139145
}

0 commit comments

Comments
 (0)