Handle exceptions in userdata functions gracefully, instead of crashing the whole stack down.
This commit is contained in:
parent
30627a650f
commit
f8193d2925
|
@ -1,6 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using PorygonSharp.UserData;
|
||||||
using PorygonSharp.Utilities;
|
using PorygonSharp.Utilities;
|
||||||
|
|
||||||
namespace PorygonSharp.EvalValues
|
namespace PorygonSharp.EvalValues
|
||||||
|
@ -32,8 +33,15 @@ namespace PorygonSharp.EvalValues
|
||||||
parameters[i] = Caster.Cast(val, parametersTypes[i]);
|
parameters[i] = Caster.Cast(val, parametersTypes[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
var result = _delegate.DynamicInvoke(parameters);
|
var result = _delegate.DynamicInvoke(parameters);
|
||||||
return EvalValueCreator.CreateValue(result).GetPointer();
|
return new UserDataReturnValue(EvalValueCreator.CreateValue(result)).GetPointer();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return new UserDataReturnValue(e.ToString()).GetPointer();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -105,7 +105,7 @@ namespace PorygonSharp.EvalValues
|
||||||
return Handle;
|
return Handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsNumericValueFloat()
|
private bool IsNumericValueFloat()
|
||||||
{
|
{
|
||||||
return IsNumericValueFloat(Handle) == 1;
|
return IsNumericValueFloat(Handle) == 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,8 +42,15 @@ namespace PorygonSharp.UserData
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentObj = GCHandle.FromIntPtr(parent).Target;
|
var parentObj = GCHandle.FromIntPtr(parent).Target;
|
||||||
|
try
|
||||||
|
{
|
||||||
var result = method.Invoke(parentObj, evaluatedParameters);
|
var result = method.Invoke(parentObj, evaluatedParameters);
|
||||||
return EvalValueCreator.CreateValue(result).GetPointer();
|
return new UserDataReturnValue(EvalValueCreator.CreateValue(result)).GetPointer();
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
return new UserDataReturnValue(e.ToString()).GetPointer();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
using System;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
using PorygonSharp.EvalValues;
|
||||||
|
|
||||||
|
namespace PorygonSharp.UserData
|
||||||
|
{
|
||||||
|
internal class UserDataReturnValue
|
||||||
|
{
|
||||||
|
private readonly IntPtr _ptr;
|
||||||
|
public UserDataReturnValue(EvalValue value)
|
||||||
|
{
|
||||||
|
_ptr = ReturnValue(value.GetPointer());
|
||||||
|
}
|
||||||
|
|
||||||
|
public UserDataReturnValue(string message)
|
||||||
|
{
|
||||||
|
_ptr = ErrorValue(message);
|
||||||
|
}
|
||||||
|
public static implicit operator UserDataReturnValue(EvalValue val)
|
||||||
|
{
|
||||||
|
return new UserDataReturnValue(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
internal IntPtr GetPointer()
|
||||||
|
{
|
||||||
|
return _ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
[DllImport("PorygonLang", EntryPoint = "ReturnValue", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern IntPtr ReturnValue(IntPtr value);
|
||||||
|
|
||||||
|
[DllImport("PorygonLang", EntryPoint = "ErrorValue", CallingConvention = CallingConvention.Cdecl)]
|
||||||
|
private static extern IntPtr ErrorValue(string message);
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
|
@ -1,7 +1,7 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp2.2</TargetFramework>
|
<TargetFramework>netcoreapp3.0</TargetFramework>
|
||||||
|
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
Loading…
Reference in New Issue