Skip to content

Commit 1fad884

Browse files
Jim8yajara87Wi1l-B0tshargon
authored
Fix: preserve fixed-width shift semantics (#1902)
* Fix fixed-width shift semantics * Handle nullable shift operands --------- Co-authored-by: Alvaro <amjarag@gmail.com> Co-authored-by: Will <201105916+Wi1l-B0t@users.noreply.github.com> Co-authored-by: Shargon <shargon@gmail.com>
1 parent de08e95 commit 1fad884

8 files changed

Lines changed: 369 additions & 100 deletions

File tree

src/Neo.Compiler.CSharp/MethodConvert/Expression/AssignmentExpression.ComplexAssignment.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,12 +298,23 @@ private void EmitComplexAssignmentOperator(SemanticModel model, ITypeSymbol type
298298
}
299299
else if (operatorToken.ValueText == "<<=")
300300
{
301-
CheckLeftShiftOverflow(model, type, right, false);
301+
if (!MaskFixedWidthShiftCount(type))
302+
CheckLeftShiftOverflow(model, type, right, false);
303+
}
304+
else if (operatorToken.ValueText == ">>=")
305+
{
306+
MaskFixedWidthShiftCount(type);
302307
}
303308

304309
AddInstruction(opcode);
305310
if (opcode == OpCode.XOR && isBoolean)
306311
ChangeType(VM.Types.StackItemType.Boolean);
307-
if (checkResult) EnsureIntegerInRange(type);
312+
if (checkResult)
313+
{
314+
if (operatorToken.ValueText == "<<=")
315+
NormalizeShiftResult(type, preserveCheckedConversion: true);
316+
else
317+
EnsureIntegerInRange(type);
318+
}
308319
}
309320
}

src/Neo.Compiler.CSharp/MethodConvert/Expression/BinaryExpression.cs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,13 @@ private void ConvertBinaryExpression(SemanticModel model, BinaryExpressionSyntax
103103
}
104104
else if (expression.OperatorToken.ValueText == "<<")
105105
{
106-
CheckLeftShiftOverflow(model, model.GetTypeInfo(expression.Left).Type, expression.Right, true);
106+
ITypeSymbol? leftType = model.GetTypeInfo(expression.Left).Type;
107+
if (!MaskFixedWidthShiftCount(leftType))
108+
CheckLeftShiftOverflow(model, leftType, expression.Right, true);
109+
}
110+
else if (expression.OperatorToken.ValueText == ">>")
111+
{
112+
MaskFixedWidthShiftCount(model.GetTypeInfo(expression.Left).Type);
107113
}
108114
AddInstruction(opcode);
109115

@@ -113,8 +119,76 @@ private void ConvertBinaryExpression(SemanticModel model, BinaryExpressionSyntax
113119
}
114120

115121
if (checkResult)
122+
{
123+
if (expression.OperatorToken.ValueText == "<<")
124+
NormalizeShiftResult(type);
125+
else
126+
EnsureIntegerInRange(type);
127+
}
128+
}
129+
130+
/// <summary>
131+
/// Applies the C# shift-count mask for fixed-width integral operands.
132+
/// </summary>
133+
/// <remarks>
134+
/// C# masks the shift count to five bits for operands up to 32 bits and to
135+
/// six bits for 64-bit operands. Nullable wrappers use their underlying
136+
/// integral type to select the mask. BigInteger shift counts are not masked.
137+
/// </remarks>
138+
private bool MaskFixedWidthShiftCount(ITypeSymbol? leftType)
139+
{
140+
if (leftType is null) return false;
141+
142+
if (leftType is INamedTypeSymbol
143+
{
144+
OriginalDefinition.SpecialType: SpecialType.System_Nullable_T
145+
} nullableType)
146+
{
147+
leftType = nullableType.TypeArguments[0];
148+
}
149+
150+
int? mask = leftType.SpecialType switch
151+
{
152+
SpecialType.System_SByte or
153+
SpecialType.System_Byte or
154+
SpecialType.System_Int16 or
155+
SpecialType.System_UInt16 or
156+
SpecialType.System_Char or
157+
SpecialType.System_Int32 or
158+
SpecialType.System_UInt32 => 31,
159+
SpecialType.System_Int64 or
160+
SpecialType.System_UInt64 => 63,
161+
_ => null
162+
};
163+
164+
if (!mask.HasValue) return false;
165+
166+
Push(mask.Value);
167+
AddInstruction(OpCode.AND);
168+
return true;
169+
}
170+
171+
private void NormalizeShiftResult(ITypeSymbol type, bool preserveCheckedConversion = false)
172+
{
173+
if (preserveCheckedConversion && type.SpecialType is
174+
SpecialType.System_SByte or
175+
SpecialType.System_Byte or
176+
SpecialType.System_Int16 or
177+
SpecialType.System_UInt16 or
178+
SpecialType.System_Char)
116179
{
117180
EnsureIntegerInRange(type);
181+
return;
182+
}
183+
184+
_checkedStack.Push(false);
185+
try
186+
{
187+
EnsureIntegerInRange(type);
188+
}
189+
finally
190+
{
191+
_checkedStack.Pop();
118192
}
119193
}
120194

