Make print() script function changeable, defaults to Console.WriteLine
This commit is contained in:
parent
58da41852d
commit
d452a740f0
|
@ -0,0 +1,33 @@
|
|||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace PorygonSharp
|
||||
{
|
||||
internal static class CoreSetup
|
||||
{
|
||||
public static Action<string> Print = Console.WriteLine;
|
||||
|
||||
private delegate void InternalPrintDelegate(IntPtr ptr);
|
||||
private static InternalPrintDelegate InternalPrint = PrintFunc;
|
||||
|
||||
static CoreSetup()
|
||||
{
|
||||
SetPrintFunc();
|
||||
}
|
||||
|
||||
internal static void SetPrintFunc()
|
||||
{
|
||||
var funcPtr = Marshal.GetFunctionPointerForDelegate(InternalPrint);
|
||||
InternalSetPrintFunc(funcPtr);
|
||||
}
|
||||
|
||||
private static void PrintFunc(IntPtr ptr)
|
||||
{
|
||||
var message = Marshal.PtrToStringUni(ptr);
|
||||
Print(message);
|
||||
}
|
||||
|
||||
[DllImport("libPorygonLang", EntryPoint = "SetPrintFunc", CallingConvention = CallingConvention.Cdecl)]
|
||||
private static extern double InternalSetPrintFunc(IntPtr ptr);
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
using PorygonSharp.DiagnosticHandling;
|
||||
|
||||
|
@ -40,8 +41,13 @@ namespace PorygonSharp
|
|||
private Diagnostics _diagnostics;
|
||||
public Diagnostics Diagnostics => _diagnostics ?? (_diagnostics = new Diagnostics(_internalScript.Diagnostics));
|
||||
|
||||
private static readonly RuntimeTypeHandle _setupHandle = typeof(CoreSetup).TypeHandle;
|
||||
|
||||
public Script(string s)
|
||||
{
|
||||
// Ensure core setup has been called
|
||||
RuntimeHelpers.RunClassConstructor(_setupHandle);
|
||||
|
||||
_internalScriptHandle = Create(s);
|
||||
_internalScript = Marshal.PtrToStructure<InternalScript>(_internalScriptHandle);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using NUnit.Framework;
|
||||
using PorygonSharp;
|
||||
|
@ -122,11 +123,26 @@ namespace PorygonSharpTests
|
|||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestPrint()
|
||||
{
|
||||
using (var script = new Script("print('test')"))
|
||||
{
|
||||
using (var sw = new StringWriter())
|
||||
{
|
||||
Console.SetOut(sw);
|
||||
Assert.False(script.Diagnostics.HasErrors());
|
||||
script.Evaluate();
|
||||
var s = sw.ToString();
|
||||
Assert.AreEqual("test\n", s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void TestHash()
|
||||
{
|
||||
var hash = HashedString.ScriptHash("Foo");
|
||||
var hash = "Foo".ScriptHash();
|
||||
Assert.AreEqual(193501609, hash);
|
||||
}
|
||||
}
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue