Version 7.4.1: Performance improvements: .NET method arguments and property/field values are now passed pre-decoded, eliminating decoding hops; property, field, and constructor bind caching accelerates re-invocation. Further refined HeapExpansionMultiplier handling; miscellaneous NuGet package updates. Tested with V8 11.2.214.13.

This commit is contained in:
ClearScript 2023-04-08 14:24:38 -04:00
Родитель 381b548c5b
Коммит 3661fca138
45 изменённых файлов: 2197 добавлений и 468 удалений

Просмотреть файл

@ -5,7 +5,7 @@
#pragma once
#define CLEARSCRIPT_VERSION_STRING "7.4.0"
#define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,4,0
#define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.4.0"
#define CLEARSCRIPT_VERSION_STRING "7.4.1"
#define CLEARSCRIPT_VERSION_COMMA_SEPARATED 7,4,1
#define CLEARSCRIPT_VERSION_STRING_INFORMATIONAL "7.4.1"
#define CLEARSCRIPT_FILE_FLAGS 0L

Просмотреть файл

@ -111,7 +111,7 @@ namespace Microsoft.ClearScript
var signature = new BindSignature(AccessContext, bindFlags, Target, name, typeArgs, bindArgs);
MethodBindResult result;
if (Engine.TryGetCachedBindResult(signature, out var rawResult))
if (Engine.TryGetCachedMethodBindResult(signature, out var rawResult))
{
result = MethodBindResult.Create(name, bindFlags, rawResult, Target, args);
}
@ -154,7 +154,7 @@ namespace Microsoft.ClearScript
}
}
Engine.CacheBindResult(signature, result.RawResult);
Engine.CacheMethodBindResult(signature, result.RawResult);
}
return result;
@ -422,7 +422,7 @@ namespace Microsoft.ClearScript
#region unit test support
internal static void ResetCoreBindCache()
internal static void ClearCoreBindCache()
{
coreBindCache.Clear();
Interlocked.Exchange(ref coreBindCount, 0);

Просмотреть файл

@ -1235,7 +1235,7 @@ namespace Microsoft.ClearScript
return DelegateFactory.CreateDelegate(Engine, args[0], specificType);
}
return specificType.CreateInstance(this, AccessContext, DefaultAccess, args, bindArgs);
return specificType.CreateInstance(this, Target, args, bindArgs);
}
}
@ -1255,7 +1255,7 @@ namespace Microsoft.ClearScript
return DelegateFactory.CreateDelegate(Engine, args[0], type);
}
return type.CreateInstance(this, AccessContext, DefaultAccess, args, bindArgs);
return type.CreateInstance(this, Target, args, bindArgs);
}
if (TargetDynamicMetaObject != null)
@ -1386,12 +1386,26 @@ namespace Microsoft.ClearScript
{
isCacheable = false;
var signature = new BindSignature(AccessContext, invokeFlags, Target, name, ArrayHelpers.GetEmptyArray<Type>(), bindArgs);
if (Engine.TryGetCachedPropertyGetBindResult(signature, out var boundMember))
{
if (boundMember is PropertyInfo boundProperty)
{
return GetHostPropertyWorker(boundProperty, boundProperty.GetMethod, args);
}
if (boundMember is FieldInfo boundField)
{
return GetHostFieldWorker(boundField, out isCacheable);
}
}
if (name == SpecialMemberNames.Default)
{
var defaultProperty = Target.Type.GetScriptableDefaultProperty(invokeFlags, args, bindArgs, AccessContext, DefaultAccess);
if (defaultProperty != null)
{
return GetHostProperty(defaultProperty, invokeFlags, args);
return GetHostProperty(signature, defaultProperty, invokeFlags, args);
}
if (TargetDynamicMetaObject != null)
@ -1476,7 +1490,7 @@ namespace Microsoft.ClearScript
var property = Target.Type.GetScriptableProperty(name, invokeFlags, args, bindArgs, AccessContext, DefaultAccess);
if (property != null)
{
return GetHostProperty(property, invokeFlags, args);
return GetHostProperty(signature, property, invokeFlags, args);
}
if (args.Length > 0)
@ -1494,9 +1508,7 @@ namespace Microsoft.ClearScript
var field = Target.Type.GetScriptableField(name, invokeFlags, AccessContext, DefaultAccess);
if (field != null)
{
var result = field.GetValue(Target.InvokeTarget);
isCacheable = (TargetDynamicMetaObject == null) && (field.IsLiteral || field.IsInitOnly);
return Engine.PrepareResult(result, field.FieldType, field.GetScriptMemberFlags(), false);
return GetHostField(signature, field, out isCacheable);
}
if (includeBoundMembers)
@ -1539,7 +1551,7 @@ namespace Microsoft.ClearScript
return Nonexistent.Value;
}
private object GetHostProperty(PropertyInfo property, BindingFlags invokeFlags, object[] args)
private object GetHostProperty(BindSignature signature, PropertyInfo property, BindingFlags invokeFlags, object[] args)
{
if (reflectionProperties.Contains(property, MemberComparer<PropertyInfo>.Instance))
{
@ -1569,11 +1581,46 @@ namespace Microsoft.ClearScript
throw new UnauthorizedAccessException("The property get method is unavailable or inaccessible");
}
var result = GetHostPropertyWorker(property, getMethod, args);
Engine.CachePropertyGetBindResult(signature, property);
return result;
}
private object GetHostPropertyWorker(PropertyInfo property, MethodInfo getMethod, object[] args)
{
return InvokeHelpers.InvokeMethod(this, getMethod, Target.InvokeTarget, args, property.GetScriptMemberFlags());
}
private object GetHostField(BindSignature signature, FieldInfo field, out bool isCacheable)
{
var result = GetHostFieldWorker(field, out isCacheable);
Engine.CachePropertyGetBindResult(signature, field);
return result;
}
private object GetHostFieldWorker(FieldInfo field, out bool isCacheable)
{
var result = field.GetValue(Target.InvokeTarget);
isCacheable = (TargetDynamicMetaObject == null) && (field.IsLiteral || field.IsInitOnly);
return Engine.PrepareResult(result, field.FieldType, field.GetScriptMemberFlags(), false);
}
private object SetHostProperty(string name, BindingFlags invokeFlags, object[] args, object[] bindArgs)
{
var signature = new BindSignature(AccessContext, invokeFlags, Target, name, ArrayHelpers.GetEmptyArray<Type>(), bindArgs);
if (Engine.TryGetCachedPropertySetBindResult(signature, out var boundMember))
{
if (boundMember is PropertyInfo boundProperty)
{
return SetHostPropertyWorker(boundProperty, boundProperty.SetMethod, args, bindArgs);
}
if (boundMember is FieldInfo boundField)
{
return SetHostFieldWorker(boundField, args);
}
}
if (name == SpecialMemberNames.Default)
{
if (args.Length < 1)
@ -1586,7 +1633,7 @@ namespace Microsoft.ClearScript
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, args, bindArgs);
return SetHostProperty(signature, defaultProperty, args, bindArgs);
}
if (args.Length < 2)
@ -1641,36 +1688,19 @@ namespace Microsoft.ClearScript
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, args, bindArgs);
return SetHostProperty(signature, property, args, bindArgs);
}
var field = Target.Type.GetScriptableField(name, invokeFlags, AccessContext, DefaultAccess);
if (field != null)
{
if (args.Length == 1)
{
if (field.IsLiteral || field.IsInitOnly || field.IsReadOnlyForScript(DefaultAccess))
{
throw new UnauthorizedAccessException("The field is read-only");
}
var value = args[0];
if (field.FieldType.IsAssignableFromValue(ref value))
{
field.SetValue(Target.InvokeTarget, value);
return value;
}
throw new ArgumentException("Invalid field assignment");
}
throw new InvalidOperationException("Invalid argument count");
return SetHostField(signature, field, args);
}
throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no suitable property or field named '{0}'", name));
}
private object SetHostProperty(PropertyInfo property, object[] args, object[] bindArgs)
private object SetHostProperty(BindSignature signature, PropertyInfo property, object[] args, object[] bindArgs)
{
var scriptAccess = property.GetScriptAccess(DefaultAccess);
if (scriptAccess == ScriptAccess.ReadOnly)
@ -1684,6 +1714,13 @@ namespace Microsoft.ClearScript
throw new UnauthorizedAccessException("The property set method is unavailable or inaccessible");
}
var result = SetHostPropertyWorker(property, setMethod, args, bindArgs);
Engine.CachePropertySetBindResult(signature, property);
return result;
}
private object SetHostPropertyWorker(PropertyInfo property, MethodInfo setMethod, object[] args, object[] bindArgs)
{
var value = args[args.Length - 1];
var argCount = args.Length - 1;
@ -1741,6 +1778,35 @@ namespace Microsoft.ClearScript
throw new ArgumentException("Invalid property assignment");
}
private object SetHostField(BindSignature signature, FieldInfo field, object[] args)
{
if (args.Length != 1)
{
throw new InvalidOperationException("Invalid argument count");
}
if (field.IsLiteral || field.IsInitOnly || field.IsReadOnlyForScript(DefaultAccess))
{
throw new UnauthorizedAccessException("The field is read-only");
}
var result = SetHostFieldWorker(field, args);
Engine.CachePropertySetBindResult(signature, field);
return result;
}
private object SetHostFieldWorker(FieldInfo field, object[] args)
{
var value = args[0];
if (field.FieldType.IsAssignableFromValue(ref value))
{
field.SetValue(Target.InvokeTarget, value);
return value;
}
throw new ArgumentException("Invalid field assignment");
}
private static object CreateScriptableEnumerator<T>(IEnumerable<T> enumerable)
{
return HostObject.Wrap(new ScriptableEnumeratorOnEnumerator<T>(enumerable.GetEnumerator()), typeof(IScriptableEnumerator<T>));

Просмотреть файл

@ -149,7 +149,7 @@ namespace Microsoft.ClearScript
private static class NullWrapper<T>
{
public static HostObject Value { get; } = new HostObject(null, typeof(T));
public static readonly HostObject Value = new HostObject(null, typeof(T));
}
// ReSharper restore UnusedMember.Local

Просмотреть файл

@ -51,6 +51,6 @@ namespace Microsoft.ClearScript
}
}
internal static CustomAttributeLoader DefaultCustomAttributeLoader { get; } = new CustomAttributeLoader();
internal static readonly CustomAttributeLoader DefaultCustomAttributeLoader = new CustomAttributeLoader();
}
}

