-
Notifications
You must be signed in to change notification settings - Fork 168
Expand file tree
/
Copy pathHostItem.NetFramework.cs
More file actions
61 lines (50 loc) · 2.33 KB
/
Copy pathHostItem.NetFramework.cs
File metadata and controls
61 lines (50 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.ClearScript.Util;
namespace Microsoft.ClearScript
{
internal partial class HostItem
{
#region initialization
private static HostItem Create(ScriptEngine engine, HostTarget target, HostItemFlags flags)
{
return TargetSupportsExpandoMembers(target, flags) ? new ExpandoHostItem(engine, target, flags) : new HostItem(engine, target, flags);
}
#endregion
#region internal members
#region member invocation
private object CreateAsyncEnumerator<T>(IEnumerable<T> enumerable)
{
return HostObject.Wrap(enumerable.GetEnumerator().ToScriptableAsyncEnumerator(Engine), typeof(IScriptableAsyncEnumerator<T>));
}
private object CreateAsyncEnumerator()
{
if ((Target is HostObject) || (Target is IHostVariable) || (Target is IByRefArg))
{
if ((Target.InvokeTarget != null) && Target.Type.IsAssignableToGenericType(typeof(IEnumerable<>), out var typeArgs))
{
var helpersHostItem = Wrap(Engine, typeof(ScriptableEnumerableHelpers<>).MakeGenericType(typeArgs).InvokeMember("HostType", BindingFlags.Public | BindingFlags.Static | BindingFlags.GetField, null, null, null), HostItemFlags.PrivateAccess);
if (MiscHelpers.Try(out var enumerator, () => ((IDynamic)helpersHostItem).InvokeMethod("GetScriptableAsyncEnumerator", this, Engine)))
{
return enumerator;
}
}
else if (BindSpecialTarget(out IEnumerable _))
{
var helpersHostItem = Wrap(Engine, ScriptableEnumerableHelpers.HostType, HostItemFlags.PrivateAccess);
if (MiscHelpers.Try(out var enumerator, () => ((IDynamic)helpersHostItem).InvokeMethod("GetScriptableAsyncEnumerator", this, Engine)))
{
return enumerator;
}
}
}
throw new NotSupportedException("The object is not async-enumerable");
}
#endregion
#endregion
}
}