Skip to content

Commit

Permalink
Version 7.3.3: Added DefaultDocumentLoader to address GitHub Issue mi…
Browse files Browse the repository at this point in the history
…crosoft#412; unified method, constructor, and property invocation, fixing GitHub Issue microsoft#413; fixed invocation of indexers with optional parameters; hardened V8 debug agent disposal, fixing a rare exception (GitHub Issue microsoft#416); added a check to prevent version mismatches between managed and native V8 assemblies (GitHub Issue microsoft#416); restricted host item IDispatchEx support to Windows Script engines, fixing GitHub Issue microsoft#417; updated API documentation. Tested with V8 10.6.194.14.
  • Loading branch information
ClearScriptLib committed Sep 28, 2022
1 parent 08ba869 commit 2baf6b8
Show file tree
Hide file tree
Showing 673 changed files with 1,774 additions and 1,274 deletions.
469 changes: 469 additions & 0 deletions ClearScript/DefaultDocumentLoader.cs

Large diffs are not rendered by default.

444 changes: 6 additions & 438 deletions ClearScript/DocumentLoader.cs

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions ClearScript/Exports/VersionSymbols.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

#pragma once

#define CLEARSCRIPT_VERSION_STRING "7.3.2"
#define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,3,2
#define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.3.2"
#define CLEARSCRIPT_VERSION_STRING "7.3.3"
#define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,3,3
#define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.3.3"
#define CLEARSCRIPT_FILE_FLAGS 0L
6 changes: 3 additions & 3 deletions ClearScript/HostIndexedProperty.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ public override bool TryInvokeAuxMember(IHostInvokeContext context, string membe
{
if (string.Equals(memberName, "get", invokeFlags.GetMemberNameComparison()))
{
result = target.InvokeMember(name, BindingFlags.GetProperty, args, bindArgs, null, true);
result = target.InvokeMember(name, BindingFlags.GetProperty | BindingFlags.SuppressChangeType, args, bindArgs, null, true);
return true;
}

if (string.Equals(memberName, "set", invokeFlags.GetMemberNameComparison()))
{
result = target.InvokeMember(name, BindingFlags.SetProperty, args, bindArgs, null, true);
result = target.InvokeMember(name, BindingFlags.SetProperty | BindingFlags.SuppressChangeType, args, bindArgs, null, true);
return true;
}
}
Expand All @@ -72,7 +72,7 @@ public override bool TryInvokeAuxMember(IHostInvokeContext context, string membe

public override bool TryInvoke(IHostInvokeContext context, BindingFlags invokeFlags, object[] args, object[] bindArgs, out object result)
{
result = target.InvokeMember(name, invokeFlags.HasFlag(BindingFlags.SetField) ? BindingFlags.SetProperty : BindingFlags.GetProperty, args, bindArgs, null, true);
result = target.InvokeMember(name, (invokeFlags.HasFlag(BindingFlags.SetField) ? BindingFlags.SetProperty : BindingFlags.GetProperty) | BindingFlags.SuppressChangeType, args, bindArgs, null, true);
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion ClearScript/HostItem.InvokeMethod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ public override object Invoke(HostItem hostItem)
hostItem.Engine.CheckReflection();
}

return InvokeHelpers.InvokeMethod(hostItem, hostTarget.InvokeTarget, method, args);
return InvokeHelpers.InvokeMethod(hostItem, method, hostTarget.InvokeTarget, args, method.GetScriptMemberFlags());
}

#endregion
Expand Down
2 changes: 1 addition & 1 deletion ClearScript/HostItem.NetStandard.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ private static HostItem Create(ScriptEngine engine, HostTarget target, HostItemF
return new HostItem(engine, target, flags);
}

return TargetSupportsExpandoMembers(target, flags) ? new DispatchExHostItem(engine, target, flags) : new HostItem(engine, target, flags);
return (TargetSupportsExpandoMembers(target, flags) && (engine is IWindowsScriptEngineTag)) ? new DispatchExHostItem(engine, target, flags) : new HostItem(engine, target, flags);
}