Просмотреть файл

@ -18,15 +18,15 @@ using System.Runtime.InteropServices;
[assembly: InternalsVisibleTo("ClearScriptTest")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]
namespace Microsoft.ClearScript.Properties
{
internal static class ClearScriptVersion
{
public const string Triad = "7.4.0";
public const string Informational = "7.4.0";
public const string Triad = "7.4.1";
public const string Informational = "7.4.1";
}
}

Просмотреть файл

@ -15,6 +15,6 @@ using System.Runtime.InteropServices;
[assembly: InternalsVisibleTo("ClearScript.V8")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -15,6 +15,6 @@ using System.Runtime.InteropServices;
[assembly: InternalsVisibleTo("ClearScriptTest")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -16,6 +16,6 @@ using System.Runtime.InteropServices;
[assembly: InternalsVisibleTo("ClearScriptTest")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -15,6 +15,6 @@ using System.Runtime.InteropServices;
[assembly: InternalsVisibleTo("ClearScriptTest")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -143,7 +143,7 @@ namespace Microsoft.ClearScript
if (newExtensionMethodTable != extensionMethodTable)
{
extensionMethodTable = newExtensionMethodTable;
bindCache.Clear();
ClearMethodBindCache();
OnAccessSettingsChanged();
}
});
@ -626,6 +626,8 @@ namespace Microsoft.ClearScript
internal virtual void OnAccessSettingsChanged()
{
ClearConstructorBindCache();
ClearPropertyBindCache();
}
#endregion
@ -760,7 +762,7 @@ namespace Microsoft.ClearScript
{
if (extensionMethodTable.ProcessType(type, AccessContext, DefaultAccess))
{
bindCache.Clear();
ClearMethodBindCache();
}
}
}
@ -777,18 +779,77 @@ namespace Microsoft.ClearScript
#endregion
#region bind cache
#region constructor bind cache
private readonly Dictionary<BindSignature, object> bindCache = new Dictionary<BindSignature, object>();
private readonly Dictionary<BindSignature, ConstructorInfo> constructorBindCache = new Dictionary<BindSignature, ConstructorInfo>();
internal void CacheBindResult(BindSignature signature, object result)
internal void CacheConstructorBindResult(BindSignature signature, ConstructorInfo result)
{
bindCache.Add(signature, result);
constructorBindCache.Add(signature, result);
}
internal bool TryGetCachedBindResult(BindSignature signature, out object result)
internal bool TryGetCachedConstructorBindResult(BindSignature signature, out ConstructorInfo result)
{
return bindCache.TryGetValue(signature, out result);
return constructorBindCache.TryGetValue(signature, out result);
}
private void ClearConstructorBindCache()
{
constructorBindCache.Clear();
}
#endregion
#region method bind cache
private readonly Dictionary<BindSignature, object> methodBindCache = new Dictionary<BindSignature, object>();
internal void CacheMethodBindResult(BindSignature signature, object result)
{
methodBindCache.Add(signature, result);
}
internal bool TryGetCachedMethodBindResult(BindSignature signature, out object result)
{
return methodBindCache.TryGetValue(signature, out result);
}
private void ClearMethodBindCache()
{
methodBindCache.Clear();
}
#endregion
#region property bind cache
private readonly Dictionary<BindSignature, MemberInfo> propertyGetBindCache = new Dictionary<BindSignature, MemberInfo>();
private readonly Dictionary<BindSignature, MemberInfo> propertySetBindCache = new Dictionary<BindSignature, MemberInfo>();
internal void CachePropertyGetBindResult(BindSignature signature, MemberInfo property)
{
propertyGetBindCache.Add(signature, property);
}
internal bool TryGetCachedPropertyGetBindResult(BindSignature signature, out MemberInfo property)
{
return propertyGetBindCache.TryGetValue(signature, out property);
}
internal void CachePropertySetBindResult(BindSignature signature, MemberInfo property)
{
propertySetBindCache.Add(signature, property);
}
internal bool TryGetCachedPropertySetBindResult(BindSignature signature, out MemberInfo property)
{
return propertySetBindCache.TryGetValue(signature, out property);
}
private void ClearPropertyBindCache()
{
propertyGetBindCache.Clear();
propertySetBindCache.Clear();
}
#endregion

Просмотреть файл

@ -47,7 +47,7 @@ namespace Microsoft.ClearScript.Util
private static class EmptyArray<T>
{
public static T[] Value { get; } = new T[0];
public static readonly T[] Value = new T[0];
}
#endregion

Просмотреть файл

@ -8,7 +8,7 @@ namespace Microsoft.ClearScript.Util
{
internal sealed class MemberComparer<T> : EqualityComparer<T> where T : MemberInfo
{
public static MemberComparer<T> Instance { get; } = new MemberComparer<T>();
public static readonly MemberComparer<T> Instance = new MemberComparer<T>();
private MemberComparer()
{

Просмотреть файл

@ -5,8 +5,8 @@ namespace Microsoft.ClearScript.Util
{
internal static class SpecialMemberNames
{
public static string Default = MiscHelpers.GetDispIDName(SpecialDispIDs.Default);
public static string NewEnum = MiscHelpers.GetDispIDName(SpecialDispIDs.NewEnum);
public static string NewAsyncEnum = MiscHelpers.GetDispIDName(SpecialDispIDs.NewAsyncEnum);
public static readonly string Default = MiscHelpers.GetDispIDName(SpecialDispIDs.Default);
public static readonly string NewEnum = MiscHelpers.GetDispIDName(SpecialDispIDs.NewEnum);
public static readonly string NewAsyncEnum = MiscHelpers.GetDispIDName(SpecialDispIDs.NewAsyncEnum);
}
}

Просмотреть файл

@ -5,6 +5,6 @@ namespace Microsoft.ClearScript.Util
{
internal static class SpecialParamNames
{
public static string This = MiscHelpers.GetDispIDName(SpecialDispIDs.This);
public static readonly string This = MiscHelpers.GetDispIDName(SpecialDispIDs.This);
}
}

Просмотреть файл

@ -485,7 +485,7 @@ namespace Microsoft.ClearScript.Util
return type.InvokeMember(string.Empty, BindingFlags.CreateInstance | BindingFlags.Instance | (flags & ~BindingFlags.Static), null, null, args, CultureInfo.InvariantCulture);
}
public static object CreateInstance(this Type type, IHostInvokeContext invokeContext, Type accessContext, ScriptAccess defaultAccess, object[] args, object[] bindArgs)
public static object CreateInstance(this Type type, IHostInvokeContext invokeContext, HostTarget target, object[] args, object[] bindArgs)
{
if (type.IsCOMObject || (type.IsValueType && (args.Length < 1)))
{
@ -493,19 +493,26 @@ namespace Microsoft.ClearScript.Util
}
const BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
var candidates = type.GetConstructors(flags).Where(testConstructor => testConstructor.IsAccessible(accessContext) && !testConstructor.IsBlockedFromScript(defaultAccess)).ToArray();
var signature = new BindSignature(invokeContext.AccessContext, flags, target, type.TypeHandle.Value.ToString(), ArrayHelpers.GetEmptyArray<Type>(), bindArgs);
if (invokeContext.Engine.TryGetCachedConstructorBindResult(signature, out var boundConstructor))
{
return InvokeHelpers.InvokeConstructor(invokeContext, boundConstructor, args);
}
var candidates = type.GetConstructors(flags).Where(testConstructor => testConstructor.IsAccessible(invokeContext.AccessContext) && !testConstructor.IsBlockedFromScript(invokeContext.DefaultAccess)).ToArray();
if (candidates.Length < 1)
{
throw new MissingMethodException(MiscHelpers.FormatInvariant("Type '{0}' has no constructor that matches the specified arguments", type.GetFullFriendlyName()));
}
ConstructorInfo constructor = BindToMember(candidates, flags, args, bindArgs);
var constructor = BindToMember(candidates, flags, args, bindArgs);
if (constructor == null)
{
throw new MissingMethodException(MiscHelpers.FormatInvariant("Type '{0}' has no constructor that matches the specified arguments", type.GetFullFriendlyName()));
}
invokeContext.Engine.CacheConstructorBindResult(signature, constructor);
return InvokeHelpers.InvokeConstructor(invokeContext, constructor, args);
}
@ -1171,7 +1178,7 @@ namespace Microsoft.ClearScript.Util
private sealed class PropertySignatureComparer : IEqualityComparer<PropertyInfo>
{
public static PropertySignatureComparer Instance { get; } = new PropertySignatureComparer();
public static readonly PropertySignatureComparer Instance = new PropertySignatureComparer();
#region IEqualityComparer<PropertyInfo> implementation

Просмотреть файл

@ -110,7 +110,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
void V8Value_SetBigInt(V8Value.Ptr pV8Value, int signBit, byte[] bytes);
void V8Value_SetV8Object(V8Value.Ptr pV8Value, V8Object.Handle hObject, V8Value.Subtype subtype, V8Value.Flags flags);
void V8Value_SetHostObject(V8Value.Ptr pV8Value, IntPtr pObject);
V8Value.Type V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle);
void V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded);
void V8Value_Delete(V8Value.Ptr pV8Value);
#endregion

Просмотреть файл

@ -1,4 +1,4 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
using System;
@ -897,49 +897,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
public static object Get(Ptr pV8Value)
{
var intValue = 0;
var uintValue = 0U;
var doubleValue = 0D;
var ptrOrHandle = IntPtr.Zero;
switch (V8SplitProxyNative.InvokeNoThrow(instance => instance.V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle)))
{
case Type.Nonexistent:
return Nonexistent.Value;
case Type.Null:
return DBNull.Value;
case Type.Boolean:
return intValue != 0;
case Type.Number:
return doubleValue;
case Type.Int32:
return intValue;
case Type.UInt32:
return uintValue;
case Type.String:
return Marshal.PtrToStringUni(ptrOrHandle, intValue);
case Type.DateTime:
return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) + TimeSpan.FromMilliseconds(doubleValue);
case Type.BigInt:
return TryGetBigInteger(intValue, (int)uintValue, ptrOrHandle, out var result) ? (object)result : null;
case Type.V8Object:
return new V8ObjectImpl((V8Object.Handle)ptrOrHandle, (Subtype)(uintValue & 0xFFFFU), (Flags)(uintValue >> 16), intValue);
case Type.HostObject:
return V8ProxyHelpers.GetHostObject(ptrOrHandle);
default:
return null;
}
var decoded = default(Decoded);
V8SplitProxyNative.InvokeNoThrow(instance => instance.V8Value_Decode(pV8Value, out decoded));
return decoded.Get();
}
private static bool TryGetBigInteger(int signBit, int wordCount, IntPtr pWords, out BigInteger result)
@ -1039,7 +999,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
#region Nested type: Type
public enum Type : ushort
public enum Type : byte
{
// IMPORTANT: maintain bitwise equivalence with native enum V8Value::Type
Nonexistent,
@ -1060,7 +1020,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
#region Nested type: Subtype
public enum Subtype : ushort
public enum Subtype : byte
{
// IMPORTANT: maintain bitwise equivalence with native enum V8Value::Subtype
None,
@ -1101,7 +1061,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
#region Nested type: Ptr
internal readonly struct Ptr
public readonly struct Ptr
{
private readonly IntPtr bits;
@ -1124,8 +1084,113 @@ namespace Microsoft.ClearScript.V8.SplitProxy
}
#endregion
}
#region Nested type: Decoded
[StructLayout(LayoutKind.Explicit)]
public struct Decoded
{
// IMPORTANT: maintain bitwise equivalence with native struct V8Value::Decoded
[FieldOffset(0)] public Type Type;
[FieldOffset(1)] public Subtype Subtype;
[FieldOffset(2)] public Flags Flags;
[FieldOffset(2)] public short SignBit;
[FieldOffset(4)] public int Length;
[FieldOffset(4)] public int IdentityHash;
[FieldOffset(8)] public int Int32Value;
[FieldOffset(8)] public uint UInt32Value;
[FieldOffset(8)] public double DoubleValue;
[FieldOffset(8)] public IntPtr PtrOrHandle;
public object Get()
{
switch (Type)
{
case Type.Nonexistent:
return Nonexistent.Value;
case Type.Null:
return DBNull.Value;
case Type.Boolean:
return Int32Value != 0;
case Type.Number:
return DoubleValue;
case Type.Int32:
return Int32Value;
case Type.UInt32:
return UInt32Value;
case Type.String:
return Marshal.PtrToStringUni(PtrOrHandle, Length);
case Type.DateTime:
return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc) + TimeSpan.FromMilliseconds(DoubleValue);
case Type.BigInt:
return TryGetBigInteger(SignBit, Length, PtrOrHandle, out var result) ? (object)result : null;
case Type.V8Object:
return new V8ObjectImpl((V8Object.Handle)PtrOrHandle, Subtype, Flags, IdentityHash);
case Type.HostObject:
return V8ProxyHelpers.GetHostObject(PtrOrHandle);
default:
return null;
}
}
public static unsafe object Get(Ptr pValues, int index)
{
return ((Decoded*)(IntPtr)pValues + index)->Get();
}
public static object[] ToArray(int count, Ptr pValues)
{
var array = new object[count];
for (var index = 0; index < count; index++)
{
array[index] = Get(pValues, index);
}
return array;
}
#region Nested type: Ptr
// ReSharper disable once MemberHidesStaticFromOuterClass
public readonly struct Ptr
{
private readonly IntPtr bits;
private Ptr(IntPtr bits) => this.bits = bits;
public static readonly Ptr Null = new Ptr(IntPtr.Zero);
public static bool operator ==(Ptr left, Ptr right) => left.bits == right.bits;
public static bool operator !=(Ptr left, Ptr right) => left.bits != right.bits;
public static explicit operator IntPtr(Ptr ptr) => ptr.bits;
public static explicit operator Ptr(IntPtr bits) => new Ptr(bits);
#region Object overrides
public override bool Equals(object obj) => (obj is Ptr ptr) && (this == ptr);
public override int GetHashCode() => bits.GetHashCode();
#endregion
}
#endregion
}
#endregion
}
internal static class V8CpuProfile
{
public static void ProcessProfile(V8Entity.Handle hEntity, Ptr pProfile, V8.V8CpuProfile profile)

Просмотреть файл

@ -153,12 +153,12 @@ namespace Microsoft.ClearScript.V8.SplitProxy
get
{
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
static void Thunk(IntPtr pObject, StdString.Ptr pName, V8Value.Ptr pValue)
static void Thunk(IntPtr pObject, StdString.Ptr pName, V8Value.Decoded.Ptr pValue)
{
SetHostObjectNamedProperty(pObject, pName, pValue);
}
delegate* unmanaged[Stdcall]<IntPtr, StdString.Ptr, V8Value.Ptr, void> pThunk = &Thunk;
delegate* unmanaged[Stdcall]<IntPtr, StdString.Ptr, V8Value.Decoded.Ptr, void> pThunk = &Thunk;
return (IntPtr)pThunk;
}
}
@ -183,12 +183,12 @@ namespace Microsoft.ClearScript.V8.SplitProxy
get
{
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
static void Thunk(IntPtr pObject, int index, V8Value.Ptr pValue)
static void Thunk(IntPtr pObject, int index, V8Value.Decoded.Ptr pValue)
{
SetHostObjectIndexedProperty(pObject, index, pValue);
}
delegate* unmanaged[Stdcall]<IntPtr, int, V8Value.Ptr, void> pThunk = &Thunk;
delegate* unmanaged[Stdcall]<IntPtr, int, V8Value.Decoded.Ptr, void> pThunk = &Thunk;
return (IntPtr)pThunk;
}
}
@ -198,12 +198,12 @@ namespace Microsoft.ClearScript.V8.SplitProxy
get
{
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
static void Thunk(IntPtr pObject, StdBool asConstructor, StdV8ValueArray.Ptr pArgs, V8Value.Ptr pResult)
static void Thunk(IntPtr pObject, StdBool asConstructor, int argCount, V8Value.Decoded.Ptr pArgs, V8Value.Ptr pResult)
{
InvokeHostObject(pObject, asConstructor, pArgs, pResult);
InvokeHostObject(pObject, asConstructor, argCount, pArgs, pResult);
}
delegate* unmanaged[Stdcall]<IntPtr, StdBool, StdV8ValueArray.Ptr, V8Value.Ptr, void> pThunk = &Thunk;
delegate* unmanaged[Stdcall]<IntPtr, StdBool, int, V8Value.Decoded.Ptr, V8Value.Ptr, void> pThunk = &Thunk;
return (IntPtr)pThunk;
}
}
@ -213,12 +213,12 @@ namespace Microsoft.ClearScript.V8.SplitProxy
get
{
[UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvStdcall) })]
static void Thunk(IntPtr pObject, StdString.Ptr pName, StdV8ValueArray.Ptr pArgs, V8Value.Ptr pResult)
static void Thunk(IntPtr pObject, StdString.Ptr pName, int argCount, V8Value.Decoded.Ptr pArgs, V8Value.Ptr pResult)
{
InvokeHostObjectMethod(pObject, pName, pArgs, pResult);
InvokeHostObjectMethod(pObject, pName, argCount, pArgs, pResult);
}
delegate* unmanaged[Stdcall]<IntPtr, StdString.Ptr, StdV8ValueArray.Ptr, V8Value.Ptr, void> pThunk = &Thunk;
delegate* unmanaged[Stdcall]<IntPtr, StdString.Ptr, int, V8Value.Decoded.Ptr, V8Value.Ptr, void> pThunk = &Thunk;
return (IntPtr)pThunk;
}
}

