| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 9000508 commit 70a9c6f
697 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,7 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | 6 | #pragma once | |
| 7 | 7 | ||
| 8 | - #define CLEARSCRIPT_VERSION_STRING "7.2.4" | ||
| 9 | - #define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,2,4 | ||
| 10 | - #define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.2.4" | ||
| 8 | + #define CLEARSCRIPT_VERSION_STRING "7.2.5" | ||
| 9 | + #define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,2,5 | ||
| 10 | + #define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.2.5" | ||
| 11 | 11 | #define CLEARSCRIPT_FILE_FLAGS 0L | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8,28 +8,24 @@ | |||
| 8 | 8 | namespace Microsoft.ClearScript | |
| 9 | 9 | { | |
| 10 | 10 | /// <summary> | |
| 11 | - /// Represents a host event source. | ||
| 11 | + /// Provides the base implementation for a host event source. | ||
| 12 | 12 | /// </summary> | |
| 13 | - /// <typeparam name="T">The event handler delegate type.</typeparam> | ||
| 14 | - public class EventSource<T> | ||
| 13 | + public abstract class EventSource | ||
| 15 | 14 | { | |
| 16 | - private readonly ScriptEngine engine; | ||
| 17 | - | ||
| 18 | 15 | internal EventSource(ScriptEngine engine, object source, EventInfo eventInfo) | |
| 19 | 16 | { | |
| 20 | 17 | MiscHelpers.VerifyNonNullArgument(engine, nameof(engine)); | |
| 21 | 18 | MiscHelpers.VerifyNonNullArgument(eventInfo, nameof(eventInfo)); | |
| 22 | 19 | ||
| 23 | - if (eventInfo.EventHandlerType != typeof(T)) | ||
| 24 | - { | ||
| 25 | - throw new ArgumentException("Invalid event type", nameof(eventInfo)); | ||
| 26 | - } | ||
| 27 | - | ||
| 28 | - this.engine = engine; | ||
| 20 | + Engine = engine; | ||
| 29 | 21 | Source = source; | |
| 30 | 22 | EventInfo = eventInfo; | |
| 31 | 23 | } | |
| 32 | 24 | ||
| 25 | + internal ScriptEngine Engine { get; } | ||
| 26 | + | ||
| 27 | + internal abstract Type HandlerType { get; } | ||
| 28 | + | ||
| 33 | 29 | internal object Source { get; } | |
| 34 | 30 | ||
| 35 | 31 | internal EventInfo EventInfo { get; } | |
@@ -42,33 +38,68 @@ internal EventSource(ScriptEngine engine, object source, EventInfo eventInfo) | |||
| 42 | 38 | /// Connects the host event source to the specified script handler function. | |
| 43 | 39 | /// </summary> | |
| 44 | 40 | /// <param name="scriptFunc">The script function that will handle the event.</param> | |
| 45 | - /// <returns>An <see cref="EventConnection{T}"/> that represents the connection.</returns> | ||
| 46 | - public EventConnection<T> connect(object scriptFunc) | ||
| 41 | + /// <returns>An <see cref="EventConnection"/> that represents the connection.</returns> | ||
| 42 | + public EventConnection connect(object scriptFunc) | ||
| 47 | 43 | { | |
| 48 | 44 | MiscHelpers.VerifyNonNullArgument(scriptFunc, nameof(scriptFunc)); | |
| 49 | - return engine.CreateEventConnection<T>(Source, EventInfo, DelegateFactory.CreateDelegate(engine, scriptFunc, typeof(T))); | ||
| 45 | + return Engine.CreateEventConnection(HandlerType, Source, EventInfo, DelegateFactory.CreateDelegate(Engine, scriptFunc, HandlerType)); | ||
| 50 | 46 | } | |
| 51 | 47 | ||
| 52 | 48 | // ReSharper restore InconsistentNaming | |
| 53 | 49 | ||
| 54 | 50 | #endregion | |
| 55 | 51 | } | |
| 56 | 52 | ||
| 57 | - internal interface IEventConnection | ||
| 53 | + /// <summary> | ||
| 54 | + /// Represents a host event source. | ||
| 55 | + /// </summary> | ||
| 56 | + /// <typeparam name="T">The event handler delegate type.</typeparam> | ||
| 57 | + public sealed class EventSource<T> : EventSource | ||
| 58 | 58 | { | |
| 59 | - void Break(); | ||
| 59 | + internal EventSource(ScriptEngine engine, object source, EventInfo eventInfo) | ||
| 60 | + : base(engine, source, eventInfo) | ||
| 61 | + { | ||
| 62 | + if (eventInfo.EventHandlerType != typeof(T)) | ||
| 63 | + { | ||
| 64 | + throw new ArgumentException("Invalid event type (handler type mismatch)", nameof(eventInfo)); | ||
| 65 | + } | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + #region EventSource overrides | ||
| 69 | + | ||
| 70 | + internal override Type HandlerType => typeof(T); | ||
| 71 | + | ||
| 72 | + #endregion | ||
| 73 | + | ||
| 74 | + #region script-callable interface | ||
| 75 | + | ||
| 76 | + // ReSharper disable InconsistentNaming | ||
| 77 | + | ||
| 78 | + /// <summary> | ||
| 79 | + /// Connects the host event source to the specified script handler function. | ||
| 80 | + /// </summary> | ||
| 81 | + /// <param name="scriptFunc">The script function that will handle the event.</param> | ||
| 82 | + /// <returns>An <see cref="EventConnection{T}"/> that represents the connection.</returns> | ||
| 83 | + public new EventConnection<T> connect(object scriptFunc) | ||
| 84 | + { | ||
| 85 | + MiscHelpers.VerifyNonNullArgument(scriptFunc, nameof(scriptFunc)); | ||
| 86 | + return Engine.CreateEventConnection<T>(Source, EventInfo, DelegateFactory.CreateDelegate(Engine, scriptFunc, typeof(T))); | ||
| 87 | + } | ||
| 88 | + | ||
| 89 | + // ReSharper restore InconsistentNaming | ||
| 90 | + | ||
| 91 | + #endregion | ||
| 60 | 92 | } | |
| 61 | 93 | ||
| 62 | 94 | /// <summary> | |
| 63 | - /// Represents a connection between a host event source and a script handler function. | ||
| 95 | + /// Provides the base implementation for a connection between a host event source and a script handler function. | ||
| 64 | 96 | /// </summary> | |
| 65 | - /// <typeparam name="T">The event handler delegate type.</typeparam> | ||
| 66 | - public class EventConnection<T> : IEventConnection | ||
| 97 | + public abstract class EventConnection | ||
| 67 | 98 | { | |
| 68 | 99 | private readonly ScriptEngine engine; | |
| 69 | 100 | private readonly object source; | |
| 70 | - private readonly EventInfo eventInfo; | ||
| 71 | - private readonly Delegate handler; | ||
| 101 | + private readonly MethodInfo removeMethod; | ||
| 102 | + private readonly object[] parameters; | ||
| 72 | 103 | private readonly InterlockedOneWayFlag brokenFlag = new InterlockedOneWayFlag(); | |
| 73 | 104 | ||
| 74 | 105 | internal EventConnection(ScriptEngine engine, object source, EventInfo eventInfo, Delegate handler) | |
@@ -77,17 +108,28 @@ internal EventConnection(ScriptEngine engine, object source, EventInfo eventInfo | |||
| 77 | 108 | MiscHelpers.VerifyNonNullArgument(handler, nameof(handler)); | |
| 78 | 109 | MiscHelpers.VerifyNonNullArgument(eventInfo, nameof(eventInfo)); | |
| 79 | 110 | ||
| 80 | - if (eventInfo.EventHandlerType != typeof(T)) | ||
| 111 | + if (!MiscHelpers.Try(out var addMethod, () => eventInfo.GetAddMethod(true)) || (addMethod == null)) | ||
| 81 | 112 | { | |
| 82 | - throw new ArgumentException("Invalid event type", nameof(eventInfo)); | ||
| 113 | + throw new ArgumentException("Invalid event type (no accessible add method)", nameof(eventInfo)); | ||
| 114 | + } | ||
| 115 | + | ||
| 116 | + if (!MiscHelpers.Try(out removeMethod, () => eventInfo.GetRemoveMethod(true)) || (removeMethod == null)) | ||
| 117 | + { | ||
| 118 | + throw new ArgumentException("Invalid event type (no accessible remove method)", nameof(eventInfo)); | ||
| 83 | 119 | } | |
| 84 | 120 | ||
| 85 | 121 | this.engine = engine; | |
| 86 | 122 | this.source = source; | |
| 87 | - this.eventInfo = eventInfo; | ||
| 88 | - this.handler = handler; | ||
| 89 | 123 | ||
| 90 | - eventInfo.AddEventHandler(source, handler); | ||
| 124 | + addMethod.Invoke(source, parameters = new object[] { handler }); | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + internal void Break() | ||
| 128 | + { | ||
| 129 | + if (brokenFlag.Set()) | ||
| 130 | + { | ||
| 131 | + removeMethod.Invoke(source, parameters); | ||
| 132 | + } | ||
| 91 | 133 | } | |
| 92 | 134 | ||
| 93 | 135 | #region script-callable interface | |
@@ -105,17 +147,21 @@ public void disconnect() | |||
| 105 | 147 | // ReSharper restore InconsistentNaming | |
| 106 | 148 | ||
| 107 | 149 | #endregion | |
| 150 | + } | ||
| 108 | 151 | ||
| 109 | - #region IEventConnection implementation | ||
| 110 | - | ||
| 111 | - void IEventConnection.Break() | ||
| 152 | + /// <summary> | ||
| 153 | + /// Represents a connection between a host event source and a script handler function. | ||
| 154 | + /// </summary> | ||
| 155 | + /// <typeparam name="T">The event handler delegate type.</typeparam> | ||
| 156 | + public sealed class EventConnection<T> : EventConnection | ||
| 157 | + { | ||
| 158 | + internal EventConnection(ScriptEngine engine, object source, EventInfo eventInfo, Delegate handler) | ||
| 159 | + : base(engine, source, eventInfo, handler) | ||
| 112 | 160 | { | |
| 113 | - if (brokenFlag.Set()) | ||
| 161 | + if (eventInfo.EventHandlerType != typeof(T)) | ||
| 114 | 162 | { | |
| 115 | - eventInfo.RemoveEventHandler(source, handler); | ||
| 163 | + throw new ArgumentException("Invalid event type (handler type mismatch)", nameof(eventInfo)); | ||
| 116 | 164 | } | |
| 117 | 165 | } | |
| 118 | - | ||
| 119 | - #endregion | ||
| 120 | 166 | } | |
| 121 | 167 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -117,7 +117,7 @@ private MethodBindResult BindMethod(string name, Type[] typeArgs, object[] args, | |||
| 117 | 117 | } | |
| 118 | 118 | else | |
| 119 | 119 | { | |
| 120 | - result = BindMethodInternal(AccessContext, bindFlags, Target, name, typeArgs, args, bindArgs); | ||
| 120 | + result = BindMethodInternal(signature, AccessContext, bindFlags, Target, name, typeArgs, args, bindArgs); | ||
| 121 | 121 | if (!result.IsPreferredMethod(this, name)) | |
| 122 | 122 | { | |
| 123 | 123 | if (result is MethodBindSuccess) | |
@@ -127,7 +127,7 @@ private MethodBindResult BindMethod(string name, Type[] typeArgs, object[] args, | |||
| 127 | 127 | ||
| 128 | 128 | foreach (var altName in GetAltMethodNames(name, bindFlags)) | |
| 129 | 129 | { | |
| 130 | - var altResult = BindMethodInternal(AccessContext, bindFlags, Target, altName, typeArgs, args, bindArgs); | ||
| 130 | + var altResult = BindMethodInternal(null, AccessContext, bindFlags, Target, altName, typeArgs, args, bindArgs); | ||
| 131 | 131 | if (altResult.IsUnblockedMethod(this)) | |
| 132 | 132 | { | |
| 133 | 133 | result = altResult; | |
@@ -151,12 +151,16 @@ private MethodBindResult BindMethod(string name, Type[] typeArgs, object[] args, | |||
| 151 | 151 | return result; | |
| 152 | 152 | } | |
| 153 | 153 | ||
| 154 | - private static MethodBindResult BindMethodInternal(Type bindContext, BindingFlags bindFlags, HostTarget target, string name, Type[] typeArgs, object[] args, object[] bindArgs) | ||
| 154 | + private static MethodBindResult BindMethodInternal(BindSignature signature, Type bindContext, BindingFlags bindFlags, HostTarget target, string name, Type[] typeArgs, object[] args, object[] bindArgs) | ||
| 155 | 155 | { | |
| 156 | - // WARNING: BindSignature holds on to the specified typeArgs; subsequent modification | ||
| 157 | - // will result in bugs that are difficult to diagnose. Create a copy if necessary. | ||
| 156 | + if (signature == null) | ||
| 157 | + { | ||
| 158 | + // WARNING: BindSignature holds on to the specified typeArgs; subsequent modification | ||
| 159 | + // will result in bugs that are difficult to diagnose. Create a copy if necessary. | ||
| 160 | + | ||
| 161 | + signature = new BindSignature(bindContext, bindFlags, target, name, typeArgs, bindArgs); | ||
| 162 | + } | ||
| 158 | 163 | ||
| 159 | - var signature = new BindSignature(bindContext, bindFlags, target, name, typeArgs, bindArgs); | ||
| 160 | 164 | MethodBindResult result; | |
| 161 | 165 | ||
| 162 | 166 | if (coreBindCache.TryGetValue(signature, out var rawResult)) | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1479,9 +1479,8 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a | |||
| 1479 | 1479 | var eventInfo = Target.Type.GetScriptableEvent(name, invokeFlags, AccessContext, DefaultAccess); | |
| 1480 | 1480 | if (eventInfo != null) | |
| 1481 | 1481 | { | |
| 1482 | - var type = typeof(EventSource<>).MakeSpecificType(eventInfo.EventHandlerType); | ||
| 1483 | 1482 | isCacheable = (TargetDynamicMetaObject == null); | |
| 1484 | - return type.CreateInstance(BindingFlags.NonPublic, Engine, Target.InvokeTarget, eventInfo); | ||
| 1483 | + return typeof(EventSource<>).MakeSpecificType(eventInfo.EventHandlerType).CreateInstance(BindingFlags.NonPublic, Engine, Target.InvokeTarget, eventInfo); | ||
| 1485 | 1484 | } | |
| 1486 | 1485 | ||
| 1487 | 1486 | var field = Target.Type.GetScriptableField(name, invokeFlags, AccessContext, DefaultAccess); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -18,15 +18,15 @@ | |||
| 18 | 18 | [assembly: InternalsVisibleTo("ClearScriptTest")] | |
| 19 | 19 | ||
| 20 | 20 | [assembly: ComVisible(false)] | |
| 21 | - [assembly: AssemblyVersion("7.2.4")] | ||
| 22 | - [assembly: AssemblyFileVersion("7.2.4")] | ||
| 23 | - [assembly: AssemblyInformationalVersion("7.2.4")] | ||
| 21 | + [assembly: AssemblyVersion("7.2.5")] | ||
| 22 | + [assembly: AssemblyFileVersion("7.2.5")] | ||
| 23 | + [assembly: AssemblyInformationalVersion("7.2.5")] | ||
| 24 | 24 | ||
| 25 | 25 | namespace Microsoft.ClearScript.Properties | |
| 26 | 26 | { | |
| 27 | 27 | internal static class ClearScriptVersion | |
| 28 | 28 | { | |
| 29 | - public const string Triad = "7.2.4"; | ||
| 30 | - public const string Informational = "7.2.4"; | ||
| 29 | + public const string Triad = "7.2.5"; | ||
| 30 | + public const string Informational = "7.2.5"; | ||
| 31 | 31 | } | |
| 32 | 32 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -15,6 +15,6 @@ | |||
| 15 | 15 | [assembly: InternalsVisibleTo("ClearScriptTest")] | |
| 16 | 16 | ||
| 17 | 17 | [assembly: ComVisible(false)] | |
| 18 | - [assembly: AssemblyVersion("7.2.4")] | ||
| 19 | - [assembly: AssemblyFileVersion("7.2.4")] | ||
| 20 | - [assembly: AssemblyInformationalVersion("7.2.4")] | ||
| 18 | + [assembly: AssemblyVersion("7.2.5")] | ||
| 19 | + [assembly: AssemblyFileVersion("7.2.5")] | ||
| 20 | + [assembly: AssemblyInformationalVersion("7.2.5")] | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -16,6 +16,6 @@ | |||
| 16 | 16 | [assembly: InternalsVisibleTo("ClearScriptTest")] | |
| 17 | 17 | ||
| 18 | 18 | [assembly: ComVisible(false)] | |
| 19 | - [assembly: AssemblyVersion("7.2.4")] | ||
| 20 | - [assembly: AssemblyFileVersion("7.2.4")] | ||
| 21 | - [assembly: AssemblyInformationalVersion("7.2.4")] | ||
| 19 | + [assembly: AssemblyVersion("7.2.5")] | ||
| 20 | + [assembly: AssemblyFileVersion("7.2.5")] | ||
| 21 | + [assembly: AssemblyInformationalVersion("7.2.5")] | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -15,6 +15,6 @@ | |||
| 15 | 15 | [assembly: InternalsVisibleTo("ClearScriptTest")] | |
| 16 | 16 | ||
| 17 | 17 | [assembly: ComVisible(false)] | |
| 18 | - [assembly: AssemblyVersion("7.2.4")] | ||
| 19 | - [assembly: AssemblyFileVersion("7.2.4")] | ||
| 20 | - [assembly: AssemblyInformationalVersion("7.2.4")] | ||
| 18 | + [assembly: AssemblyVersion("7.2.5")] | ||
| 19 | + [assembly: AssemblyFileVersion("7.2.5")] | ||
| 20 | + [assembly: AssemblyInformationalVersion("7.2.5")] | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -296,6 +296,19 @@ public bool DisableExtensionMethods | |||
| 296 | 296 | /// </remarks> | |
| 297 | 297 | public object UndefinedImportValue { get; set; } = Undefined.Value; | |
| 298 | 298 | ||
| 299 | + /// <summary> | ||
| 300 | + /// Gets or sets the engine's void result export value. | ||
| 301 | + /// </summary> | ||
| 302 | + /// <remarks> | ||
| 303 | + /// Some script languages expect every subroutine call to return a value. When script code | ||
| 304 | + /// written in such a language invokes a host method that explicitly returns no value (such | ||
| 305 | + /// as a C# | ||
| 306 | + /// <see href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/void">void</see> | ||
| 307 | + /// method), the script engine returns the value of this property as a dummy result. The | ||
| 308 | + /// default value is <see cref="VoidResult.Value"/>. | ||
| 309 | + /// </remarks> | ||
| 310 | + public object VoidResultValue { get; set; } = VoidResult.Value; | ||
| 311 | + | ||
| 299 | 312 | /// <summary> | |
| 300 | 313 | /// Gets or sets a callback that can be used to halt script execution. | |
| 301 | 314 | /// </summary> | |
@@ -1947,12 +1960,17 @@ internal HostTargetMemberData GetSharedHostObjectMemberData(HostObject target, T | |||
| 1947 | 1960 | ||
| 1948 | 1961 | private readonly EventConnectionMap eventConnectionMap = new EventConnectionMap(); | |
| 1949 | 1962 | ||
| 1963 | + internal EventConnection CreateEventConnection(Type handlerType, object source, EventInfo eventInfo, Delegate handler) | ||
| 1964 | + { | ||
| 1965 | + return eventConnectionMap.Create(this, handlerType, source, eventInfo, handler); | ||
| 1966 | + } | ||
| 1967 | + | ||
| 1950 | 1968 | internal EventConnection<T> CreateEventConnection<T>(object source, EventInfo eventInfo, Delegate handler) | |
| 1951 | 1969 | { | |
| 1952 | 1970 | return eventConnectionMap.Create<T>(this, source, eventInfo, handler); | |
| 1953 | 1971 | } | |
| 1954 | 1972 | ||
| 1955 | - internal void BreakEventConnection(IEventConnection connection) | ||
| 1973 | + internal void BreakEventConnection(EventConnection connection) | ||
| 1956 | 1974 | { | |
| 1957 | 1975 | eventConnectionMap.Break(connection); | |
| 1958 | 1976 | } | |
@@ -2035,25 +2053,35 @@ internal sealed class ScriptFrame | |||
| 2035 | 2053 | ||
| 2036 | 2054 | private sealed class EventConnectionMap : IDisposable | |
| 2037 | 2055 | { | |
| 2038 | - private readonly HashSet<IEventConnection> map = new HashSet<IEventConnection>(); | ||
| 2056 | + private readonly HashSet<EventConnection> map = new HashSet<EventConnection>(); | ||
| 2039 | 2057 | private readonly InterlockedOneWayFlag disposedFlag = new InterlockedOneWayFlag(); | |
| 2040 | 2058 | ||
| 2059 | + internal EventConnection Create(ScriptEngine engine, Type handlerType, object source, EventInfo eventInfo, Delegate handler) | ||
| 2060 | + { | ||
| 2061 | + var connection = (EventConnection)typeof(EventConnection<>).MakeGenericType(handlerType).CreateInstance(BindingFlags.NonPublic, engine, source, eventInfo, handler); | ||
| 2062 | + Add(connection); | ||
| 2063 | + return connection; | ||
| 2064 | + } | ||
| 2065 | + | ||
| 2041 | 2066 | internal EventConnection<T> Create<T>(ScriptEngine engine, object source, EventInfo eventInfo, Delegate handler) | |
| 2042 | 2067 | { | |
| 2043 | 2068 | var connection = new EventConnection<T>(engine, source, eventInfo, handler); | |
| 2069 | + Add(connection); | ||
| 2070 | + return connection; | ||
| 2071 | + } | ||
| 2044 | 2072 | ||
| 2073 | + private void Add(EventConnection connection) | ||
| 2074 | + { | ||
| 2045 | 2075 | if (!disposedFlag.IsSet) | |
| 2046 | 2076 | { | |
| 2047 | 2077 | lock (map) | |
| 2048 | 2078 | { | |
| 2049 | 2079 | map.Add(connection); | |
| 2050 | 2080 | } | |
| 2051 | 2081 | } | |
| 2052 | - | ||
| 2053 | - return connection; | ||
| 2054 | 2082 | } | |
| 2055 | 2083 | ||
| 2056 | - internal void Break(IEventConnection connection) | ||
| 2084 | + internal void Break(EventConnection connection) | ||
| 2057 | 2085 | { | |
| 2058 | 2086 | var mustBreak = true; | |
| 2059 | 2087 | ||
@@ -2075,7 +2103,7 @@ public void Dispose() | |||
| 2075 | 2103 | { | |
| 2076 | 2104 | if (disposedFlag.Set()) | |
| 2077 | 2105 | { | |
| 2078 | - var connections = new List<IEventConnection>(); | ||
| 2106 | + var connections = new List<EventConnection>(); | ||
| 2079 | 2107 | ||
| 2080 | 2108 | lock (map) | |
| 2081 | 2109 | { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -9,8 +9,9 @@ namespace Microsoft.ClearScript | |||
| 9 | 9 | /// <remarks> | |
| 10 | 10 | /// Some script languages support one or more special non-<c>null</c> values that represent | |
| 11 | 11 | /// nonexistent, missing, unknown, or undefined data. The ClearScript library maps such values | |
| 12 | - /// to instances of this class. | ||
| 12 | + /// to an instance of this class. | ||
| 13 | 13 | /// </remarks> | |
| 14 | + /// <seealso cref="ScriptEngine.UndefinedImportValue"/> | ||
| 14 | 15 | public class Undefined | |
| 15 | 16 | { | |
| 16 | 17 | /// <summary> | |
| Back | FazBrowse Home | New Git URL |
0 commit comments