private MethodBindResult BindMethodInternal(string name, Type[] typeArgs, object[] args, object[] bindArgs) { // create C# member invocation binder const CSharpBinderFlags binderFlags = CSharpBinderFlags.InvokeSimpleName | CSharpBinderFlags.ResultDiscarded; var binder = Binder.InvokeMember(binderFlags, name, typeArgs, accessContext ?? engine.AccessContext, CreateArgInfoEnum(bindArgs)); // perform default binding var binding = DynamicHelpers.Bind((DynamicMetaObjectBinder)binder, target, bindArgs); var rawResult = (new MethodBindingVisitor(target.InvokeTarget, name, binding.Expression)).Result; var result = MethodBindResult.Create(name, rawResult, target, args); if (!(result is MethodBindSuccess) && !(target is HostType) && target.Type.IsInterface) { // binding through interface failed; try base interfaces foreach (var interfaceType in target.Type.GetInterfaces()) { var tempTarget = HostObject.Wrap(target.InvokeTarget, interfaceType); binding = DynamicHelpers.Bind((DynamicMetaObjectBinder)binder, tempTarget, bindArgs); rawResult = (new MethodBindingVisitor(target.InvokeTarget, name, binding.Expression)).Result; var tempResult = MethodBindResult.Create(name, rawResult, target, args); if (tempResult is MethodBindSuccess) { return(tempResult); } } // binding through base interfaces failed; try System.Object var objectTarget = HostObject.Wrap(target.InvokeTarget, typeof(object)); binding = DynamicHelpers.Bind((DynamicMetaObjectBinder)binder, objectTarget, bindArgs); rawResult = (new MethodBindingVisitor(target.InvokeTarget, name, binding.Expression)).Result; var objectResult = MethodBindResult.Create(name, rawResult, target, args); if (objectResult is MethodBindSuccess) { return(objectResult); } } return(result); }
private static MethodBindResult BindMethodCore(Type bindContext, BindingFlags bindFlags, HostTarget target, string name, Type[] typeArgs, object[] args, object[] bindArgs) { Interlocked.Increment(ref coreBindCount); // create C# member invocation binder const CSharpBinderFlags binderFlags = CSharpBinderFlags.InvokeSimpleName | CSharpBinderFlags.ResultDiscarded; var binder = (InvokeMemberBinder)Binder.InvokeMember(binderFlags, name, typeArgs, bindContext, CreateArgInfoEnum(target, bindArgs)); // perform default binding var rawResult = BindMethodRaw(bindFlags, binder, target, bindArgs); var result = MethodBindResult.Create(name, rawResult, target, args); if ((result is MethodBindFailure) && !(target is HostType) && target.Type.IsInterface) { // binding through interface failed; try base interfaces foreach (var interfaceType in target.Type.GetInterfaces()) { var baseInterfaceTarget = HostObject.Wrap(target.InvokeTarget, interfaceType); rawResult = BindMethodRaw(bindFlags, binder, baseInterfaceTarget, bindArgs); var baseInterfaceResult = MethodBindResult.Create(name, rawResult, target, args); if (baseInterfaceResult is MethodBindSuccess) { return(baseInterfaceResult); } } // binding through base interfaces failed; try System.Object var objectTarget = HostObject.Wrap(target.InvokeTarget, typeof(object)); rawResult = BindMethodRaw(bindFlags, binder, objectTarget, bindArgs); var objectResult = MethodBindResult.Create(name, rawResult, target, args); if (objectResult is MethodBindSuccess) { return(objectResult); } } return(result); }
private object CreateAsyncEnumerator <T>(IEnumerable <T> enumerable) { return(HostObject.Wrap(enumerable.GetEnumerator().ToAsyncEnumerator(Engine), typeof(IAsyncEnumeratorPromise <T>))); }