Просмотреть файл

@ -190,7 +190,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
private delegate void RawSetHostObjectNamedProperty(
[In] IntPtr pObject,
[In] StdString.Ptr pName,
[In] V8Value.Ptr pValue
[In] V8Value.Decoded.Ptr pValue
);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
@ -217,7 +217,7 @@ namespace Microsoft.ClearScript.V8.SplitProxy
private delegate void RawSetHostObjectIndexedProperty(
[In] IntPtr pObject,
[In] int index,
[In] V8Value.Ptr pValue
V8Value.Decoded.Ptr pValue
);
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
@ -237,7 +237,8 @@ namespace Microsoft.ClearScript.V8.SplitProxy
private delegate void RawInvokeHostObject(
[In] IntPtr pObject,
[In] [MarshalAs(UnmanagedType.I1)] bool asConstructor,
[In] StdV8ValueArray.Ptr pArgs,
[In] int argCount,
[In] V8Value.Decoded.Ptr pArgs,
[In] V8Value.Ptr pResult
);
@ -245,7 +246,8 @@ namespace Microsoft.ClearScript.V8.SplitProxy
private delegate void RawInvokeHostObjectMethod(
[In] IntPtr pObject,
[In] StdString.Ptr pName,
[In] StdV8ValueArray.Ptr pArgs,
[In] int argCount,
[In] V8Value.Decoded.Ptr pArgs,
[In] V8Value.Ptr pResult
);
@ -636,11 +638,11 @@ namespace Microsoft.ClearScript.V8.SplitProxy
}
}
private static void SetHostObjectNamedProperty(IntPtr pObject, StdString.Ptr pName, V8Value.Ptr pValue)
private static void SetHostObjectNamedProperty(IntPtr pObject, StdString.Ptr pName, V8Value.Decoded.Ptr pValue)
{
try
{
V8ProxyHelpers.SetHostObjectProperty(pObject, StdString.GetValue(pName), V8Value.Get(pValue));
V8ProxyHelpers.SetHostObjectProperty(pObject, StdString.GetValue(pName), V8Value.Decoded.Get(pValue, 0));
}
catch (Exception exception)
{
@ -689,11 +691,11 @@ namespace Microsoft.ClearScript.V8.SplitProxy
}
}
private static void SetHostObjectIndexedProperty(IntPtr pObject, int index, V8Value.Ptr pValue)
private static void SetHostObjectIndexedProperty(IntPtr pObject, int index, V8Value.Decoded.Ptr pValue)
{
try
{
V8ProxyHelpers.SetHostObjectProperty(pObject, index, V8Value.Get(pValue));
V8ProxyHelpers.SetHostObjectProperty(pObject, index, V8Value.Decoded.Get(pValue, 0));
}
catch (Exception exception)
{
@ -730,11 +732,11 @@ namespace Microsoft.ClearScript.V8.SplitProxy
StdInt32Array.CopyFromArray(pIndices, indices);
}
private static void InvokeHostObject(IntPtr pObject, bool asConstructor, StdV8ValueArray.Ptr pArgs, V8Value.Ptr pResult)
private static void InvokeHostObject(IntPtr pObject, bool asConstructor, int argCount, V8Value.Decoded.Ptr pArgs, V8Value.Ptr pResult)
{
try
{
V8Value.Set(pResult, V8ProxyHelpers.InvokeHostObject(pObject, asConstructor, StdV8ValueArray.ToArray(pArgs)));
V8Value.Set(pResult, V8ProxyHelpers.InvokeHostObject(pObject, asConstructor, V8Value.Decoded.ToArray(argCount, pArgs)));
}
catch (Exception exception)
{
@ -742,11 +744,11 @@ namespace Microsoft.ClearScript.V8.SplitProxy
}
}
private static void InvokeHostObjectMethod(IntPtr pObject, StdString.Ptr pName, StdV8ValueArray.Ptr pArgs, V8Value.Ptr pResult)
private static void InvokeHostObjectMethod(IntPtr pObject, StdString.Ptr pName, int argCount, V8Value.Decoded.Ptr pArgs, V8Value.Ptr pResult)
{
try
{
V8Value.Set(pResult, V8ProxyHelpers.InvokeHostObjectMethod(pObject, StdString.GetValue(pName), StdV8ValueArray.ToArray(pArgs)));
V8Value.Set(pResult, V8ProxyHelpers.InvokeHostObjectMethod(pObject, StdString.GetValue(pName), V8Value.Decoded.ToArray(argCount, pArgs)));
}
catch (Exception exception)
{

Просмотреть файл

@ -378,9 +378,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -1440,12 +1440,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("<#= fileName #>", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("<#= fileName #>", CallingConvention = CallingConvention.StdCall)]

Просмотреть файл

@ -420,9 +420,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -1482,12 +1482,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-x86.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-x86.dll", CallingConvention = CallingConvention.StdCall)]
@ -2482,9 +2479,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -3544,12 +3541,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-x64.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-x64.dll", CallingConvention = CallingConvention.StdCall)]
@ -4544,9 +4538,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -5606,12 +5600,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-arm64.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-arm64.dll", CallingConvention = CallingConvention.StdCall)]
@ -6606,9 +6597,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -7668,12 +7659,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.linux-x64.so", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.linux-x64.so", CallingConvention = CallingConvention.StdCall)]
@ -8668,9 +8656,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -9730,12 +9718,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.linux-arm64.so", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.linux-arm64.so", CallingConvention = CallingConvention.StdCall)]
@ -10730,9 +10715,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -11792,12 +11777,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.linux-arm.so", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.linux-arm.so", CallingConvention = CallingConvention.StdCall)]
@ -12792,9 +12774,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -13854,12 +13836,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.osx-x64.dylib", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.osx-x64.dylib", CallingConvention = CallingConvention.StdCall)]
@ -14854,9 +14833,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -15916,12 +15895,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.osx-arm64.dylib", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.osx-arm64.dylib", CallingConvention = CallingConvention.StdCall)]

