54 lines
1.5 KiB
C#
54 lines
1.5 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using PorygonSharp.EvalValues;
|
|
|
|
namespace PorygonSharp
|
|
{
|
|
internal struct EvaluateResult : IDisposable
|
|
{
|
|
[StructLayout(LayoutKind.Sequential)]
|
|
private struct EvaluateResultInternal
|
|
{
|
|
public readonly IntPtr Value;
|
|
public readonly byte Result;
|
|
public readonly IntPtr ErrorMessage;
|
|
public readonly long ErrorSize;
|
|
}
|
|
|
|
private readonly IntPtr _ptr;
|
|
private readonly EvaluateResultInternal _internal;
|
|
public EvaluateResult(IntPtr ptr)
|
|
{
|
|
_ptr = ptr;
|
|
_internal = Marshal.PtrToStructure<EvaluateResultInternal>(ptr);
|
|
}
|
|
|
|
public EvalValue GetValue()
|
|
{
|
|
return new EvalValue(_internal.Value);
|
|
}
|
|
|
|
public bool IsSuccess()
|
|
{
|
|
return _internal.Result == 0;
|
|
}
|
|
|
|
public string GetError()
|
|
{
|
|
var nameArr = new byte[_internal.ErrorSize];
|
|
for (var i = 0; i < _internal.ErrorSize; i++)
|
|
nameArr[i] = Marshal.ReadByte(_internal.ErrorMessage, i);
|
|
return $"Error length: {_internal.ErrorSize}" + Encoding.UTF8.GetString(nameArr);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Marshal.FreeHGlobal(_ptr);
|
|
}
|
|
|
|
[DllImport("PorygonLang", EntryPoint = "GetResultError", CallingConvention = CallingConvention.Cdecl)]
|
|
private static extern string GetErrorMessage(IntPtr ptr);
|
|
|
|
}
|
|
} |