tests/Neo.Compiler.CSharp.UnitTests/TestingArtifacts/Contract_ComplexAssign.cs

Lines changed: 42 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
1313
{
1414
#region Compiled data
1515

16-
public static Neo.SmartContract.Manifest.ContractManifest Manifest => Neo.SmartContract.Manifest.ContractManifest.Parse(@"{""name"":""Contract_ComplexAssign"",""groups"":[],""features"":{},""supportedstandards"":[],""abi"":{""methods"":[{""name"":""unitTest_Add_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":0,""safe"":false},{""name"":""unitTest_Add_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":55,""safe"":false},{""name"":""unitTest_Sub_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":129,""safe"":false},{""name"":""unitTest_Sub_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":176,""safe"":false},{""name"":""unitTest_Mul_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":242,""safe"":false},{""name"":""unitTest_Mul_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":299,""safe"":false},{""name"":""unitTest_Left_Shift_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":375,""safe"":false},{""name"":""leftShiftAssignChecked"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":432,""safe"":false},{""name"":""unitTest_Left_Shift_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":458,""safe"":false},{""name"":""unitTest_Right_Shift_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":534,""safe"":false},{""name"":""unitTest_Right_Shift_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":559,""safe"":false},{""name"":""testAndAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":584,""safe"":false},{""name"":""testOrAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":593,""safe"":false},{""name"":""testXorAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":602,""safe"":false},{""name"":""testBoolXorAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":611,""safe"":false},{""name"":""testBoolAndAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":622,""safe"":false},{""name"":""testBoolOrAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":631,""safe"":false},{""name"":""unitTest_Member_Element_Complex_Assign"",""parameters"":[],""returntype"":""Void"",""offset"":640,""safe"":false}],""events"":[]},""permissions"":[],""trusts"":[],""extra"":{""Version"":""3.10.0"",""nef"":{""optimization"":""All""}}}");
16+
public static Neo.SmartContract.Manifest.ContractManifest Manifest => Neo.SmartContract.Manifest.ContractManifest.Parse(@"{""name"":""Contract_ComplexAssign"",""groups"":[],""features"":{},""supportedstandards"":[],""abi"":{""methods"":[{""name"":""unitTest_Add_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":0,""safe"":false},{""name"":""unitTest_Add_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":55,""safe"":false},{""name"":""unitTest_Sub_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":129,""safe"":false},{""name"":""unitTest_Sub_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":176,""safe"":false},{""name"":""unitTest_Mul_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":242,""safe"":false},{""name"":""unitTest_Mul_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":299,""safe"":false},{""name"":""unitTest_Left_Shift_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":375,""safe"":false},{""name"":""leftShiftAssignChecked"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":457,""safe"":false},{""name"":""unitTest_Left_Shift_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":502,""safe"":false},{""name"":""unitTest_Right_Shift_Assign_Checked"",""parameters"":[],""returntype"":""Array"",""offset"":584,""safe"":false},{""name"":""unitTest_Right_Shift_Assign_UnChecked"",""parameters"":[],""returntype"":""Array"",""offset"":615,""safe"":false},{""name"":""testAndAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":646,""safe"":false},{""name"":""testOrAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":655,""safe"":false},{""name"":""testXorAssign"",""parameters"":[{""name"":""value"",""type"":""Integer""},{""name"":""shift"",""type"":""Integer""}],""returntype"":""Integer"",""offset"":664,""safe"":false},{""name"":""testBoolXorAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":673,""safe"":false},{""name"":""testBoolAndAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":684,""safe"":false},{""name"":""testBoolOrAssign"",""parameters"":[{""name"":""left"",""type"":""Boolean""},{""name"":""right"",""type"":""Boolean""}],""returntype"":""Boolean"",""offset"":693,""safe"":false},{""name"":""unitTest_Member_Element_Complex_Assign"",""parameters"":[],""returntype"":""Void"",""offset"":702,""safe"":false}],""events"":[]},""permissions"":[],""trusts"":[],""extra"":{""Version"":""3.10.0"",""nef"":{""optimization"":""All""}}}");
1717

1818
/// <summary>
1919
/// Optimization: "All"
2020
/// </summary>
21-
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM1Rlc3RpbmdFbmdpbmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP23AlcCAAP/////AAAAAHAC////f3FonEoQLgM6SgP/////AAAAADIDOnBpnErKFDIDOnFoaVASv0BXAgAD/////wAAAABwAv///39xaJwD/////wAAAACRcGmcSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QFcCABBwAgAAAIBxaJ1KEC4DOkoD/////wAAAAAyAzpwaZ1KyhQyAzpxaGlQEr9AVwIAEHACAAAAgHFonQP/////AAAAAJFwaZ1KyhQyHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9xaGlQEr9AVwIAA/////8AAAAAcAL///9/cWgSoEoQLgM6SgP/////AAAAADIDOnBpEqBKyhQyAzpxaGlQEr9AVwIAA/////8AAAAAcAL///9/cWgSoAP/////AAAAAJFwaRKgSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QFcCAAP/////AAAAAHAC////f3FoEahKEC4DOkoD/////wAAAAAyAzpwaRGoSsoUMgM6cWhpUBK/QFcAAnh5ShAuAzpKACAwAzqoSsoUMgM6SoBAVwIAA/////8AAAAAcAL///9/cWgRqAP/////AAAAAJFwaRGoSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QFcCABBwAgAAAIBxaBGpcGkRqXFoaVASv0BXAgAQcAIAAACAcWgRqXBpEalxaGlQEr9AVwACeHmRgHhAVwACeHmSgHhAVwACeHmTgHhAVwACeHmT2yCAeEBXAAJ4eauAeEBXAAJ4eayAeEBXAQAMBAABAgPbMBcSwHBoShDOE6JOEFDQRWgQzhGXOWgRzhNLS84UkUpUU9BFaBHOEM4QlzlASsRcrA==").AsSerializable<Neo.SmartContract.NefFile>();
21+
public static Neo.SmartContract.NefFile Nef => Convert.FromBase64String(@"TkVGM1Rlc3RpbmdFbmdpbmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP31AlcCAAP/////AAAAAHAC////f3FonEoQLgM6SgP/////AAAAADIDOnBpnErKFDIDOnFoaVASv0BXAgAD/////wAAAABwAv///39xaJwD/////wAAAACRcGmcSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QFcCABBwAgAAAIBxaJ1KEC4DOkoD/////wAAAAAyAzpwaZ1KyhQyAzpxaGlQEr9AVwIAEHACAAAAgHFonQP/////AAAAAJFwaZ1KyhQyHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9xaGlQEr9AVwIAA/////8AAAAAcAL///9/cWgSoEoQLgM6SgP/////AAAAADIDOnBpEqBKyhQyAzpxaGlQEr9AVwIAA/////8AAAAAcAL///9/cWgSoAP/////AAAAAJFwaRKgSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QFcCAAP/////AAAAAHAC////f3FoEQAfkagD/////wAAAACRcGkRAB+RqErKFDIeA/////8AAAAAkUoC////fzIMAwAAAAABAAAAn3FoaVASv0BXAAJ4eQAfkahKyhQyHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9KgEBXAgAD/////wAAAABwAv///39xaBEAH5GoA/////8AAAAAkXBpEQAfkahKyhQyHgP/////AAAAAJFKAv///38yDAMAAAAAAQAAAJ9xaGlQEr9AVwIAEHACAAAAgHFoEQAfkalwaREAH5GpcWhpUBK/QFcCABBwAgAAAIBxaBEAH5GpcGkRAB+RqXFoaVASv0BXAAJ4eZGAeEBXAAJ4eZKAeEBXAAJ4eZOAeEBXAAJ4eZPbIIB4QFcAAnh5q4B4QFcAAnh5rIB4QFcBAAwEAAECA9swFxLAcGhKEM4Tok4QUNBFaBDOEZc5aBHOE0tLzhSRSlRT0EVoEc4QzhCXOUD5VlVz").AsSerializable<Neo.SmartContract.NefFile>();
2222

2323
#endregion
2424

@@ -28,24 +28,24 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
2828
/// Unsafe method
2929
/// </summary>
3030
/// <remarks>
31-
/// Script: VwACeHlKEC4DOkoAIDADOqhKyhQyAzpKgEA=
31+
/// Script: VwACeHkAH5GoSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfSoBA
3232
/// INITSLOT 0002 [64 datoshi]
3333
/// LDARG0 [2 datoshi]
3434
/// LDARG1 [2 datoshi]
35-
/// DUP [2 datoshi]
36-
/// PUSH0 [1 datoshi]
37-
/// JMPGE 03 [2 datoshi]
38-
/// THROW [512 datoshi]
39-
/// DUP [2 datoshi]
40-
/// PUSHINT8 20 [1 datoshi]
41-
/// JMPLT 03 [2 datoshi]
42-
/// THROW [512 datoshi]
35+
/// PUSHINT8 1F [1 datoshi]
36+
/// AND [8 datoshi]
4337
/// SHL [8 datoshi]
4438
/// DUP [2 datoshi]
4539
/// SIZE [4 datoshi]
4640
/// PUSH4 [1 datoshi]
47-
/// JMPLE 03 [2 datoshi]
48-
/// THROW [512 datoshi]
41+
/// JMPLE 1E [2 datoshi]
42+
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
43+
/// AND [8 datoshi]
44+
/// DUP [2 datoshi]
45+
/// PUSHINT32 FFFFFF7F [1 datoshi]
46+
/// JMPLE 0C [2 datoshi]
47+
/// PUSHINT64 0000000001000000 [1 datoshi]
48+
/// SUB [8 datoshi]
4949
/// DUP [2 datoshi]
5050
/// STARG0 [2 datoshi]
5151
/// RET [0 datoshi]
@@ -232,32 +232,36 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
232232
/// Unsafe method
233233
/// </summary>
234234
/// <remarks>
235-
/// Script: VwIAA/////8AAAAAcAL///9/cWgRqEoQLgM6SgP/////AAAAADIDOnBpEahKyhQyAzpxaGlQEr9A
235+
/// Script: VwIAA/////8AAAAAcAL///9/cWgRAB+RqAP/////AAAAAJFwaREAH5GoSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QA==
236236
/// INITSLOT 0200 [64 datoshi]
237237
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
238238
/// STLOC0 [2 datoshi]
239239
/// PUSHINT32 FFFFFF7F [1 datoshi]
240240
/// STLOC1 [2 datoshi]
241241
/// LDLOC0 [2 datoshi]
242242
/// PUSH1 [1 datoshi]
243+
/// PUSHINT8 1F [1 datoshi]
244+
/// AND [8 datoshi]
243245
/// SHL [8 datoshi]
244-
/// DUP [2 datoshi]
245-
/// PUSH0 [1 datoshi]
246-
/// JMPGE 03 [2 datoshi]
247-
/// THROW [512 datoshi]
248-
/// DUP [2 datoshi]
249246
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
250-
/// JMPLE 03 [2 datoshi]
251-
/// THROW [512 datoshi]
247+
/// AND [8 datoshi]
252248
/// STLOC0 [2 datoshi]
253249
/// LDLOC1 [2 datoshi]
254250
/// PUSH1 [1 datoshi]
251+
/// PUSHINT8 1F [1 datoshi]
252+
/// AND [8 datoshi]
255253
/// SHL [8 datoshi]
256254
/// DUP [2 datoshi]
257255
/// SIZE [4 datoshi]
258256
/// PUSH4 [1 datoshi]
259-
/// JMPLE 03 [2 datoshi]
260-
/// THROW [512 datoshi]
257+
/// JMPLE 1E [2 datoshi]
258+
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
259+
/// AND [8 datoshi]
260+
/// DUP [2 datoshi]
261+
/// PUSHINT32 FFFFFF7F [1 datoshi]
262+
/// JMPLE 0C [2 datoshi]
263+
/// PUSHINT64 0000000001000000 [1 datoshi]
264+
/// SUB [8 datoshi]
261265
/// STLOC1 [2 datoshi]
262266
/// LDLOC0 [2 datoshi]
263267
/// LDLOC1 [2 datoshi]
@@ -273,20 +277,24 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
273277
/// Unsafe method
274278
/// </summary>
275279
/// <remarks>
276-
/// Script: VwIAA/////8AAAAAcAL///9/cWgRqAP/////AAAAAJFwaRGoSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QA==
280+
/// Script: VwIAA/////8AAAAAcAL///9/cWgRAB+RqAP/////AAAAAJFwaREAH5GoSsoUMh4D/////wAAAACRSgL///9/MgwDAAAAAAEAAACfcWhpUBK/QA==
277281
/// INITSLOT 0200 [64 datoshi]
278282
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
279283
/// STLOC0 [2 datoshi]
280284
/// PUSHINT32 FFFFFF7F [1 datoshi]
281285
/// STLOC1 [2 datoshi]
282286
/// LDLOC0 [2 datoshi]
283287
/// PUSH1 [1 datoshi]
288+
/// PUSHINT8 1F [1 datoshi]
289+
/// AND [8 datoshi]
284290
/// SHL [8 datoshi]
285291
/// PUSHINT64 FFFFFFFF00000000 [1 datoshi]
286292
/// AND [8 datoshi]
287293
/// STLOC0 [2 datoshi]
288294
/// LDLOC1 [2 datoshi]
289295
/// PUSH1 [1 datoshi]
296+
/// PUSHINT8 1F [1 datoshi]
297+
/// AND [8 datoshi]
290298
/// SHL [8 datoshi]
291299
/// DUP [2 datoshi]
292300
/// SIZE [4 datoshi]
@@ -452,18 +460,22 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
452460
/// Unsafe method
453461
/// </summary>
454462
/// <remarks>
455-
/// Script: VwIAEHACAAAAgHFoEalwaRGpcWhpUBK/QA==
463+
/// Script: VwIAEHACAAAAgHFoEQAfkalwaREAH5GpcWhpUBK/QA==
456464
/// INITSLOT 0200 [64 datoshi]
457465
/// PUSH0 [1 datoshi]
458466
/// STLOC0 [2 datoshi]
459467
/// PUSHINT32 00000080 [1 datoshi]
460468
/// STLOC1 [2 datoshi]
461469
/// LDLOC0 [2 datoshi]
462470
/// PUSH1 [1 datoshi]
471+
/// PUSHINT8 1F [1 datoshi]
472+
/// AND [8 datoshi]
463473
/// SHR [8 datoshi]
464474
/// STLOC0 [2 datoshi]
465475
/// LDLOC1 [2 datoshi]
466476
/// PUSH1 [1 datoshi]
477+
/// PUSHINT8 1F [1 datoshi]
478+
/// AND [8 datoshi]
467479
/// SHR [8 datoshi]
468480
/// STLOC1 [2 datoshi]
469481
/// LDLOC0 [2 datoshi]
@@ -480,18 +492,22 @@ public abstract class Contract_ComplexAssign(Neo.SmartContract.Testing.SmartCont
480492
/// Unsafe method
481493
/// </summary>
482494
/// <remarks>
483-
/// Script: VwIAEHACAAAAgHFoEalwaRGpcWhpUBK/QA==
495+
/// Script: VwIAEHACAAAAgHFoEQAfkalwaREAH5GpcWhpUBK/QA==
484496
/// INITSLOT 0200 [64 datoshi]
485497
/// PUSH0 [1 datoshi]
486498
/// STLOC0 [2 datoshi]
487499
/// PUSHINT32 00000080 [1 datoshi]
488500
/// STLOC1 [2 datoshi]
489501
/// LDLOC0 [2 datoshi]
490502
/// PUSH1 [1 datoshi]
503+
/// PUSHINT8 1F [1 datoshi]
504+
/// AND [8 datoshi]
491505
/// SHR [8 datoshi]
492506
/// STLOC0 [2 datoshi]
493507
/// LDLOC1 [2 datoshi]
494508
/// PUSH1 [1 datoshi]
509+
/// PUSHINT8 1F [1 datoshi]
510+
/// AND [8 datoshi]
495511
/// SHR [8 datoshi]
496512
/// STLOC1 [2 datoshi]
497513
/// LDLOC0 [2 datoshi]

0 commit comments

Comments
 (0)