Просмотреть файл

@ -376,9 +376,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -1438,12 +1438,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-x86.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-x86.dll", CallingConvention = CallingConvention.StdCall)]
@ -2438,9 +2435,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -3500,12 +3497,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-x64.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-x64.dll", CallingConvention = CallingConvention.StdCall)]
@ -4500,9 +4494,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
V8Value_SetHostObject(pV8Value, pObject);
}
V8Value.Type IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out int intValue, out uint uintValue, out double doubleValue, out IntPtr ptrOrHandle)
void IV8SplitProxyNative.V8Value_Decode(V8Value.Ptr pV8Value, out V8Value.Decoded decoded)
{
return V8Value_Decode(pV8Value, out intValue, out uintValue, out doubleValue, out ptrOrHandle);
V8Value_Decode(pV8Value, out decoded);
}
void IV8SplitProxyNative.V8Value_Delete(V8Value.Ptr pV8Value)
@ -5562,12 +5556,9 @@ namespace Microsoft.ClearScript.V8.SplitProxy
);
[DllImport("ClearScriptV8.win-arm64.dll", CallingConvention = CallingConvention.StdCall)]
private static extern V8Value.Type V8Value_Decode(
private static extern void V8Value_Decode(
[In] V8Value.Ptr pV8Value,
[Out] out int intValue,
[Out] out uint uintValue,
[Out] out double doubleValue,
[Out] out IntPtr ptrOrHandle
[Out] out V8Value.Decoded decoded
);
[DllImport("ClearScriptV8.win-arm64.dll", CallingConvention = CallingConvention.StdCall)]

Просмотреть файл

@ -847,9 +847,9 @@ namespace Microsoft.ClearScript.V8
#region internal members
internal IUniqueNameManager DocumentNameManager { get; } = new UniqueFileNameManager();
internal readonly UniqueFileNameManager DocumentNameManager = new UniqueFileNameManager();
internal HostItemCollateral HostItemCollateral { get; } = new HostItemCollateral();
internal readonly HostItemCollateral HostItemCollateral = new HostItemCollateral();
internal V8IsolateProxy IsolateProxy
{

Просмотреть файл

@ -22,7 +22,7 @@ namespace Microsoft.ClearScript.Test
var burn = (args.Length == 2) && (args[0] == "-b") && uint.TryParse(args[1], out choice) && (choice >= 1) && (choice <= 2);
Console.Clear();
if (!burn) Console.WriteLine("ClearScript Benchmarks ({0}, {1}, {2} {3})\n", RuntimeInformation.FrameworkDescription, RuntimeInformation.OSDescription, RuntimeInformation.ProcessArchitecture, flavor);
if (!burn) Console.WriteLine("ClearScript Benchmarks ({0}, {1}, {2} {3})\n", RuntimeInformation.FrameworkDescription.Trim(), RuntimeInformation.OSDescription.Trim(), RuntimeInformation.ProcessArchitecture, flavor);
var count = 0UL;

Просмотреть файл

@ -23,7 +23,7 @@ namespace Microsoft.ClearScript.Test
var burn = (args.Length == 2) && (args[0] == "-b") && uint.TryParse(args[1], out choice) && (choice >= 1) && (choice <= 3);
Console.Clear();
if (!burn) Console.WriteLine("ClearScript Benchmarks ({0}, {1}, {2} {3})\n", RuntimeInformation.FrameworkDescription, RuntimeInformation.OSDescription, RuntimeInformation.ProcessArchitecture, flavor);
if (!burn) Console.WriteLine("ClearScript Benchmarks ({0}, {1}, {2} {3})\n", RuntimeInformation.FrameworkDescription.Trim(), RuntimeInformation.OSDescription.Trim(), RuntimeInformation.ProcessArchitecture, flavor);
var count = 0UL;

Просмотреть файл

@ -11,6 +11,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("(c) Microsoft Corporation")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -6,12 +6,19 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using Microsoft.ClearScript.V8;
namespace Microsoft.ClearScript.Test
{
internal static class ClearScriptConsole
{
#if DEBUG
private const string flavor = "Debug";
#else
private const string flavor = "Release";
#endif
public static void Main(string[] args)
{
if ((args.Length == 2) && (args[0] == "-t"))
@ -20,6 +27,8 @@ namespace Microsoft.ClearScript.Test
return;
}
Console.WriteLine("ClearScript Console ({0}, {1}, {2} {3})", RuntimeInformation.FrameworkDescription.Trim(), RuntimeInformation.OSDescription.Trim(), RuntimeInformation.ProcessArchitecture, flavor);
using (var engine = new V8ScriptEngine(nameof(ClearScriptConsole), V8ScriptEngineFlags.EnableDebugging))
{
engine.AddHostObject("host", new ExtendedHostFunctions());

Просмотреть файл

@ -11,6 +11,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("(c) Microsoft Corporation")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -299,7 +299,7 @@ namespace Microsoft.ClearScript.Test
[TestMethod, TestCategory("BugFix")]
public void BugFix_CoreBindCache()
{
HostItem.ResetCoreBindCache();
HostItem.ClearCoreBindCache();
engine.Dispose();
for (var i = 0; i < 10; i++)

Просмотреть файл

@ -11,6 +11,6 @@ using System.Runtime.InteropServices;
[assembly: AssemblyCopyright("(c) Microsoft Corporation")]
[assembly: ComVisible(false)]
[assembly: AssemblyVersion("7.4.0")]
[assembly: AssemblyFileVersion("7.4.0")]
[assembly: AssemblyInformationalVersion("7.4.0")]
[assembly: AssemblyVersion("7.4.1")]
[assembly: AssemblyFileVersion("7.4.1")]
[assembly: AssemblyInformationalVersion("7.4.1")]

Просмотреть файл

@ -4613,6 +4613,39 @@ namespace Microsoft.ClearScript.Test
Assert.AreEqual((JavaScriptObjectKind.TypedArray, JavaScriptObjectFlags.Shared), Inspect("new Float64Array(new SharedArrayBuffer(256))"));
}
[TestMethod, TestCategory("V8ScriptEngine")]
public void V8ScriptEngine_ConstructorBinding()
{
engine.AddHostType("Foo", typeof(ConstructorBindingTest));
dynamic test = engine.Evaluate(@"(function(length) {
const a = new Array(length);
for (let i = 0; i < length; ++i)
a[i] = new Foo(123);
const b = new Array(length);
for (let i = 0; i < length; ++i)
b[i] = new Foo('qux');
const c = new Array(length);
for (let i = 0; i < length; ++i)
c[i] = new Foo(456.789);
return { a, b, c };
})");
const int length = 1000;
var result = (IDictionary<string, object>)test(length);
var a = (IList<object>)result["a"];
var b = (IList<object>)result["b"];
var c = (IList<object>)result["c"];
Assert.AreEqual(length, a.Count);
Assert.AreEqual(length, b.Count);
Assert.AreEqual(length, c.Count);
Assert.IsTrue(a.All(value => ((ConstructorBindingTest)value).A == 123));
Assert.IsTrue(b.All(value => ((ConstructorBindingTest)value).A == 456));
Assert.IsTrue(c.All(value => ((ConstructorBindingTest)value).A == 789));
}
// ReSharper restore InconsistentNaming
#endregion
@ -4958,6 +4991,28 @@ namespace Microsoft.ClearScript.Test
// ReSharper restore UnusedMember.Local
public class ConstructorBindingTest
{
public int A;
public string B;
public double C;
public ConstructorBindingTest(int a, string b = "foo", double c = 456.789)
{
A = a; B = b; C = c;
}
public ConstructorBindingTest(string b, int a = 456, double c = 789.987)
{
A = a; B = b; C = c;
}
public ConstructorBindingTest(double c, int a = 789, string b = "bar")
{
A = a; B = b; C = c;
}
}
#endregion
}
}

Просмотреть файл

@ -47,7 +47,9 @@ public:
virtual void SetProperty(void* pvObject, const StdString& name, const V8Value& value) override
{
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(SetHostObjectNamedProperty, pvObject, name, value);
V8Value::Decoded decodedValue;
value.Decode(decodedValue);
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(SetHostObjectNamedProperty, pvObject, name, decodedValue);
}
virtual bool DeleteProperty(void* pvObject, const StdString& name) override
@ -69,7 +71,9 @@ public:
virtual void SetProperty(void* pvObject, int32_t index, const V8Value& value) override
{
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(SetHostObjectIndexedProperty, pvObject, index, value);
V8Value::Decoded decodedValue;
value.Decode(decodedValue);
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(SetHostObjectIndexedProperty, pvObject, index, decodedValue);
}
virtual bool DeleteProperty(void* pvObject, int32_t index) override
@ -85,14 +89,54 @@ public:
virtual V8Value Invoke(void* pvObject, bool asConstructor, const std::vector<V8Value>& args) override
{
V8Value result(V8Value::Nonexistent);
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObject, pvObject, asConstructor, args, result);
auto argCount = args.size();
if (argCount < 1)
{
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObject, pvObject, asConstructor, 0, nullptr, result);
}
else
{
auto pArgs = args.data();
auto upDecodedArgs = std::make_unique<V8Value::Decoded[]>(argCount);
auto pDecodedArgs = upDecodedArgs.get();
for (size_t index = 0; index < argCount; index++)
{
pArgs[index].Decode(pDecodedArgs[index]);
}
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObject, pvObject, asConstructor, static_cast<int32_t>(argCount), pDecodedArgs, result);
}
return result;
}
virtual V8Value InvokeMethod(void* pvObject, const StdString& name, const std::vector<V8Value>& args) override
{
V8Value result(V8Value::Nonexistent);
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObjectMethod, pvObject, name, args, result);
auto argCount = args.size();
if (argCount < 1)
{
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObjectMethod, pvObject, name, 0, nullptr, result);
}
else
{
auto pArgs = args.data();
auto upDecodedArgs = std::make_unique<V8Value::Decoded[]>(argCount);
auto pDecodedArgs = upDecodedArgs.get();
for (size_t index = 0; index < argCount; index++)
{
pArgs[index].Decode(pDecodedArgs[index]);
}
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(InvokeHostObjectMethod, pvObject, name, static_cast<int32_t>(argCount), pDecodedArgs, result);
}
return result;
}