#endregion
Expand Down
93 changes: 49 additions & 44 deletions ClearScript/HostItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@ public object InvokeMember(string name, BindingFlags invokeFlags, object[] args,

if ((args.Length > testLength) && (name != SpecialMemberNames.Default))
{
var value = GetHostProperty(name, GetCommonBindFlags(), ArrayHelpers.GetEmptyArray<object>(), ArrayHelpers.GetEmptyArray<object>(), culture, false, out _);
var value = GetHostProperty(name, GetCommonBindFlags(), ArrayHelpers.GetEmptyArray<object>(), ArrayHelpers.GetEmptyArray<object>(), false, out _);
if (!(value is Nonexistent))
{
if (Engine.MarshalToScript(value) is HostItem hostItem)
Expand All @@ -195,7 +195,7 @@ public object InvokeMember(string name, BindingFlags invokeFlags, object[] args,
}
}

return InvokeHostMember(name, invokeFlags, args, bindArgs, culture, out isCacheable);
return InvokeHostMember(name, invokeFlags, args, bindArgs, out isCacheable);
}

#endregion
Expand Down Expand Up @@ -1200,7 +1200,7 @@ private object InvokeListElement(int index, BindingFlags invokeFlags, object[] a
throw new InvalidOperationException("Invalid member invocation mode");
}

private object InvokeHostMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture, out bool isCacheable)
private object InvokeHostMember(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, out bool isCacheable)
{
isCacheable = false;
object result;
Expand Down Expand Up @@ -1235,7 +1235,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
return DelegateFactory.CreateDelegate(Engine, args[0], specificType);
}

return specificType.CreateInstance(AccessContext, DefaultAccess, args, bindArgs);
return specificType.CreateInstance(this, AccessContext, DefaultAccess, args, bindArgs);
}
}

Expand All @@ -1255,7 +1255,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
return DelegateFactory.CreateDelegate(Engine, args[0], type);
}

return type.CreateInstance(AccessContext, DefaultAccess, args, bindArgs);
return type.CreateInstance(this, AccessContext, DefaultAccess, args, bindArgs);
}

if (TargetDynamicMetaObject != null)
Expand All @@ -1281,7 +1281,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]

if (invokeFlags.HasFlag(BindingFlags.GetField))
{
result = GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
result = GetHostProperty(name, invokeFlags, args, bindArgs, true, out isCacheable);
if (!(result is Nonexistent))
{
return result;
Expand Down Expand Up @@ -1343,7 +1343,7 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]
{
if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
return GetHostProperty(name, invokeFlags, args, bindArgs, true, out isCacheable);
}

}
Expand All @@ -1363,26 +1363,26 @@ private object InvokeHostMember(string name, BindingFlags invokeFlags, object[]

if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
return GetHostProperty(name, invokeFlags, args, bindArgs, true, out isCacheable);
}

throw new MissingMethodException(MiscHelpers.FormatInvariant("The object has no suitable method named '{0}'", name));
}

if (invokeFlags.HasFlag(BindingFlags.GetField))
{
return GetHostProperty(name, invokeFlags, args, bindArgs, culture, true, out isCacheable);
return GetHostProperty(name, invokeFlags, args, bindArgs, true, out isCacheable);
}

if (invokeFlags.HasFlag(BindingFlags.SetField))
{
return SetHostProperty(name, invokeFlags, args, bindArgs, culture);
return SetHostProperty(name, invokeFlags, args, bindArgs);
}

throw new InvalidOperationException("Invalid member invocation mode");
}

