using System; using System.Text; using NUnit.Framework; using Unity.Pipeline.Compilation; namespace Unity.Pipeline.Tests.Editor { /// /// 64-bit (I8/R8) values through the interpreter UNDER THE EDITOR'S MONO RUNTIME — the /// dotnet suite proves semantics on CoreCLR, but the wide-slot frame code (unaligned /// 8-byte reads, Unsafe.WriteUnaligned) is exactly the kind of thing runtime differences /// expose. Compiles with the same Roslyn service code reload uses and binds the standard /// host surface. /// class IlInterpreterWideValueEditorTests { sealed class RawScript : IlInterpreter.IScript { readonly byte[] m_Bytes; public RawScript(byte[] bytes) { m_Bytes = bytes; } public string Name => "WideValueProbe"; public ReadOnlyMemory Il => m_Bytes; } const string Source = @" public class Script { static long s_total; public static string Run() { long acc = 0; for (int i = 0; i < 10; i++) acc += 3000000000L; s_total += acc; ulong h = 1469598103934665603UL; h ^= 42; h *= 1099511628211UL; double d = 0.1 + 0.2; double big = 16777217.0; long[] arr = { 1L, 5000000000L, -3L }; long sum = 0; foreach (var v in arr) sum += v; return acc + ""|"" + s_total + ""|"" + (h >> 32) + ""|"" + d.ToString(""R"") + ""|"" + (d == 0.3 ? ""eq"" : ""neq"") + ""|"" + (int)big + ""|"" + sum + ""|"" + System.Math.Sqrt(2.0).ToString(""R"") + ""|"" + (acc > int.MaxValue); } }"; [Test] public void WideValues_RunAtFullPrecision_UnderMono() { var compile = RoslynCompilationService.Compile(new CompilationRequest { SourceCode = Source, AssemblyName = "WideValueProbe", SkipLoad = true, }); Assert.IsTrue(compile.Success, "probe should compile: " + string.Join("; ", compile.Diagnostics)); using var interp = new IlInterpreter.Interpreter.ScriptInterpreter( IlInterpreterHostBindings.CreateStandard(), _ => { }); interp.Load(new RawScript(compile.AssemblyBytes)); // Two invocations: the second proves the boxed long static persists correctly. Assert.AreEqual( "30000000000|30000000000|1153257940|0.30000000000000004|neq|16777217|4999999998|1.4142135623730951|True", (string)interp.Invoke("Run")); Assert.AreEqual( "30000000000|60000000000|1153257940|0.30000000000000004|neq|16777217|4999999998|1.4142135623730951|True", (string)interp.Invoke("Run")); } } }