Просмотреть файл

@ -2109,28 +2109,15 @@ void V8IsolateImpl::FlushContext(V8ContextImpl& contextImpl)
size_t V8IsolateImpl::HeapExpansionCallback(void* pvData, size_t currentLimit, size_t /*initialLimit*/)
{
const size_t minBump = 1024 * 1024;
if (pvData)
{
auto multiplier = static_cast<const V8IsolateImpl*>(pvData)->m_HeapExpansionMultiplier;
if (multiplier > 1.0)
{
multiplier = std::max(multiplier, 1.001);
const size_t minBump = 1024 * 1024;
auto newLimit = static_cast<double>(currentLimit);
while ((static_cast<size_t>(newLimit) - currentLimit) < minBump)
{
auto tempLimit = multiplier * newLimit;
if (tempLimit > newLimit)
{
newLimit = tempLimit;
continue;
}
break;
}
return std::max(static_cast<size_t>(newLimit), currentLimit);
auto newLimit = static_cast<size_t>(static_cast<double>(currentLimit) * multiplier);
return std::max(newLimit, currentLimit + minBump);
}
}

Просмотреть файл

@ -41,17 +41,17 @@
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectNamedProperty, void* pvObject, const StdString& name, V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectNamedPropertyWithCacheability, void* pvObject, const StdString& name, V8Value& value, StdBool& isCacheable) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectNamedProperty, void* pvObject, const StdString& name, const V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectNamedProperty, void* pvObject, const StdString& name, const V8Value::Decoded& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, DeleteHostObjectNamedProperty, void* pvObject, const StdString& name) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectPropertyNames, void* pvObject, std::vector<StdString>& names) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectIndexedProperty, void* pvObject, int32_t index, V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectIndexedProperty, void* pvObject, int32_t index, const V8Value& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, SetHostObjectIndexedProperty, void* pvObject, int32_t index, const V8Value::Decoded& value) \
V8_SPLIT_PROXY_MANAGED_METHOD(StdBool, DeleteHostObjectIndexedProperty, void* pvObject, int32_t index) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectPropertyIndices, void* pvObject, std::vector<int32_t>& indices) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObject, void* pvObject, StdBool asConstructor, const std::vector<V8Value>& args, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObjectMethod, void* pvObject, const StdString& name, const std::vector<V8Value>& args, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObject, void* pvObject, StdBool asConstructor, int32_t argCount, const V8Value::Decoded* pArgs, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, InvokeHostObjectMethod, void* pvObject, const StdString& name, int32_t argCount, const V8Value::Decoded* pArgs, V8Value& result) \
\
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectEnumerator, void* pvObject, V8Value& result) \
V8_SPLIT_PROXY_MANAGED_METHOD(void, GetHostObjectAsyncEnumerator, void* pvObject, V8Value& result) \

Просмотреть файл

