in ClearScript/V8/V8ScriptItem.cs [110:194]
protected override bool TryBindAndInvoke(DynamicMetaObjectBinder binder, object[] args, out object result)
{
VerifyNotDisposed();
try
{
if (binder is GetMemberBinder getMemberBinder)
{
result = target.GetProperty(getMemberBinder.Name);
return true;
}
if ((binder is SetMemberBinder setMemberBinder) && (args != null) && (args.Length > 0))
{
target.SetProperty(setMemberBinder.Name, args[0]);
result = args[0];
return true;
}
if (binder is GetIndexBinder)
{
if ((args != null) && (args.Length == 1))
{
result = MiscHelpers.TryGetNumericIndex(args[0], out int index) ? target.GetProperty(index) : target.GetProperty(args[0].ToString());
return true;
}
throw new InvalidOperationException("Invalid argument or index count");
}
if (binder is SetIndexBinder)
{
if ((args != null) && (args.Length == 2))
{
if (MiscHelpers.TryGetNumericIndex(args[0], out int index))
{
target.SetProperty(index, args[1]);
}
else
{
target.SetProperty(args[0].ToString(), args[1]);
}
result = args[1];
return true;
}
throw new InvalidOperationException("Invalid argument or index count");
}
if (binder is InvokeBinder)
{
result = target.Invoke(false, args);
return true;
}
if (binder is InvokeMemberBinder invokeMemberBinder)
{
result = target.InvokeMethod(invokeMemberBinder.Name, args);
return true;
}
}
catch (Exception exception)
{
if (engine.CurrentScriptFrame != null)
{
if (exception is IScriptEngineException scriptError)
{
if (scriptError.ExecutionStarted)
{
throw;
}
engine.CurrentScriptFrame.ScriptError = scriptError;
}
else
{
engine.CurrentScriptFrame.ScriptError = new ScriptEngineException(engine.Name, exception.Message, null, HResult.CLEARSCRIPT_E_SCRIPTITEMEXCEPTION, false, false, null, exception);
}
}
}
result = null;
return false;
}