private object GetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture, bool includeBoundMembers, out bool isCacheable)
private object GetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, bool includeBoundMembers, out bool isCacheable)
{
isCacheable = false;

Expand All @@ -1391,7 +1391,7 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
var defaultProperty = Target.Type.GetScriptableDefaultProperty(invokeFlags, args, bindArgs, AccessContext, DefaultAccess);
if (defaultProperty != null)
{
return GetHostProperty(defaultProperty, invokeFlags, args, culture);
return GetHostProperty(defaultProperty, invokeFlags, args);
}

if (TargetDynamicMetaObject != null)
Expand Down Expand Up @@ -1476,7 +1476,7 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
var property = Target.Type.GetScriptableProperty(name, invokeFlags, args, bindArgs, AccessContext, DefaultAccess);
if (property != null)
{
return GetHostProperty(property, invokeFlags, args, culture);
return GetHostProperty(property, invokeFlags, args);
}

if (args.Length > 0)
Expand Down Expand Up @@ -1539,35 +1539,40 @@ private object GetHostProperty(string name, BindingFlags invokeFlags, object[] a
return Nonexistent.Value;
}

private object GetHostProperty(PropertyInfo property, BindingFlags invokeFlags, object[] args, CultureInfo culture)
private object GetHostProperty(PropertyInfo property, BindingFlags invokeFlags, object[] args)
{
if (reflectionProperties.Contains(property, MemberComparer<PropertyInfo>.Instance))
{
Engine.CheckReflection();
}

var getMethod = property.GetMethod;
if ((getMethod == null) || !getMethod.IsAccessible(AccessContext) || getMethod.IsBlockedFromScript(DefaultAccess, false))
if ((property.GetIndexParameters().Length > 0) && (args.Length < 1) && !invokeFlags.HasFlag(BindingFlags.SuppressChangeType))
{
throw new UnauthorizedAccessException("The property get method is unavailable or inaccessible");
}
if (HostIndexedPropertyMap == null)
{
HostIndexedPropertyMap = new Dictionary<string, HostIndexedProperty>();
}

if (args.Length > 0)
{
args = (object[])args.Clone();
var indexParams = property.GetIndexParameters();
var length = Math.Min(args.Length, indexParams.Length);
for (var index = 0; index < length; index++)
var name = property.Name;
if (!HostIndexedPropertyMap.TryGetValue(name, out var hostIndexedProperty))
{
indexParams[index].ParameterType.IsAssignableFromValue(ref args[index]);
hostIndexedProperty = new HostIndexedProperty(this, name);
HostIndexedPropertyMap.Add(name, hostIndexedProperty);
}

return hostIndexedProperty;
}

var result = property.GetValue(Target.InvokeTarget, invokeFlags, Type.DefaultBinder, args, culture);
return Engine.PrepareResult(result, property.PropertyType, property.GetScriptMemberFlags(), false);
var getMethod = property.GetMethod;
if ((getMethod == null) || !getMethod.IsAccessible(AccessContext) || getMethod.IsBlockedFromScript(DefaultAccess, false))
{
throw new UnauthorizedAccessException("The property get method is unavailable or inaccessible");
}

return InvokeHelpers.InvokeMethod(this, getMethod, Target.InvokeTarget, args, property.GetScriptMemberFlags());
}

private object SetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture)
private object SetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs)
{
if (name == SpecialMemberNames.Default)
{
Expand All @@ -1581,7 +1586,7 @@ private object SetHostProperty(string name, BindingFlags invokeFlags, object[] a
var defaultProperty = Target.Type.GetScriptableDefaultProperty(invokeFlags, args.Take(args.Length - 1).ToArray(), bindArgs.Take(bindArgs.Length - 1).ToArray(), AccessContext, DefaultAccess);
if (defaultProperty != null)
{
return SetHostProperty(defaultProperty, invokeFlags, args, bindArgs, culture);
return SetHostProperty(defaultProperty, args, bindArgs);
}

if (args.Length < 2)
Expand Down Expand Up @@ -1636,7 +1641,7 @@ private object SetHostProperty(string name, BindingFlags invokeFlags, object[] a
var property = Target.Type.GetScriptableProperty(name, invokeFlags, args.Take(args.Length - 1).ToArray(), bindArgs.Take(bindArgs.Length - 1).ToArray(), AccessContext, DefaultAccess);
if (property != null)
{
return SetHostProperty(property, invokeFlags, args, bindArgs, culture);
return SetHostProperty(property, args, bindArgs);
}

var field = Target.Type.GetScriptableField(name, invokeFlags, AccessContext, DefaultAccess);
Expand Down Expand Up @@ -1665,7 +1670,7 @@ private object SetHostProperty(string name, BindingFlags invokeFlags, object[] a
throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no suitable property or field named '{0}'", name));
}

private object SetHostProperty(PropertyInfo property, BindingFlags invokeFlags, object[] args, object[] bindArgs, CultureInfo culture)
private object SetHostProperty(PropertyInfo property, object[] args, object[] bindArgs)
{
if (property.IsReadOnlyForScript(DefaultAccess))
{
Expand All @@ -1678,19 +1683,17 @@ private object SetHostProperty(PropertyInfo property, BindingFlags invokeFlags,
throw new UnauthorizedAccessException("The property set method is unavailable or inaccessible");
}

if (args.Length > 1)
var value = args[args.Length - 1];

var argCount = args.Length - 1;
var paramCount = property.GetIndexParameters().Length;
if (argCount < paramCount)
{
args = (object[])args.Clone();
var indexParams = property.GetIndexParameters();
var length = Math.Min(args.Length - 1, indexParams.Length);
for (var index = 0; index < length; index++)
{
indexParams[index].ParameterType.IsAssignableFromValue(ref args[index]);
}
var missingArgs = Enumerable.Repeat(Missing.Value, paramCount - argCount).ToArray();
args = args.Take(argCount).Concat(missingArgs).Concat(value.ToEnumerable()).ToArray();
bindArgs = bindArgs.Take(argCount).Concat(missingArgs).Concat(bindArgs[bindArgs.Length - 1].ToEnumerable()).ToArray();
}

var value = args[args.Length - 1];

// ReSharper disable once SuspiciousTypeConversion.Global
if ((value != null) && (Engine is IVBScriptEngineTag))
{
Expand Down Expand Up @@ -1718,17 +1721,19 @@ private object SetHostProperty(PropertyInfo property, BindingFlags invokeFlags,

if (property.PropertyType.IsAssignableFromValue(ref value))
{
property.SetValue(Target.InvokeTarget, value, invokeFlags, Type.DefaultBinder, args.Take(args.Length - 1).ToArray(), culture);
args[args.Length - 1] = value;
InvokeHelpers.InvokeMethod(this, setMethod, Target.InvokeTarget, args, property.GetScriptMemberFlags());
return value;
}

// Some COM properties have setters where the final parameter type doesn't match
// the property type. The latter has failed, so let's try the former.

var setParams = setMethod.GetParameters();
if ((setParams.Length == args.Length) && (setParams[args.Length - 1].ParameterType.IsAssignableFromValue(ref value)))
if ((setParams.Length >= args.Length) && (setParams[args.Length - 1].ParameterType.IsAssignableFromValue(ref value)))
{
property.SetValue(Target.InvokeTarget, value, invokeFlags, Type.DefaultBinder, args.Take(args.Length - 1).ToArray(), culture);
args[args.Length - 1] = value;
InvokeHelpers.InvokeMethod(this, setMethod, Target.InvokeTarget, args, property.GetScriptMemberFlags());
return value;
}

Expand Down
10 changes: 5 additions & 5 deletions ClearScript/Properties/AssemblyInfo.Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
[assembly: InternalsVisibleTo("ClearScriptTest")]

[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.3.2")]
[assembly: AssemblyFileVersion("7.3.2")]
[assembly: AssemblyInformationalVersion("7.3.2")]
[assembly: AssemblyVersion("7.3.3")]
[assembly: AssemblyFileVersion("7.3.3")]
[assembly: AssemblyInformationalVersion("7.3.3")]

namespace Microsoft.ClearScript.Properties
{
internal static class ClearScriptVersion
{
public const string Triad = "7.3.2";
public const string Informational = "7.3.2";
public const string Triad = "7.3.3";
public const string Informational = "7.3.3";
}
}
6 changes: 3 additions & 3 deletions ClearScript/Properties/AssemblyInfo.V8.ICUData.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
[assembly: InternalsVisibleTo("ClearScript.V8")]

[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.3.2")]
[assembly: AssemblyFileVersion("7.3.2")]
[assembly: AssemblyInformationalVersion("7.3.2")]
[assembly: AssemblyVersion("7.3.3")]
[assembly: AssemblyFileVersion("7.3.3")]
[assembly: AssemblyInformationalVersion("7.3.3")]
6 changes: 3 additions & 3 deletions ClearScript/Properties/AssemblyInfo.V8.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
[assembly: InternalsVisibleTo("ClearScriptTest")]

[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.3.2")]
[assembly: AssemblyFileVersion("7.3.2")]
[assembly: AssemblyInformationalVersion("7.3.2")]
[assembly: AssemblyVersion("7.3.3")]
[assembly: AssemblyFileVersion("7.3.3")]
[assembly: AssemblyInformationalVersion("7.3.3")]
6 changes: 3 additions & 3 deletions ClearScript/Properties/AssemblyInfo.Windows.Core.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,6 @@
[assembly: InternalsVisibleTo("ClearScriptTest")]

[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.3.2")]
[assembly: AssemblyFileVersion("7.3.2")]
[assembly: AssemblyInformationalVersion("7.3.2")]
[assembly: AssemblyVersion("7.3.3")]
[assembly: AssemblyFileVersion("7.3.3")]
[assembly: AssemblyInformationalVersion("7.3.3")]
6 changes: 3 additions & 3 deletions ClearScript/Properties/AssemblyInfo.Windows.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@
[assembly: InternalsVisibleTo("ClearScriptTest")]

[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.3.2")]
[assembly: AssemblyFileVersion("7.3.2")]
[assembly: AssemblyInformationalVersion("7.3.2")]
[assembly: AssemblyVersion("7.3.3")]
[assembly: AssemblyFileVersion("7.3.3")]
[assembly: AssemblyInformationalVersion("7.3.3")]
Loading

0 comments on commit 2baf6b8

Please sign in to comment.