@ -65,19 +65,6 @@ static void ProcessCpuProfile(const v8::CpuProfile& profile, void* pvAction)
}
}
//-----------------------------------------------------------------------------
static uint32_t PackV8ObjectInfo(V8Value::Subtype subtype, V8Value::Flags flags)
{
static_assert(sizeof(subtype) == 2);
uint32_t subtypeBits = static_cast<std::underlying_type_t<V8Value::Subtype>>(subtype);
static_assert(sizeof(flags) == 2);
uint32_t flagsBits = static_cast<std::underlying_type_t<V8Value::Flags>>(flags);
return subtypeBits | (flagsBits << 16);
}
//-----------------------------------------------------------------------------
// V8Exception implementation
//-----------------------------------------------------------------------------
@ -119,6 +106,57 @@ void V8EntityHandleBase::ScheduleInvalidOperationException(const StdString& mess
V8_SPLIT_PROXY_MANAGED_INVOKE_VOID(ScheduleInvalidOperationException, message);
}
//-----------------------------------------------------------------------------
// V8Value (implementation)
//-----------------------------------------------------------------------------
void V8Value::Decode(Decoded& decoded) const
{
decoded.Type = m_Type;
if (m_Type == Type::Boolean)
{
decoded.Int32Value = m_Data.BooleanValue;
}
else if (m_Type == Type::Number)
{
decoded.DoubleValue = m_Data.DoubleValue;
}
else if (m_Type == Type::Int32)
{
decoded.Int32Value = m_Data.Int32Value;
}
else if (m_Type == Type::UInt32)
{
decoded.UInt32Value = m_Data.UInt32Value;
}
else if (m_Type == Type::String)
{
decoded.pvData = m_Data.pString->ToCString();
decoded.Length = static_cast<int32_t>(m_Data.pString->GetLength());
}
else if (m_Type == Type::DateTime)
{
decoded.DoubleValue = m_Data.DoubleValue;
}
else if (m_Type == Type::BigInt)
{
decoded.pvData = m_Data.pBigInt->GetWords().data();
decoded.Length = static_cast<int32_t>(m_Data.pBigInt->GetWords().size());
decoded.SignBit = static_cast<int16_t>(m_Data.pBigInt->GetSignBit());
}
else if (m_Type == Type::V8Object)
{
decoded.pvData = new V8ObjectHandle(m_Data.pV8ObjectHolder->Clone());
decoded.Subtype = m_Subtype;
decoded.Flags = m_Flags;
decoded.IdentityHash = m_Data.pV8ObjectHolder->GetIdentityHash();
}
else if (m_Type == Type::HostObject)
{
decoded.pvData = m_Data.pHostObjectHolder->GetObject();
}
}
//-----------------------------------------------------------------------------
// V8 split proxy native entry points (implementation)
//-----------------------------------------------------------------------------
@ -528,97 +566,9 @@ NATIVE_ENTRY_POINT(void) V8Value_SetHostObject(V8Value* pV8Value, void* pvObject
//-----------------------------------------------------------------------------
NATIVE_ENTRY_POINT(V8Value::Type) V8Value_Decode(const V8Value& value, int32_t& intValue, uint32_t& uintValue, double& doubleValue, const void*& pvData) noexcept
NATIVE_ENTRY_POINT(void) V8Value_Decode(const V8Value& value, V8Value::Decoded& decoded) noexcept
{
{
bool result;
if (value.AsBoolean(result))
{
intValue = result;
return V8Value::Type::Boolean;
}
}
{
double result;
if (value.AsNumber(result))
{
doubleValue = result;
return V8Value::Type::Number;
}
}
{
int32_t result;
if (value.AsInt32(result))
{
intValue = result;
return V8Value::Type::Int32;
}
}
{
uint32_t result;
if (value.AsUInt32(result))
{
uintValue = result;
return V8Value::Type::UInt32;
}
}
{
const StdString* pString;
if (value.AsString(pString))
{
pvData = pString->ToCString();
intValue = pString->GetLength();
return V8Value::Type::String;
}
}
{
double result;
if (value.AsDateTime(result))
{
doubleValue = result;
return V8Value::Type::DateTime;
}
}
{
const V8BigInt* pBigInt;
if (value.AsBigInt(pBigInt))
{
intValue = pBigInt->GetSignBit();
pvData = pBigInt->GetWords().data();
uintValue = static_cast<uint32_t>(pBigInt->GetWords().size());
return V8Value::Type::BigInt;
}
}
{
V8ObjectHolder* pHolder;
V8Value::Subtype subtype;
V8Value::Flags flags;
if (value.AsV8Object(pHolder, subtype, flags))
{
pvData = new V8ObjectHandle(pHolder->Clone());
uintValue = PackV8ObjectInfo(subtype, flags);
intValue = pHolder->GetIdentityHash();
return V8Value::Type::V8Object;
}
}
{
HostObjectHolder* pHolder;
if (value.AsHostObject(pHolder))
{
pvData = pHolder->GetObject();
return V8Value::Type::HostObject;
}
}
return value.GetType();
value.Decode(decoded);
}
//-----------------------------------------------------------------------------

Просмотреть файл

@ -221,7 +221,7 @@ NATIVE_ENTRY_POINT(void) V8Value_SetDateTime(V8Value* pV8Value, double value) no
NATIVE_ENTRY_POINT(void) V8Value_SetBigInt(V8Value* pV8Value, int32_t signBit, const uint8_t* pBytes, int32_t length) noexcept;
NATIVE_ENTRY_POINT(void) V8Value_SetV8Object(V8Value* pV8Value, const V8ObjectHandle& handle, V8Value::Subtype subtype, V8Value::Flags flags) noexcept;
NATIVE_ENTRY_POINT(void) V8Value_SetHostObject(V8Value* pV8Value, void* pvObject) noexcept;
NATIVE_ENTRY_POINT(V8Value::Type) V8Value_Decode(const V8Value& value, int32_t& intValue, uint32_t& uintValue, double& doubleValue, const void*& pvData) noexcept;
NATIVE_ENTRY_POINT(void) V8Value_Decode(const V8Value& value, V8Value::Decoded& decoded) noexcept;
NATIVE_ENTRY_POINT(void) V8Value_Delete(V8Value* pV8Value) noexcept;
NATIVE_ENTRY_POINT(void) V8CpuProfile_GetInfo(const v8::CpuProfile& profile, const V8EntityHandleBase& entityHandle, StdString& name, uint64_t& startTimestamp, uint64_t& endTimestamp, int32_t& sampleCount, const v8::CpuProfileNode*& pRootNode) noexcept;

Просмотреть файл

@ -95,7 +95,7 @@ public:
DateTime
};
enum class Type: uint16_t
enum class Type: uint8_t
{
// IMPORTANT: maintain bitwise equivalence with managed enum V8.SplitProxy.V8Value.Type
Nonexistent,
@ -112,7 +112,7 @@ public:
HostObject
};
enum class Subtype: uint16_t
enum class Subtype: uint8_t
{
// IMPORTANT: maintain bitwise equivalence with managed enum V8.SplitProxy.V8Value.Subtype
None,
@ -144,6 +144,42 @@ public:
Generator = 0x0004
};
struct Decoded
{
// IMPORTANT: maintain bitwise equivalence with managed struct V8.SplitProxy.V8Value.Decoded
Type Type;
Subtype Subtype;
union
{
Flags Flags;
int16_t SignBit;
};
union
{
int32_t Length;
int32_t IdentityHash;
};
union
{
int32_t Int32Value;
uint32_t UInt32Value;
double DoubleValue;
const void* pvData;
};
};
static_assert(sizeof(Decoded) == 16, "The managed SplitProxy code assumes that sizeof(Decoded) is 16 on all platforms.");
static_assert(offsetof(Decoded, Type) == 0, "The managed SplitProxy code assumes that offsetof(Decoded, Type) is 0 on all platforms.");
static_assert(offsetof(Decoded, Subtype) == 1, "The managed SplitProxy code assumes that offsetof(Decoded, Subtype) is 1 on all platforms.");
static_assert(offsetof(Decoded, Flags) == 2, "The managed SplitProxy code assumes that offsetof(Decoded, Flags) is 2 on all platforms.");
static_assert(offsetof(Decoded, SignBit) == 2, "The managed SplitProxy code assumes that offsetof(Decoded, SignBit) is 2 on all platforms.");
static_assert(offsetof(Decoded, Length) == 4, "The managed SplitProxy code assumes that offsetof(Decoded, Length) is 4 on all platforms.");
static_assert(offsetof(Decoded, IdentityHash) == 4, "The managed SplitProxy code assumes that offsetof(Decoded, IdentityHash) is 4 on all platforms.");
static_assert(offsetof(Decoded, Int32Value) == 8, "The managed SplitProxy code assumes that offsetof(Decoded, Int32Value) is 8 on all platforms.");
static_assert(offsetof(Decoded, UInt32Value) == 8, "The managed SplitProxy code assumes that offsetof(Decoded, UInt32Value) is 8 on all platforms.");
static_assert(offsetof(Decoded, DoubleValue) == 8, "The managed SplitProxy code assumes that offsetof(Decoded, DoubleValue) is 8 on all platforms.");
static_assert(offsetof(Decoded, pvData) == 8, "The managed SplitProxy code assumes that offsetof(Decoded, pvData) is 8 on all platforms.");
explicit V8Value(NonexistentInitializer):
m_Type(Type::Nonexistent)
{
@ -360,6 +396,8 @@ public:
return m_Type;
}
void Decode(Decoded& decoded) const;
~V8Value()
{
Dispose();
@ -455,7 +493,7 @@ private:
Type m_Type;
Subtype m_Subtype;
Flags m_Flags;
int16_t m_Padding;
int32_t m_Padding;
Data m_Data;
};

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -1,4 +1,4 @@
[![Banner](https://github.com/microsoft/ClearScript/blob/master/docs/ClearScript7-ReadMe.png)](https://microsoft.github.io/ClearScript/)
[![Banner](https://raw.githubusercontent.com/microsoft/ClearScript/master/docs/ClearScript7-ReadMe.png)](https://microsoft.github.io/ClearScript/)
[![Twitter Follow](https://img.shields.io/badge/Follow-%40ClearScriptLib-white?logo=twitter&style=social)](https://twitter.com/ClearScriptLib)

Просмотреть файл

@ -1,6 +1,6 @@
#!/bin/bash
v8testedrev=11.1.277.14
v8testedrev=11.2.214.13
v8testedcommit=
v8cherrypicks=
v8linuxbuildcommit=3d9590754d5d23e62d15472c5baf6777ca59df20

Просмотреть файл

@ -1,8 +1,8 @@
diff --git a/BUILD.gn b/BUILD.gn
index 316bcb4d3c..65833d40b6 100644
index 277f47717d..9589c54e60 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1119,7 +1119,7 @@ config("toolchain") {
@@ -1121,7 +1121,7 @@ config("toolchain") {
visibility = [ "./*" ]
defines = []
@ -36,6 +36,19 @@ index d3e35d6ec5..2d2fb458fe 100644
/**
* Initialize the ICU library bundled with V8. The embedder should only
diff --git a/include/v8-platform.h b/include/v8-platform.h
index 750131d4c9..c390d801ed 100644
--- a/include/v8-platform.h
+++ b/include/v8-platform.h
@@ -1089,7 +1089,7 @@ class Platform {
* required.
*/
virtual int64_t CurrentClockTimeMilliseconds() {
- return floor(CurrentClockTimeMillis());
+ return static_cast<int64_t>(floor(CurrentClockTimeMillis()));
}
/**
diff --git a/include/v8-template.h b/include/v8-template.h
index 11296cd488..0f090446dc 100644
--- a/include/v8-template.h
@ -51,10 +64,10 @@ index 11296cd488..0f090446dc 100644
* Support for TC39 "dynamic code brand checks" proposal.
*
diff --git a/include/v8config.h b/include/v8config.h
index b44995e7cd..cb7928b515 100644
index 9410eb4135..b9bdc7a6a0 100644
--- a/include/v8config.h
+++ b/include/v8config.h
@@ -524,7 +524,7 @@ path. Add it with -I<path> to the command line
@@ -531,7 +531,7 @@ path. Add it with -I<path> to the command line
// Use like:
// V8_NOINLINE V8_PRESERVE_MOST void UnlikelyMethod();
#if V8_HAS_ATTRIBUTE_PRESERVE_MOST
@ -78,10 +91,10 @@ index 05a883f2d5..3ea0b8ce62 100644
// Keep prototypes in slow-mode. Let them be lazily turned fast later on.
// TODO(dcarney): is this necessary?
diff --git a/src/api/api.cc b/src/api/api.cc
index 81c7d1e3f9..da9e93fa17 100644
index fac24bae12..0c558589ea 100644
--- a/src/api/api.cc
+++ b/src/api/api.cc
@@ -2043,6 +2043,17 @@ void ObjectTemplate::SetImmutableProto() {
@@ -2057,6 +2057,17 @@ void ObjectTemplate::SetImmutableProto() {
self->set_immutable_proto(true);
}
@ -99,7 +112,7 @@ index 81c7d1e3f9..da9e93fa17 100644
bool ObjectTemplate::IsCodeLike() const {
return Utils::OpenHandle(this)->code_like();
}
@@ -6466,6 +6477,10 @@ bool v8::V8::InitializeICU(const char* icu_data_file) {
@@ -6445,6 +6456,10 @@ bool v8::V8::InitializeICU(const char* icu_data_file) {
return i::InitializeICU(icu_data_file);
}
@ -127,7 +140,7 @@ index 34a26d9c26..f995a2fc64 100644
MatchLiteralCompareTypeof(right_, op(), left_, expr, literal);
}
diff --git a/src/base/platform/platform.h b/src/base/platform/platform.h
index 88d35540b1..20863d6f5b 100644
index b9b734dac8..b577e3e01a 100644
--- a/src/base/platform/platform.h
+++ b/src/base/platform/platform.h
@@ -52,6 +52,8 @@
@ -154,10 +167,10 @@ index 417e6f1dfa..108dc20972 100644
// The evaluation of async module can not throwing a JavaScript observable
// exception.
diff --git a/src/codegen/code-stub-assembler.cc b/src/codegen/code-stub-assembler.cc
index 7d47afa2c9..cc95781cbc 100644
index 1091943889..dbc699384c 100644
--- a/src/codegen/code-stub-assembler.cc
+++ b/src/codegen/code-stub-assembler.cc
@@ -2006,6 +2006,10 @@ TNode<Uint32T> CodeStubAssembler::LoadMapBitField3(TNode<Map> map) {
@@ -2027,6 +2027,10 @@ TNode<Uint32T> CodeStubAssembler::LoadMapBitField3(TNode<Map> map) {
return LoadObjectField<Uint32T>(map, Map::kBitField3Offset);
}
@ -168,7 +181,7 @@ index 7d47afa2c9..cc95781cbc 100644
TNode<Uint16T> CodeStubAssembler::LoadMapInstanceType(TNode<Map> map) {
return LoadObjectField<Uint16T>(map, Map::kInstanceTypeOffset);
}
@@ -14308,6 +14312,11 @@ TNode<String> CodeStubAssembler::Typeof(TNode<Object> value) {
@@ -14364,6 +14368,11 @@ TNode<String> CodeStubAssembler::Typeof(TNode<Object> value) {
GotoIf(InstanceTypeEqual(instance_type, ODDBALL_TYPE), &if_oddball);
@ -181,7 +194,7 @@ index 7d47afa2c9..cc95781cbc 100644
Word32And(LoadMapBitField(map),
Int32Constant(Map::Bits1::IsCallableBit::kMask |
diff --git a/src/codegen/code-stub-assembler.h b/src/codegen/code-stub-assembler.h
index fdd6da6017..c4eb41496c 100644
index d4d6e12bae..890a6cf249 100644
--- a/src/codegen/code-stub-assembler.h
+++ b/src/codegen/code-stub-assembler.h
@@ -1409,6 +1409,8 @@ class V8_EXPORT_PRIVATE CodeStubAssembler
@ -194,7 +207,7 @@ index fdd6da6017..c4eb41496c 100644
TNode<Uint16T> LoadMapInstanceType(TNode<Map> map);
// Load the ElementsKind of a map.
diff --git a/src/common/globals.h b/src/common/globals.h
index d379cbfc61..d11438763b 100644
index 34d0c01cb6..bda045dece 100644
--- a/src/common/globals.h
+++ b/src/common/globals.h
@@ -270,7 +270,7 @@ const size_t kShortBuiltinCallsOldSpaceSizeThreshold = size_t{2} * GB;
@ -207,7 +220,7 @@ index d379cbfc61..d11438763b 100644
#define V8_HEAP_USE_PTHREAD_JIT_WRITE_PROTECT false
#endif
diff --git a/src/diagnostics/unwinding-info-win64.cc b/src/diagnostics/unwinding-info-win64.cc
index 767eb015ab..acd70f7167 100644
index a71b866135..4f1d26676c 100644
--- a/src/diagnostics/unwinding-info-win64.cc
+++ b/src/diagnostics/unwinding-info-win64.cc
@@ -462,6 +462,14 @@ void InitUnwindingRecord(Record* record, size_t code_size_in_bytes) {
@ -286,7 +299,7 @@ index 767eb015ab..acd70f7167 100644
// Unprotect reserved page.
DWORD old_protect;
diff --git a/src/execution/isolate-inl.h b/src/execution/isolate-inl.h
index 026e7cfd71..c833440dff 100644
index 8edeb5dfb8..9189c32794 100644
--- a/src/execution/isolate-inl.h
+++ b/src/execution/isolate-inl.h
@@ -35,7 +35,6 @@ V8_INLINE Isolate* Isolate::TryGetCurrent() { return g_current_isolate_; }
@ -298,7 +311,7 @@ index 026e7cfd71..c833440dff 100644
}
diff --git a/src/execution/stack-guard.cc b/src/execution/stack-guard.cc
index 2b4af70bc0..2607f22922 100644
index ff64beb8b2..b26b3fe323 100644
--- a/src/execution/stack-guard.cc
+++ b/src/execution/stack-guard.cc
@@ -218,8 +218,10 @@ void StackGuard::FreeThreadResources() {
@ -314,10 +327,10 @@ index 2b4af70bc0..2607f22922 100644
set_jslimit(SimulatorStack::JsLimitFromCLimit(isolate, limit));
real_climit_ = limit;
diff --git a/src/heap/factory.cc b/src/heap/factory.cc
index caab258158..398cd2bf6c 100644
index 4c868825d7..a84535f103 100644
--- a/src/heap/factory.cc
+++ b/src/heap/factory.cc
@@ -2063,6 +2063,7 @@ Map Factory::InitializeMap(Map map, InstanceType type, int instance_size,
@@ -2079,6 +2079,7 @@ Map Factory::InitializeMap(Map map, InstanceType type, int instance_size,
Map::Bits3::ConstructionCounterBits::encode(Map::kNoSlackTracking) |
Map::Bits3::IsExtensibleBit::encode(true);
map.set_bit_field3(bit_field3);
@ -325,25 +338,11 @@ index caab258158..398cd2bf6c 100644
map.set_instance_type(type);
ReadOnlyRoots ro_roots(roots);
map.init_prototype_and_constructor_or_back_pointer(ro_roots);
diff --git a/src/heap/memory-chunk-layout.h b/src/heap/memory-chunk-layout.h
index 67e3a7b9dd..ff68856972 100644
--- a/src/heap/memory-chunk-layout.h
+++ b/src/heap/memory-chunk-layout.h
@@ -73,6 +73,9 @@ class V8_EXPORT_PRIVATE MemoryChunkLayout {
FIELD(FreeListCategory**, Categories),
FIELD(CodeObjectRegistry*, CodeObjectRegistry),
FIELD(PossiblyEmptyBuckets, PossiblyEmptyBuckets),
+#if defined(V8_TARGET_OS_WIN) && defined(V8_TARGET_ARCH_IA32)
+ FIELD(int32_t, WinIa32Padding),
+#endif // V8_TARGET_OS_WIN && V8_TARGET_ARCH_IA32
FIELD(ActiveSystemPages, ActiveSystemPages),
#ifdef V8_ENABLE_INNER_POINTER_RESOLUTION_OSB
FIELD(ObjectStartBitmap, ObjectStartBitmap),
diff --git a/src/heap/setup-heap-internal.cc b/src/heap/setup-heap-internal.cc
index 60ef0cc4b0..245ea249de 100644
index 5f352d1349..10020d538c 100644
--- a/src/heap/setup-heap-internal.cc
+++ b/src/heap/setup-heap-internal.cc
@@ -240,6 +240,7 @@ AllocationResult Heap::AllocatePartialMap(InstanceType instance_type,
@@ -241,6 +241,7 @@ AllocationResult Heap::AllocatePartialMap(InstanceType instance_type,
Map::Bits3::OwnsDescriptorsBit::encode(true) |
Map::Bits3::ConstructionCounterBits::encode(Map::kNoSlackTracking);
map.set_bit_field3(bit_field3);
@ -431,10 +430,10 @@ index 2bbbb7e1f4..5cbd5e8c43 100644
IdleTaskSupport idle_task_support,
InProcessStackDumping in_process_stack_dumping,
diff --git a/src/objects/js-objects.cc b/src/objects/js-objects.cc
index 682e77ec24..3b9ec4525b 100644
index 7bb2558cec..65b547b0fd 100644
--- a/src/objects/js-objects.cc
+++ b/src/objects/js-objects.cc
@@ -5203,6 +5203,13 @@ void JSObject::SetImmutableProto(Handle<JSObject> object) {
@@ -5246,6 +5246,13 @@ void JSObject::SetImmutableProto(Handle<JSObject> object) {
object->set_map(*new_map, kReleaseStore);
}
@ -449,10 +448,10 @@ index 682e77ec24..3b9ec4525b 100644
JavaScriptArguments* args,
uint32_t arg_count,
diff --git a/src/objects/js-objects.h b/src/objects/js-objects.h
index 06489c2b7b..927d68d926 100644
index f83083cdbc..f9f274eadb 100644
--- a/src/objects/js-objects.h
+++ b/src/objects/js-objects.h
@@ -740,6 +740,8 @@ class JSObject : public TorqueGeneratedJSObject<JSObject, JSReceiver> {
@@ -745,6 +745,8 @@ class JSObject : public TorqueGeneratedJSObject<JSObject, JSReceiver> {
// Never called from JavaScript
static void SetImmutableProto(Handle<JSObject> object);
@ -462,10 +461,10 @@ index 06489c2b7b..927d68d926 100644
// the caller to initialize object header. Fill the pre-allocated fields with
// undefined_value and the rest with filler_map.
diff --git a/src/objects/map-inl.h b/src/objects/map-inl.h
index bc25dd1117..661972f6c0 100644
index 2c42cf2ee6..5fc4e46ba9 100644
--- a/src/objects/map-inl.h
+++ b/src/objects/map-inl.h
@@ -124,6 +124,9 @@ BIT_FIELD_ACCESSORS(Map, bit_field3, may_have_interesting_symbols,
@@ -125,6 +125,9 @@ BIT_FIELD_ACCESSORS(Map, bit_field3, may_have_interesting_symbols,
BIT_FIELD_ACCESSORS(Map, relaxed_bit_field3, construction_counter,
Map::Bits3::ConstructionCounterBits)
@ -476,10 +475,10 @@ index bc25dd1117..661972f6c0 100644
DCHECK(has_named_interceptor());
FunctionTemplateInfo info = GetFunctionTemplateInfo(cage_base);
diff --git a/src/objects/map.cc b/src/objects/map.cc
index b29db773e4..92cb13f012 100644
index ea57d93925..34763a37ef 100644
--- a/src/objects/map.cc
+++ b/src/objects/map.cc
@@ -1179,6 +1179,7 @@ Handle<Map> Map::RawCopy(Isolate* isolate, Handle<Map> src_handle,
@@ -1185,6 +1185,7 @@ Handle<Map> Map::RawCopy(Isolate* isolate, Handle<Map> src_handle,
}
// Same as bit_field comment above.
raw.set_bit_field3(new_bit_field3);
@ -487,7 +486,7 @@ index b29db773e4..92cb13f012 100644
raw.clear_padding();
}
Handle<HeapObject> prototype(src_handle->prototype(), isolate);
@@ -1305,6 +1306,12 @@ Handle<Map> Map::TransitionToImmutableProto(Isolate* isolate, Handle<Map> map) {
@@ -1311,6 +1312,12 @@ Handle<Map> Map::TransitionToImmutableProto(Isolate* isolate, Handle<Map> map) {
return new_map;
}
@ -501,10 +500,10 @@ index b29db773e4..92cb13f012 100644
void EnsureInitialMap(Isolate* isolate, Handle<Map> map) {
#ifdef DEBUG
diff --git a/src/objects/map.h b/src/objects/map.h
index 4f2462c715..cd6cec6b2c 100644
index bdc10ee2ba..838f81cd5d 100644
--- a/src/objects/map.h
+++ b/src/objects/map.h
@@ -319,6 +319,11 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
@@ -321,6 +321,11 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
static_assert(kSlackTrackingCounterStart <=
Bits3::ConstructionCounterBits::kMax);
@ -516,7 +515,7 @@ index 4f2462c715..cd6cec6b2c 100644
// Inobject slack tracking is the way to reclaim unused inobject space.
//
// The instance size is initially determined by adding some slack to
@@ -662,6 +667,8 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
@@ -666,6 +671,8 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
DECL_BOOLEAN_ACCESSORS(is_immutable_proto)
@ -525,7 +524,7 @@ index 4f2462c715..cd6cec6b2c 100644
// This counter is used for in-object slack tracking.
// The in-object slack tracking is considered enabled when the counter is
// non zero. The counter only has a valid count for initial maps. For
@@ -830,6 +837,8 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
@@ -834,6 +841,8 @@ class Map : public TorqueGeneratedMap<Map, HeapObject> {
static Handle<Map> TransitionToImmutableProto(Isolate* isolate,
Handle<Map> map);
@ -561,10 +560,10 @@ index a8b367ff82..98637087ee 100644
prototype: JSReceiver|Null;
constructor_or_back_pointer_or_native_context: Object;
diff --git a/src/objects/objects.cc b/src/objects/objects.cc
index b5f0260f4b..4d41e4f62f 100644
index 26a8d59b34..108b20ee8b 100644
--- a/src/objects/objects.cc
+++ b/src/objects/objects.cc
@@ -882,6 +882,12 @@ Handle<String> Object::TypeOf(Isolate* isolate, Handle<Object> object) {
@@ -886,6 +886,12 @@ Handle<String> Object::TypeOf(Isolate* isolate, Handle<Object> object) {
if (object->IsString()) return isolate->factory()->string_string();
if (object->IsSymbol()) return isolate->factory()->symbol_string();
if (object->IsBigInt()) return isolate->factory()->bigint_string();
@ -578,10 +577,10 @@ index b5f0260f4b..4d41e4f62f 100644
return isolate->factory()->object_string();
}
diff --git a/src/objects/source-text-module.cc b/src/objects/source-text-module.cc
index fbb89b4617..915d4a450c 100644
index 070788138b..2ac555d1c6 100644
--- a/src/objects/source-text-module.cc
+++ b/src/objects/source-text-module.cc
@@ -747,7 +747,7 @@ MaybeHandle<Object> SourceTextModule::Evaluate(
@@ -746,7 +746,7 @@ MaybeHandle<Object> SourceTextModule::Evaluate(
if (!module->IsAsyncEvaluating()) {
// i. Perform ! Call(capability.[[Resolve]], undefined,
// «undefined»).
@ -590,7 +589,7 @@ index fbb89b4617..915d4a450c 100644
.ToHandleChecked();
}
@@ -760,7 +760,7 @@ MaybeHandle<Object> SourceTextModule::Evaluate(
@@ -759,7 +759,7 @@ MaybeHandle<Object> SourceTextModule::Evaluate(
}
Maybe<bool> SourceTextModule::AsyncModuleExecutionFulfilled(
@ -599,7 +598,7 @@ index fbb89b4617..915d4a450c 100644
// 1. If module.[[Status]] is evaluated, then
if (module->status() == kErrored) {
// a. Assert: module.[[EvaluationError]] is not empty.
@@ -784,7 +784,7 @@ Maybe<bool> SourceTextModule::AsyncModuleExecutionFulfilled(
@@ -783,7 +783,7 @@ Maybe<bool> SourceTextModule::AsyncModuleExecutionFulfilled(
// «undefined»).
Handle<JSPromise> capability(
JSPromise::cast(module->top_level_capability()), isolate);
@ -608,7 +607,7 @@ index fbb89b4617..915d4a450c 100644
.ToHandleChecked();
}
@@ -850,7 +850,7 @@ Maybe<bool> SourceTextModule::AsyncModuleExecutionFulfilled(
@@ -849,7 +849,7 @@ Maybe<bool> SourceTextModule::AsyncModuleExecutionFulfilled(
// undefined, «undefined»).
Handle<JSPromise> capability(
JSPromise::cast(m->top_level_capability()), isolate);

Просмотреть файл

@ -1,7 +1,7 @@
@echo off
setlocal
set v8testedrev=11.1.277.14
set v8testedrev=11.2.214.13
set v8testedcommit=
if not "%v8testedcommit%"=="" goto ProcessArgs

Просмотреть файл

@ -1,5 +1,5 @@
<#
var version = new Version(7, 4, 0);
var version = new Version(7, 4, 1);
var versionSuffix = string.Empty;
new Random(versionSuffix.Length); // suppress "versionSuffix not used" warning
#>

Просмотреть файл

@ -1,12 +1,11 @@
GEM
remote: https://rubygems.org/
specs:
activesupport (6.0.6.1)
activesupport (7.0.4.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
zeitwerk (~> 2.2, >= 2.2.2)
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.1)
public_suffix (>= 2.0.2, < 6.0)
coffee-script (2.4.1)
@ -14,8 +13,8 @@ GEM
execjs
coffee-script-source (1.11.1)
colorator (1.1.0)
commonmarker (0.23.7)
concurrent-ruby (1.2.0)
commonmarker (0.23.8)
concurrent-ruby (1.2.2)
dnsruby (1.61.9)
simpleidn (~> 0.1)
em-websocket (0.5.3)
@ -32,12 +31,12 @@ GEM
ffi (1.15.5)
forwardable-extended (2.6.0)
gemoji (3.0.1)
github-pages (227)
github-pages (228)
github-pages-health-check (= 1.17.9)
jekyll (= 3.9.2)
jekyll (= 3.9.3)
jekyll-avatar (= 0.7.0)
jekyll-coffeescript (= 1.1.1)
jekyll-commonmark-ghpages (= 0.2.0)
jekyll-commonmark-ghpages (= 0.4.0)
jekyll-default-layout (= 0.1.4)
jekyll-feed (= 0.15.1)
jekyll-gist (= 1.5.0)
@ -71,7 +70,7 @@ GEM
jemoji (= 0.12.0)
kramdown (= 2.3.2)
kramdown-parser-gfm (= 1.1.0)
liquid (= 4.0.3)
liquid (= 4.0.4)
mercenary (~> 0.3)
minima (= 2.5.1)
nokogiri (>= 1.13.6, < 2.0)
@ -87,13 +86,13 @@ GEM
activesupport (>= 2)
nokogiri (>= 1.4)
http_parser.rb (0.8.0)
i18n (0.9.5)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
jekyll (3.9.2)
jekyll (3.9.3)
addressable (~> 2.4)
colorator (~> 1.0)
em-websocket (~> 0.5)
i18n (~> 0.7)
i18n (>= 0.7, < 2)
jekyll-sass-converter (~> 1.0)
jekyll-watch (~> 2.0)
kramdown (>= 1.17, < 3)
@ -109,11 +108,11 @@ GEM
coffee-script-source (~> 1.11.1)
jekyll-commonmark (1.4.0)
commonmarker (~> 0.22)
jekyll-commonmark-ghpages (0.2.0)
commonmarker (~> 0.23.4)
jekyll-commonmark-ghpages (0.4.0)
commonmarker (~> 0.23.7)
jekyll (~> 3.9.0)
jekyll-commonmark (~> 1.4.0)
rouge (>= 2.0, < 4.0)
rouge (>= 2.0, < 5.0)
jekyll-default-layout (0.1.4)
jekyll (~> 3.0)
jekyll-feed (0.15.1)
@ -201,7 +200,7 @@ GEM
rexml
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
liquid (4.0.3)
liquid (4.0.4)
listen (3.8.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
@ -210,8 +209,8 @@ GEM
jekyll (>= 3.5, < 5.0)
jekyll-feed (~> 0.9)
jekyll-seo-tag (~> 2.1)
minitest (5.17.0)
nokogiri (1.14.0-x86_64-linux)
minitest (5.18.0)
nokogiri (1.14.2-x86_64-linux)
racc (~> 1.4)
octokit (4.25.1)
faraday (>= 1, < 3)
@ -240,16 +239,14 @@ GEM
unf (~> 0.1.4)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
thread_safe (0.3.6)
typhoeus (1.4.0)
ethon (>= 0.9.0)
tzinfo (1.2.10)
thread_safe (~> 0.1)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (1.8.0)
zeitwerk (2.6.6)
PLATFORMS
x86_64-linux