From 979d3cfec75117e96a308a54adceab09d1f650ab Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 23 Jul 2015 17:21:59 +0300 Subject: [PATCH 001/238] Version 1.5.6: Source code of the `ChakraJsRtJsEngine` was synchronized with the Chakra Sample Hosts version of July 11, 2015. --- MsieJavaScriptEngine/JsRt/Native.cs | 180 +++++++++--------- .../Properties/AssemblyInfo.cs | 4 +- NuGet/MsieJavaScriptEngine.nuspec | 5 +- NuGet/readme.txt | 6 +- 4 files changed, 97 insertions(+), 98 deletions(-) diff --git a/MsieJavaScriptEngine/JsRt/Native.cs b/MsieJavaScriptEngine/JsRt/Native.cs index 0893145..a52e77f 100644 --- a/MsieJavaScriptEngine/JsRt/Native.cs +++ b/MsieJavaScriptEngine/JsRt/Native.cs @@ -368,271 +368,271 @@ internal static void ThrowIfError(JavaScriptErrorCode error) } } - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateRuntime(JavaScriptRuntimeAttributes attributes, JavaScriptRuntimeVersion runtimeVersion, JavaScriptThreadServiceCallback threadService, out JavaScriptRuntime runtime); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCollectGarbage(JavaScriptRuntime handle); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDisposeRuntime(JavaScriptRuntime handle); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetRuntimeMemoryUsage(JavaScriptRuntime runtime, out UIntPtr memoryUsage); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetRuntimeMemoryLimit(JavaScriptRuntime runtime, out UIntPtr memoryLimit); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetRuntimeMemoryLimit(JavaScriptRuntime runtime, UIntPtr memoryLimit); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetRuntimeMemoryAllocationCallback(JavaScriptRuntime runtime, IntPtr callbackState, JavaScriptMemoryAllocationCallback allocationCallback); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetRuntimeBeforeCollectCallback(JavaScriptRuntime runtime, IntPtr callbackState, JavaScriptBeforeCollectCallback beforeCollectCallback); - [DllImport("jscript9.dll", EntryPoint = "JsAddRef")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JavaScriptErrorCode JsContextAddRef(JavaScriptContext reference, out uint count); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsAddRef(JavaScriptValue reference, out uint count); - [DllImport("jscript9.dll", EntryPoint = "JsRelease")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] internal static extern JavaScriptErrorCode JsContextRelease(JavaScriptContext reference, out uint count); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsRelease(JavaScriptValue reference, out uint count); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateContext(JavaScriptRuntime runtime, IDebugApplication64 debugSite, out JavaScriptContext newContext); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateContext(JavaScriptRuntime runtime, IDebugApplication32 debugSite, out JavaScriptContext newContext); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetCurrentContext(out JavaScriptContext currentContext); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetCurrentContext(JavaScriptContext context); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetRuntime(JavaScriptContext context, out JavaScriptRuntime runtime); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsIdle(out uint nextIdleTick); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsParseScript(string script, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsRunScript(string script, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsParseSerializedScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsRunSerializedScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetPropertyIdFromName(string name, out JavaScriptPropertyId propertyId); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetPropertyNameFromId(JavaScriptPropertyId propertyId, out IntPtr buffer); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetUndefinedValue(out JavaScriptValue undefinedValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetNullValue(out JavaScriptValue nullValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetTrueValue(out JavaScriptValue trueValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetFalseValue(out JavaScriptValue falseValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsBoolToBoolean(bool value, out JavaScriptValue booleanValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsBooleanToBool(JavaScriptValue booleanValue, out bool boolValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsConvertValueToBoolean(JavaScriptValue value, out JavaScriptValue booleanValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetValueType(JavaScriptValue value, out JavaScriptValueType type); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDoubleToNumber(double doubleValue, out JavaScriptValue value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsIntToNumber(int intValue, out JavaScriptValue value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsNumberToDouble(JavaScriptValue value, out double doubleValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsConvertValueToNumber(JavaScriptValue value, out JavaScriptValue numberValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetStringLength(JavaScriptValue sringValue, out int length); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsPointerToString(string value, UIntPtr stringLength, out JavaScriptValue stringValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStringToPointer(JavaScriptValue value, out IntPtr stringValue, out UIntPtr stringLength); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsConvertValueToString(JavaScriptValue value, out JavaScriptValue stringValue); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out JavaScriptValue value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsValueToVariant(JavaScriptValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetGlobalObject(out JavaScriptValue globalObject); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateObject(out JavaScriptValue obj); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateExternalObject(IntPtr data, JavaScriptObjectFinalizeCallback finalizeCallback, out JavaScriptValue obj); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsConvertValueToObject(JavaScriptValue value, out JavaScriptValue obj); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetPrototype(JavaScriptValue obj, out JavaScriptValue prototypeObject); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetPrototype(JavaScriptValue obj, JavaScriptValue prototypeObject); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetExtensionAllowed(JavaScriptValue obj, out bool value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsPreventExtension(JavaScriptValue obj); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, out JavaScriptValue value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetOwnPropertyDescriptor(JavaScriptValue obj, JavaScriptPropertyId propertyId, out JavaScriptValue propertyDescriptor); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetOwnPropertyNames(JavaScriptValue obj, out JavaScriptValue propertyNames); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, JavaScriptValue value, bool useStrictRules); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsHasProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, out bool hasProperty); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDeleteProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, bool useStrictRules, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDefineProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, JavaScriptValue propertyDescriptor, out bool result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsHasIndexedProperty(JavaScriptValue obj, JavaScriptValue index, out bool result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetIndexedProperty(JavaScriptValue obj, JavaScriptValue index, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetIndexedProperty(JavaScriptValue obj, JavaScriptValue index, JavaScriptValue value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDeleteIndexedProperty(JavaScriptValue obj, JavaScriptValue index); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsEquals(JavaScriptValue obj1, JavaScriptValue obj2, out bool result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStrictEquals(JavaScriptValue obj1, JavaScriptValue obj2, out bool result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsHasExternalData(JavaScriptValue obj, out bool value); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetExternalData(JavaScriptValue obj, out IntPtr externalData); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetExternalData(JavaScriptValue obj, IntPtr externalData); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateArray(uint length, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCallFunction(JavaScriptValue function, JavaScriptValue[] arguments, ushort argumentCount, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsConstructObject(JavaScriptValue function, JavaScriptValue[] arguments, ushort argumentCount, out JavaScriptValue result); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateFunction(JavaScriptNativeFunction nativeFunction, IntPtr externalData, out JavaScriptValue function); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateRangeError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateReferenceError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateSyntaxError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateTypeError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsCreateURIError(JavaScriptValue message, out JavaScriptValue error); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsHasException(out bool hasException); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsGetAndClearException(out JavaScriptValue exception); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsSetException(JavaScriptValue exception); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsDisableRuntimeExecution(JavaScriptRuntime runtime); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsEnableRuntimeExecution(JavaScriptRuntime runtime); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsIsRuntimeExecutionDisabled(JavaScriptRuntime runtime, out bool isDisabled); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsStopProfiling(int reason); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - [DllImport("jscript9.dll")] + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] internal static extern JavaScriptErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); /// @@ -640,7 +640,7 @@ internal static void ThrowIfError(JavaScriptErrorCode error) /// [ComImport] [Guid("78A51822-51F4-11D0-8F20-00805F2CD064")] - public class ProcessDebugManager + internal class ProcessDebugManager { } } diff --git a/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 3e2e438..443c394 100644 --- a/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.5.5.0")] -[assembly: AssemblyFileVersion("1.5.5.0")] +[assembly: AssemblyVersion("1.5.6.0")] +[assembly: AssemblyFileVersion("1.5.6.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 090ec45..7a6db9d 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.5.5 + 1.5.6 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,8 +12,7 @@ false This project is a .NET wrapper for working with the Internet Explorer's JavaScript engines (JsRT version of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This project is a .NET wrapper for working with the Internet Explorer's JavaScript engines (JsRT version of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Fixed an error, that occurs on computers with IE 6; -2. Removed `Obsolete` attribute from parameterless constructor. + Source code of the `ChakraJsRtJsEngine` was synchronized with the Chakra Sample Hosts version of July 11, 2015. Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 45ae8a2..861ad8d 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET 1.5.5 + README file for MSIE JavaScript Engine for .NET 1.5.6 ---------------------------------------------------------------------- @@ -21,8 +21,8 @@ ============= RELEASE NOTES ============= - 1. Fixed an error, that occurs on computers with IE 6; - 2. Removed `Obsolete` attribute from parameterless constructor. + Source code of the `ChakraJsRtJsEngine` was synchronized with the + Chakra Sample Hosts version of July 11, 2015. ============ PROJECT SITE From c4b04d92c8e577ebafef5ebdd97cd7d378e45957 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 17 Oct 2015 11:20:17 +0300 Subject: [PATCH 002/238] Removed redundant nuget.exe --- NuGet/NuGet.exe | Bin 649728 -> 0 bytes NuGet/build-package.cmd | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 NuGet/NuGet.exe diff --git a/NuGet/NuGet.exe b/NuGet/NuGet.exe deleted file mode 100644 index ddc91051bc478f477fd3a634d238e35ff55280c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 649728 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
    bb&8hJafLMc7d<&0{?aw_%=JtOn*%m_)ELM z-`@rPco+EM9cRw>;x6#Jy1;+f1-|o6GtEoQ4|ak7vkQD= z>CE|_-UWVB7x=?n;Q#CbAKH25d=KjaPrAS#=mOu=1)g&==etW6_=R2IAM65uybFBU zE;Hx5t_%FVUEsg&0%uulM*Cs!F7Syi@OO2A|Dg+fWMt-i&+Gz!MHl#IyTEh1&P@M+ zF7WHNgkPP0yVFnQnDIWBDY@41nPf$p%h@u1Xp8Qc^UQH`+VjWCuY4RQhUr$~=9ifb zWQPf^*HnlJMm!~`MYVSfvwvrlsX=e4wo1-Iz8!WLlbaKBCz$u#zLDqW!}{`Q5WJLp zLLIhr*Fn|%a@-PWt_SbP8rnYxTD0s({+q9d^Jz`W=-#Ml6Dt8)&^o;NFnst8y~#uH z1x#~w&4XSB{m#2eJGRM2_4YQ|sNUWt8%>EEG{h%N z!+Dn617!ST5aWZ5q*yqbYyeUz4!C<2BOhC_#uCMSyrmye-9=f;Gwhy4t+uv1g&WE> zqmivuJWH7u?W^t^@l1HHfy0j$cPv*N(IR2X6**Qam=|$SnanR4j`bECM zT=XAl71`Ln$;x&6{-#^IC}QD$ceBCaet7PWxr%CZEiCIkDpu_9O!h|XZIB;;+l%{r zb*h%PER!xYX0?eAzE^wsH7~9A5wb%H?-@rAN}^lR1rgkBRbqDp(oLwswRfEVs>XaN z`eno~2C5v?<|{+@Hqg_X?n8VEv+S;eo7J|R4Y6D$^`jS{h)Xaev~CG~Ja;_Kwv92<|7Ny+|# z*>Fv3d;6+S!}ir&x~JAxN?N`b`tl7}Lz~ov+DR6xbLw#K;h`KysW99IT@Rxsr^D38 zj)mqe)Jx-z)c3)cEb?LUKjKn;m{2D;;%GwP&Qgau9U*5K8z!R0`w8pwq9gh!sP!kc z1NR-Xw#BElV8Jsx%-ysec54gf&&;~p#b-_TAS;dhrPiMKDZj3ct2HSLz!R{I8O#D6 z_Kgf?0bmQ7-xLV^DGLm(SQOyN4sKO>e}Mjs+q+qDXmdSH)VPNqPOn7?Gg=O=ypmtL z>>}I9yb!*)YAbm)5$w#_8`ai*BeO?q;IXlL>B5ADVAE(3-jDDG|o<8rXE z&18Qt5_n`w5oZjENDr9!BmG>bm3#@tePX(3$cuUDp|g$#<|8sdI#(jJj!*cc;nzA_cn!({}FMc=&!|Zt5dA0XhLoxW?W5HGU z;-~?_=k{!S5#b^Bp0E=&SP!tao{_CbYt-6{ZIY(s3H?PF?ug8kh6c?-MUReIgs+FxjXfbw?$qUQUj1B#sd`2p

    Yt4Astz13dn&|a;K`K?0J?jP9t)HhNX9JH6} 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 Date: Thu, 26 Nov 2015 21:46:07 +0300 Subject: [PATCH 003/238] =?UTF-8?q?1.=20Added=20support=20of=20=E2=80=9CEd?= =?UTF-8?q?ge=E2=80=9D=20JsRT=20version=20of=20Chakra=20JavaScript=20engin?= =?UTF-8?q?e;=202.=20`ChakraJsRt`=20mode=20was=20renamed=20to=20`ChakraIeJ?= =?UTF-8?q?sRt`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../B_ChakraJsRt/CommonTests.cs | 21 - .../B_ChakraJsRt/Es5Tests.cs | 21 - .../C_ChakraActiveScript/CommonTests.cs | 21 - .../C_ChakraActiveScript/Es5Tests.cs | 21 - .../D_Classic/CommonTests.cs | 21 - .../D_Classic/Es5Tests.cs | 60 -- .../MsieJavaScriptEngine.Tests.csproj | 14 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../Constants/JsEngineModeName.cs | 9 +- MsieJavaScriptEngine/JsEngineMode.cs | 10 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 446 +++++++++ .../JsRt/Edge/EdgeJsContext.cs | 453 +++++++++ .../JsRt/Edge/EdgeJsErrorHelpers.cs | 116 +++ .../JsRt/Edge/EdgeJsNativeFunction.cs | 16 + .../JsRt/Edge/EdgeJsPropertyId.cs | 149 +++ .../JsRt/Edge/EdgeJsRuntime.cs | 229 +++++ MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs | 51 + .../JsRt/Edge/EdgeJsScriptException.cs | 59 ++ MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs | 934 ++++++++++++++++++ .../JsRt/Edge/EdgeNativeMethods.cs | 274 +++++ .../JsRt/IActiveScriptProfilerCallback.cs | 57 ++ .../JsRt/IActiveScriptProfilerCallback2.cs | 25 + .../JsRt/IActiveScriptProfilerHeapEnum.cs | 13 + .../ChakraIeJsRtJsEngine.cs} | 149 ++- .../JsRt/Ie/IDebugApplication32.cs | 11 + .../JsRt/Ie/IDebugApplication64.cs | 11 + .../JsRt/Ie/IDebugDocumentHelper32.cs | 11 + .../JsRt/Ie/IDebugDocumentHelper64.cs | 11 + .../JsRt/Ie/IProcessDebugManager32.cs | 44 + .../JsRt/Ie/IProcessDebugManager64.cs | 44 + MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs | 467 +++++++++ .../JsRt/Ie/IeJsErrorHelpers.cs | 116 +++ .../JsRt/Ie/IeJsNativeFunction.cs | 16 + .../JsRt/Ie/IeJsPropertyId.cs | 150 +++ .../IeJsRuntime.cs} | 181 ++-- MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 51 + .../JsRt/Ie/IeJsScriptException.cs | 57 ++ MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 931 +++++++++++++++++ .../JsRt/Ie/IeNativeMethods.cs | 280 ++++++ .../JsRt/Ie/ProcessDebugManager.cs | 12 + .../JsRt/JavaScriptContext.cs | 506 ---------- .../JsRt/JavaScriptEngineException.cs | 41 - .../JsRt/JavaScriptException.cs | 70 -- .../JsRt/JavaScriptFatalException.cs | 41 - .../JsRt/JavaScriptNativeFunction.cs | 18 - .../JsRt/JavaScriptObjectFinalizeCallback.cs | 12 - .../JsRt/JavaScriptPropertyId.cs | 142 --- .../JsRt/JavaScriptScriptException.cs | 61 -- .../JsRt/JavaScriptSourceContext.cs | 184 ---- .../JsRt/JavaScriptUsageException.cs | 41 - MsieJavaScriptEngine/JsRt/JavaScriptValue.cs | 884 ----------------- .../JsRt/JavaScriptValueType.cs | 53 - ...ack.cs => JsBackgroundWorkItemCallback.cs} | 6 +- ...Callback.cs => JsBeforeCollectCallback.cs} | 6 +- .../JsRt/JsEngineException.cs | 38 + ...{JavaScriptErrorCode.cs => JsErrorCode.cs} | 64 +- MsieJavaScriptEngine/JsRt/JsException.cs | 71 ++ MsieJavaScriptEngine/JsRt/JsFatalException.cs | 38 + ...lback.cs => JsMemoryAllocationCallback.cs} | 8 +- ...emoryEventType.cs => JsMemoryEventType.cs} | 10 +- .../JsRt/JsObjectFinalizeCallback.cs | 10 + ...meAttributes.cs => JsRuntimeAttributes.cs} | 12 +- ...tRuntimeVersion.cs => JsRuntimeVersion.cs} | 12 +- MsieJavaScriptEngine/JsRt/JsSourceContext.cs | 188 ++++ ...Callback.cs => JsThreadServiceCallback.cs} | 10 +- MsieJavaScriptEngine/JsRt/JsUsageException.cs | 38 + MsieJavaScriptEngine/JsRt/JsValueType.cs | 53 + MsieJavaScriptEngine/JsRt/Native.cs | 647 ------------ .../JsRt/ProfilerEventMask.cs | 33 + .../JsRt/ProfilerScriptType.cs | 28 + .../MsieJavaScriptEngine.csproj | 71 +- MsieJavaScriptEngine/MsieJsEngine.cs | 96 +- MsieJavaScriptEngine/Resources/ES5.js | 52 +- .../Resources/Strings.Designer.cs | 38 +- MsieJavaScriptEngine/Resources/Strings.resx | 18 +- .../Resources/Strings.ru-ru.resx | 18 +- 76 files changed, 5925 insertions(+), 3257 deletions(-) delete mode 100644 MsieJavaScriptEngine.Tests/B_ChakraJsRt/CommonTests.cs delete mode 100644 MsieJavaScriptEngine.Tests/B_ChakraJsRt/Es5Tests.cs delete mode 100644 MsieJavaScriptEngine.Tests/C_ChakraActiveScript/CommonTests.cs delete mode 100644 MsieJavaScriptEngine.Tests/C_ChakraActiveScript/Es5Tests.cs delete mode 100644 MsieJavaScriptEngine.Tests/D_Classic/CommonTests.cs delete mode 100644 MsieJavaScriptEngine.Tests/D_Classic/Es5Tests.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs create mode 100644 MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs create mode 100644 MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs create mode 100644 MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs create mode 100644 MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs rename MsieJavaScriptEngine/JsRt/{ChakraJsRtJsEngine.cs => Ie/ChakraIeJsRtJsEngine.cs} (62%) create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptRuntime.cs => Ie/IeJsRuntime.cs} (59%) create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs create mode 100644 MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptContext.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptEngineException.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptException.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptFatalException.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptNativeFunction.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptObjectFinalizeCallback.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptPropertyId.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptScriptException.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptSourceContext.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptUsageException.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptValue.cs delete mode 100644 MsieJavaScriptEngine/JsRt/JavaScriptValueType.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptBackgroundWorkItemCallback.cs => JsBackgroundWorkItemCallback.cs} (70%) rename MsieJavaScriptEngine/JsRt/{JavaScriptBeforeCollectCallback.cs => JsBeforeCollectCallback.cs} (51%) create mode 100644 MsieJavaScriptEngine/JsRt/JsEngineException.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptErrorCode.cs => JsErrorCode.cs} (71%) create mode 100644 MsieJavaScriptEngine/JsRt/JsException.cs create mode 100644 MsieJavaScriptEngine/JsRt/JsFatalException.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptMemoryAllocationCallback.cs => JsMemoryAllocationCallback.cs} (66%) rename MsieJavaScriptEngine/JsRt/{JavaScriptMemoryEventType.cs => JsMemoryEventType.cs} (51%) create mode 100644 MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptRuntimeAttributes.cs => JsRuntimeAttributes.cs} (87%) rename MsieJavaScriptEngine/JsRt/{JavaScriptRuntimeVersion.cs => JsRuntimeVersion.cs} (60%) create mode 100644 MsieJavaScriptEngine/JsRt/JsSourceContext.cs rename MsieJavaScriptEngine/JsRt/{JavaScriptThreadServiceCallback.cs => JsThreadServiceCallback.cs} (74%) create mode 100644 MsieJavaScriptEngine/JsRt/JsUsageException.cs create mode 100644 MsieJavaScriptEngine/JsRt/JsValueType.cs delete mode 100644 MsieJavaScriptEngine/JsRt/Native.cs create mode 100644 MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs create mode 100644 MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs diff --git a/MsieJavaScriptEngine.Tests/B_ChakraJsRt/CommonTests.cs b/MsieJavaScriptEngine.Tests/B_ChakraJsRt/CommonTests.cs deleted file mode 100644 index 991d893..0000000 --- a/MsieJavaScriptEngine.Tests/B_ChakraJsRt/CommonTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.B_ChakraJsRt -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class CommonTests : CommonTestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/B_ChakraJsRt/Es5Tests.cs b/MsieJavaScriptEngine.Tests/B_ChakraJsRt/Es5Tests.cs deleted file mode 100644 index 918b4cc..0000000 --- a/MsieJavaScriptEngine.Tests/B_ChakraJsRt/Es5Tests.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.B_ChakraJsRt -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class Es5Tests : Es5TestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/CommonTests.cs b/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/CommonTests.cs deleted file mode 100644 index a1bd5f2..0000000 --- a/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/CommonTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.C_ChakraActiveScript -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class CommonTests : CommonTestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/Es5Tests.cs b/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/Es5Tests.cs deleted file mode 100644 index aa4c5cb..0000000 --- a/MsieJavaScriptEngine.Tests/C_ChakraActiveScript/Es5Tests.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.C_ChakraActiveScript -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class Es5Tests : Es5TestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/D_Classic/CommonTests.cs b/MsieJavaScriptEngine.Tests/D_Classic/CommonTests.cs deleted file mode 100644 index 63a8f9c..0000000 --- a/MsieJavaScriptEngine.Tests/D_Classic/CommonTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.D_Classic -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class CommonTests : CommonTestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/D_Classic/Es5Tests.cs b/MsieJavaScriptEngine.Tests/D_Classic/Es5Tests.cs deleted file mode 100644 index 9511b6d..0000000 --- a/MsieJavaScriptEngine.Tests/D_Classic/Es5Tests.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace MsieJavaScriptEngine.Tests.D_Classic -{ - using NUnit.Framework; - - using MsieJavaScriptEngine; - - [TestFixture] - public class Es5Tests : Es5TestsBase - { - [TestFixtureSetUp] - public override void SetUp() - { - _jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = true, - UseJson2Library = true - }); - } - - #region Object methods - - [Test] - public override void ObjectKeysMethodIsSupported() - { - // Arrange - const string input1 = "Object.keys(['a', 'b', 'c']).toString();"; - const string targetOutput1 = "0,1,2"; - - const string input2 = "Object.keys({ 0: 'a', 1: 'b', 2: 'c' }).toString();"; - const string targetOutput2 = "0,1,2"; - - const string input3 = "Object.keys({ 100: 'a', 2: 'b', 7: 'c' }).toString();"; - const string targetOutput3 = "100,2,7"; - - const string initCode4 = @"var myObj = function() { }; -myObj.prototype = { getFoo: { value: function () { return this.foo } } };; -myObj.foo = 1; -"; - const string input4 = "Object.keys(myObj).toString();"; - const string targetOutput4 = "foo"; - - // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); - - _jsEngine.Execute(initCode4); - var output4 = _jsEngine.Evaluate(input4); - - // Assert - Assert.AreEqual(targetOutput1, output1); - Assert.AreEqual(targetOutput2, output2); - Assert.AreEqual(targetOutput3, output3); - Assert.AreEqual(targetOutput4, output4); - } - - #endregion - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj b/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj index a0787d4..dab879f 100644 --- a/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj +++ b/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj @@ -39,18 +39,20 @@ - + + + Code - + Code - - - + + + Code - + Code diff --git a/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 1e5af1c..12a91da 100644 --- a/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -79,7 +79,7 @@ protected ActiveScriptJsEngineBase(string clsid, string engineModeName, string l catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_JsEngineNotLoaded, + string.Format(Strings.Runtime_IeJsEngineNotLoaded, _engineModeName, lowerIeVersion, e.Message), _engineModeName); } diff --git a/MsieJavaScriptEngine/Constants/JsEngineModeName.cs b/MsieJavaScriptEngine/Constants/JsEngineModeName.cs index a3a0405..1966229 100644 --- a/MsieJavaScriptEngine/Constants/JsEngineModeName.cs +++ b/MsieJavaScriptEngine/Constants/JsEngineModeName.cs @@ -16,8 +16,13 @@ internal static class JsEngineModeName public const string ChakraActiveScript = "Chakra ActiveScript"; ///

    - /// Name of Chakra JsRT mode + /// Name of Chakra “Legacy” JsRT mode /// - public const string ChakraJsRt = "Chakra JsRT"; + public const string ChakraIeJsRt = "Chakra IE JsRT"; + + /// + /// Name of Chakra “Edge” JsRT mode + /// + public const string ChakraEdgeJsRt = "Chakra Edge JsRT"; } } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsEngineMode.cs b/MsieJavaScriptEngine/JsEngineMode.cs index e801cf9..c343cc9 100644 --- a/MsieJavaScriptEngine/JsEngineMode.cs +++ b/MsieJavaScriptEngine/JsEngineMode.cs @@ -24,9 +24,15 @@ public enum JsEngineMode ChakraActiveScript, /// - /// JsRT version of Chakra JavaScript engine (supports ECMAScript 5). + /// “Legacy” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). /// Requires Internet Explorer 11 or higher on the machine. /// - ChakraJsRt + ChakraIeJsRt, + + /// + /// “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). + /// Requires Microsoft Edge on the machine. + /// + ChakraEdgeJsRt } } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs new file mode 100644 index 0000000..d7746b4 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -0,0 +1,446 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Globalization; + using System.Text; + + using Constants; + using Resources; + using Utilities; + + /// + /// “Edge” JsRT version of Chakra JavaScript engine + /// + internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine + { + /// + /// Name of JavaScript engine mode + /// + const string ENGINE_MODE_NAME = JsEngineModeName.ChakraEdgeJsRt; + + /// + /// Instance of JavaScript runtime + /// + private EdgeJsRuntime _jsRuntime; + + /// + /// Instance of JavaScript context + /// + private readonly EdgeJsContext _jsContext; + + /// + /// Synchronizer + /// + private readonly object _synchronizer = new object(); + + /// + /// Flag that object is destroyed + /// + private bool _disposed; + + + /// + /// Constructs instance of the Chakra “Edge” JsRT JavaScript engine + /// + public ChakraEdgeJsRtJsEngine() + { + try + { + _jsRuntime = CreateJsRuntime(); + _jsContext = _jsRuntime.CreateContext(); + } + catch (JsUsageException e) + { + string errorMessage; + if (e.ErrorCode == JsErrorCode.WrongThread) + { + errorMessage = Strings.Runtime_JsEnginesChakraJsRtAndActiveScriptConflict; + } + else + { + errorMessage = string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message); + } + + throw new JsEngineLoadException(errorMessage, ENGINE_MODE_NAME); + } + catch (Exception e) + { + throw new JsEngineLoadException( + string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message), ENGINE_MODE_NAME); + } + } + + /// + /// Destructs instance of the Chakra “Edge” JsRT JavaScript engine + /// + ~ChakraEdgeJsRtJsEngine() + { + Dispose(false); + } + + + /// + /// Creates a instance of JavaScript runtime with special settings + /// + /// Instance of JavaScript runtime with special settings + private static EdgeJsRuntime CreateJsRuntime() + { + var jsRuntime = EdgeJsRuntime.Create(JsRuntimeAttributes.AllowScriptInterrupt, null); + + return jsRuntime; + } + + /// + /// Checks a support of the Chakra “Edge” JsRT JavaScript engine + /// + /// Result of check (true - supports; false - does not support) + public static bool IsSupported() + { + bool isSupported; + + try + { + using (CreateJsRuntime()) + { + isSupported = true; + } + } + catch + { + isSupported = false; + } + + return isSupported; + } + + /// + /// Executes a mapping from the host type to a script type + /// + /// The source value + /// The mapped value + private static EdgeJsValue MapToScriptType(object value) + { + if (value == null) + { + return EdgeJsValue.Null; + } + + if (value is Undefined) + { + return EdgeJsValue.Undefined; + } + + var typeCode = Type.GetTypeCode(value.GetType()); + + switch (typeCode) + { + case TypeCode.Boolean: + return EdgeJsValue.FromBoolean((bool)value); + case TypeCode.Int32: + return EdgeJsValue.FromInt32((int)value); + case TypeCode.Double: + return EdgeJsValue.FromDouble((double)value); + case TypeCode.String: + return EdgeJsValue.FromString((string)value); + default: + return EdgeJsValue.FromObject(value); + } + } + + /// + /// Executes a mapping from the script type to a host type + /// + /// The source value + /// The mapped value + private static object MapToHostType(EdgeJsValue value) + { + JsValueType valueType = value.ValueType; + EdgeJsValue processedValue; + object result; + + switch (valueType) + { + case JsValueType.Null: + result = null; + break; + case JsValueType.Undefined: + result = Undefined.Value; + break; + case JsValueType.Boolean: + processedValue = value.ConvertToBoolean(); + result = processedValue.ToBoolean(); + break; + case JsValueType.Number: + processedValue = value.ConvertToNumber(); + result = processedValue.ToDouble(); + break; + case JsValueType.String: + processedValue = value.ConvertToString(); + result = processedValue.ToString(); + break; + case JsValueType.Object: + case JsValueType.Function: + case JsValueType.Error: + case JsValueType.Array: + processedValue = value.ConvertToObject(); + result = processedValue.ToObject(); + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return result; + } + + private JsRuntimeException ConvertJsExceptionToJsRuntimeException( + JsException jsException) + { + string message = jsException.Message; + string category = string.Empty; + int lineNumber = 0; + int columnNumber = 0; + string sourceFragment = string.Empty; + + var jsScriptException = jsException as EdgeJsScriptException; + if (jsScriptException != null) + { + category = "Script error"; + EdgeJsValue errorValue = jsScriptException.Error; + + EdgeJsPropertyId messagePropertyId = EdgeJsPropertyId.FromString("message"); + EdgeJsValue messagePropertyValue = errorValue.GetProperty(messagePropertyId); + string scriptMessage = messagePropertyValue.ConvertToString().ToString(); + if (!string.IsNullOrWhiteSpace(scriptMessage)) + { + message = string.Format("{0}: {1}", message.TrimEnd('.'), scriptMessage); + } + + EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); + if (errorValue.HasProperty(linePropertyId)) + { + EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); + lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; + } + + EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); + if (errorValue.HasProperty(columnPropertyId)) + { + EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; + } + + EdgeJsPropertyId sourcePropertyId = EdgeJsPropertyId.FromString("source"); + if (errorValue.HasProperty(sourcePropertyId)) + { + EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); + sourceFragment = sourcePropertyValue.ConvertToString().ToString(); + } + } + else if (jsException is JsUsageException) + { + category = "Usage error"; + } + else if (jsException is JsEngineException) + { + category = "Engine error"; + } + else if (jsException is JsFatalException) + { + category = "Fatal error"; + } + + var jsEngineException = new JsRuntimeException(message, ENGINE_MODE_NAME) + { + ErrorCode = ((uint)jsException.ErrorCode).ToString(CultureInfo.InvariantCulture), + Category = category, + LineNumber = lineNumber, + ColumnNumber = columnNumber, + SourceFragment = sourceFragment, + HelpLink = jsException.HelpLink + }; + + return jsEngineException; + } + + private void InvokeScript(Action action) + { + lock (_synchronizer) + using (new EdgeJsScope(_jsContext)) + { + try + { + action(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); + } + } + } + + private T InvokeScript(Func func) + { + lock (_synchronizer) + using (new EdgeJsScope(_jsContext)) + { + try + { + return func(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); + } + } + } + + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + private void Dispose(bool disposing) + { + lock (_synchronizer) + { + if (!_disposed) + { + _disposed = true; + + _jsRuntime.Dispose(); + } + } + } + + #region IInnerJsEngine implementation + + public string Mode + { + get { return ENGINE_MODE_NAME; } + } + + public object Evaluate(string expression) + { + object result = InvokeScript(() => + { + EdgeJsValue resultValue = EdgeJsContext.RunScript(expression); + + return MapToHostType(resultValue); + }); + + return result; + } + + public void Execute(string code) + { + InvokeScript(() => EdgeJsContext.RunScript(code)); + } + + public object CallFunction(string functionName, params object[] args) + { + string serializedArguments = string.Empty; + int argumentCount = args.Length; + + if (argumentCount == 1) + { + object value = args[0]; + serializedArguments = SimplisticJsSerializer.Serialize(value); + } + else if (argumentCount > 1) + { + var serializedArgumentsBuilder = new StringBuilder(); + + for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) + { + object value = args[argumentIndex]; + string serializedValue = SimplisticJsSerializer.Serialize(value); + + if (argumentIndex > 0) + { + serializedArgumentsBuilder.Append(", "); + } + serializedArgumentsBuilder.Append(serializedValue); + } + + serializedArguments = serializedArgumentsBuilder.ToString(); + } + + object result = Evaluate(string.Format("{0}({1});", functionName, serializedArguments)); + + return result; + } + + public bool HasVariable(string variableName) + { + bool result = InvokeScript(() => + { + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + bool variableExist = globalObj.HasProperty(variableId); + + if (variableExist) + { + EdgeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = (variableValue.ValueType != JsValueType.Undefined); + } + + return variableExist; + }); + + return result; + } + + public object GetVariableValue(string variableName) + { + object result = InvokeScript(() => + { + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableId); + + return MapToHostType(variableValue); + }); + + return result; + } + + public void SetVariableValue(string variableName, object value) + { + InvokeScript(() => + { + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + EdgeJsValue inputValue = MapToScriptType(value); + + EdgeJsValue.GlobalObject.SetProperty(variableId, inputValue, true); + }); + } + + public void RemoveVariable(string variableName) + { + InvokeScript(() => + { + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + + if (globalObj.HasProperty(variableId)) + { + globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); + } + }); + } + + #endregion + + #region IDisposable implementation + + /// + /// Destroys object + /// + public void Dispose() + { + Dispose(true /* disposing */); + GC.SuppressFinalize(this); + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs new file mode 100644 index 0000000..45e4c9b --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -0,0 +1,453 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + + using JsRt; + + /// + /// “Edge” script context + /// + /// + /// + /// Each script context contains its own global object, distinct from the global object in + /// other script contexts. + /// + /// + /// Many Chakra hosting APIs require an "active" script context, which can be set using + /// Current. Chakra hosting APIs that require a current context to be set will note + /// that explicitly in their documentation. + /// + /// + internal struct EdgeJsContext + { + /// + /// The reference + /// + private readonly IntPtr _reference; + + /// + /// Gets a invalid context + /// + public static EdgeJsContext Invalid + { + get { return new EdgeJsContext(IntPtr.Zero); } + } + + /// + /// Gets or sets a current script context on the thread + /// + public static EdgeJsContext Current + { + get + { + EdgeJsContext reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetCurrentContext(out reference)); + + return reference; + } + set + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetCurrentContext(value)); + } + } + + /// + /// Gets a value indicating whether the runtime of the current context is in an exception state + /// + /// + /// + /// If a call into the runtime results in an exception (either as the result of running a + /// script or due to something like a conversion failure), the runtime is placed into an + /// "exception state." All calls into any context created by the runtime (except for the + /// exception APIs) will fail with InExceptionState until the exception is + /// cleared. + /// + /// + /// If the runtime of the current context is in the exception state when a callback returns + /// into the engine, the engine will automatically rethrow the exception. + /// + /// + /// Requires an active script context. + /// + /// + public static bool HasException + { + get + { + bool hasException; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsHasException(out hasException)); + + return hasException; + } + } + + /// + /// Gets a value indicating whether the heap of the current context is being enumerated + /// + /// + /// Requires an active script context. + /// + public static bool IsEnumeratingHeap + { + get + { + bool isEnumerating; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsIsEnumeratingHeap(out isEnumerating)); + + return isEnumerating; + } + } + + /// + /// Gets a runtime that the context belongs to + /// + public EdgeJsRuntime Runtime + { + get + { + EdgeJsRuntime handle; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetRuntime(this, out handle)); + + return handle; + } + } + + /// + /// Gets a value indicating whether the context is a valid context or not + /// + public bool IsValid + { + get { return _reference != IntPtr.Zero; } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The reference + internal EdgeJsContext(IntPtr reference) + { + _reference = reference; + } + + + /// + /// Tells a runtime to do any idle processing it need to do + /// + /// + /// + /// If idle processing has been enabled for the current runtime, calling Idle will + /// inform the current runtime that the host is idle and that the runtime can perform + /// memory cleanup tasks. + /// + /// + /// Idle will also return the number of system ticks until there will be more idle work + /// for the runtime to do. Calling Idle before this number of ticks has passed will do + /// no work. + /// + /// + /// Requires an active script context. + /// + /// + /// + /// The next system tick when there will be more idle work to do. Returns the + /// maximum number of ticks if there no upcoming idle work to do. + /// + public static uint Idle() + { + uint ticks; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsIdle(out ticks)); + + return ticks; + } + + /// + /// Parses a script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The Function representing the script code + public static EdgeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) + { + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseScript(script, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Parses a serialized script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The serialized script + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The Function representing the script code + public static EdgeJsValue ParseScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + { + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Parses a script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The Function representing the script code + public static EdgeJsValue ParseScript(string script) + { + return ParseScript(script, JsSourceContext.None, string.Empty); + } + + /// + /// Parses a serialized script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The serialized script + /// The Function representing the script code + public static EdgeJsValue ParseScript(string script, byte[] buffer) + { + return ParseScript(script, buffer, JsSourceContext.None, string.Empty); + } + + /// + /// Executes a script + /// + /// + /// Requires an active script context. + /// + /// The script to run + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The result of the script, if any + public static EdgeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) + { + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunScript(script, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Runs a serialized script + /// + /// + /// Requires an active script context. + /// + /// The source code of the serialized script + /// The serialized script + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The result of the script, if any + public static EdgeJsValue RunScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + { + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Executes a script + /// + /// + /// Requires an active script context. + /// + /// The script to run + /// The result of the script, if any + public static EdgeJsValue RunScript(string script) + { + return RunScript(script, JsSourceContext.None, string.Empty); + } + + /// + /// Runs a serialized script + /// + /// + /// Requires an active script context. + /// + /// The source code of the serialized script + /// The serialized script + /// The result of the script, if any + public static EdgeJsValue RunScript(string script, byte[] buffer) + { + return RunScript(script, buffer, JsSourceContext.None, string.Empty); + } + + /// + /// Serializes a parsed script to a buffer than can be reused + /// + /// + /// + /// SerializeScript parses a script and then stores the parsed form of the script in a + /// runtime-independent format. The serialized script then can be deserialized in any + /// runtime without requiring the script to be re-parsed. + /// + /// + /// Requires an active script context. + /// + /// + /// The script to serialize + /// The buffer to put the serialized script into. Can be null. + /// The size of the buffer, in bytes, required to hold the serialized script + public static ulong SerializeScript(string script, byte[] buffer) + { + var bufferSize = (ulong)buffer.Length; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize)); + + return bufferSize; + } + + /// + /// Returns a exception that caused the runtime of the current context to be in the + /// exception state and resets the exception state for that runtime + /// + /// + /// + /// If the runtime of the current context is not in an exception state, this API will throw + /// JsErrorInvalidArgument. If the runtime is disabled, this will return an exception + /// indicating that the script was terminated, but it will not clear the exception (the + /// exception will be cleared if the runtime is re-enabled using + /// EnableRuntimeExecution). + /// + /// + /// Requires an active script context. + /// + /// + /// The exception for the runtime of the current context + public static EdgeJsValue GetAndClearException() + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetAndClearException(out reference)); + + return reference; + } + + /// + /// Sets a runtime of the current context to an exception state + /// + /// + /// + /// If the runtime of the current context is already in an exception state, this API will + /// throw JsErrorInExceptionState. + /// + /// + /// Requires an active script context. + /// + /// + /// The JavaScript exception to set for the runtime of the current context + public static void SetException(EdgeJsValue exception) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetException(exception)); + } + + /// + /// Starts debugging in the context + /// + public static void StartDebugging() + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStartDebugging()); + } + + /// + /// Starts profiling in the current context + /// + /// + /// Requires an active script context. + /// + /// The profiling callback to use + /// The profiling events to callback with + /// A context to pass to the profiling callback + public static void StartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStartProfiling(callback, eventMask, context)); + } + + /// + /// Stops profiling in the current context + /// + /// + /// + /// Will not return an error if profiling has not started. + /// + /// + /// Requires an active script context. + /// + /// + /// The reason for stopping profiling to pass to the profiler callback + public static void StopProfiling(int reason) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStopProfiling(reason)); + } + + /// + /// Enumerates a heap of the current context. + /// + /// + /// + /// While the heap is being enumerated, the current context cannot be removed, and all calls to + /// modify the state of the context will fail until the heap enumerator is released. + /// + /// + /// Requires an active script context. + /// + /// + /// A heap enumerator + public static IActiveScriptProfilerHeapEnum EnumerateHeap() + { + IActiveScriptProfilerHeapEnum enumerator; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsEnumerateHeap(out enumerator)); + + return enumerator; + } + + /// + /// Adds a reference to a script context + /// + /// + /// Calling AddRef ensures that the context will not be freed until Release is called. + /// + /// The object's new reference count + public uint AddRef() + { + uint count; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsContextAddRef(this, out count)); + + return count; + } + + /// + /// Releases a reference to a script context + /// + /// + /// Removes a reference to a context that was created by AddRef. + /// + /// The object's new reference count + public uint Release() + { + uint count; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsContextRelease(this, out count)); + + return count; + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs new file mode 100644 index 0000000..df5a44a --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs @@ -0,0 +1,116 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + /// + /// “Edge” error helpers + /// + internal static class EdgeJsErrorHelpers + { + /// + /// Throws if a native method returns an error code + /// + /// The error + public static void ThrowIfError(JsErrorCode error) + { + if (error != JsErrorCode.NoError) + { + switch (error) + { + case JsErrorCode.InvalidArgument: + throw new JsUsageException(error, "Invalid argument."); + + case JsErrorCode.NullArgument: + throw new JsUsageException(error, "Null argument."); + + case JsErrorCode.NoCurrentContext: + throw new JsUsageException(error, "No current context."); + + case JsErrorCode.InExceptionState: + throw new JsUsageException(error, "Runtime is in exception state."); + + case JsErrorCode.NotImplemented: + throw new JsUsageException(error, "Method is not implemented."); + + case JsErrorCode.WrongThread: + throw new JsUsageException(error, "Runtime is active on another thread."); + + case JsErrorCode.RuntimeInUse: + throw new JsUsageException(error, "Runtime is in use."); + + case JsErrorCode.BadSerializedScript: + throw new JsUsageException(error, "Bad serialized script."); + + case JsErrorCode.InDisabledState: + throw new JsUsageException(error, "Runtime is disabled."); + + case JsErrorCode.CannotDisableExecution: + throw new JsUsageException(error, "Cannot disable execution."); + + case JsErrorCode.AlreadyDebuggingContext: + throw new JsUsageException(error, "Context is already in debug mode."); + + case JsErrorCode.HeapEnumInProgress: + throw new JsUsageException(error, "Heap enumeration is in progress."); + + case JsErrorCode.ArgumentNotObject: + throw new JsUsageException(error, "Argument is not an object."); + + case JsErrorCode.InProfileCallback: + throw new JsUsageException(error, "In a profile callback."); + + case JsErrorCode.InThreadServiceCallback: + throw new JsUsageException(error, "In a thread service callback."); + + case JsErrorCode.CannotSerializeDebugScript: + throw new JsUsageException(error, "Cannot serialize a debug script."); + + case JsErrorCode.AlreadyProfilingContext: + throw new JsUsageException(error, "Already profiling this context."); + + case JsErrorCode.IdleNotEnabled: + throw new JsUsageException(error, "Idle is not enabled."); + + case JsErrorCode.OutOfMemory: + throw new JsEngineException(error, "Out of memory."); + + case JsErrorCode.ScriptException: + { + EdgeJsValue errorObject; + JsErrorCode innerError = EdgeNativeMethods.JsGetAndClearException(out errorObject); + + if (innerError != JsErrorCode.NoError) + { + throw new JsFatalException(innerError); + } + + throw new EdgeJsScriptException(error, errorObject, "Script threw an exception."); + } + + case JsErrorCode.ScriptCompile: + { + EdgeJsValue errorObject; + JsErrorCode innerError = EdgeNativeMethods.JsGetAndClearException(out errorObject); + + if (innerError != JsErrorCode.NoError) + { + throw new JsFatalException(innerError); + } + + throw new EdgeJsScriptException(error, errorObject, "Compile error."); + } + + case JsErrorCode.ScriptTerminated: + throw new EdgeJsScriptException(error, EdgeJsValue.Invalid, "Script was terminated."); + + case JsErrorCode.ScriptEvalDisabled: + throw new EdgeJsScriptException(error, EdgeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + + case JsErrorCode.Fatal: + throw new JsFatalException(error); + + default: + throw new JsFatalException(error); + } + } + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs new file mode 100644 index 0000000..3046b57 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs @@ -0,0 +1,16 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Runtime.InteropServices; + + /// + /// “Edge” function callback + /// + /// The Function object that represents the function being invoked + /// Indicates whether this is a regular call or a 'new' call + /// The arguments to the call + /// The number of arguments + /// Callback data, if any + /// The result of the call, if any + internal delegate EdgeJsValue EdgeJsNativeFunction(EdgeJsValue callee, bool isConstructCall, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] EdgeJsValue[] arguments, ushort argumentCount, IntPtr callbackData); +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs new file mode 100644 index 0000000..cfcbc1e --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs @@ -0,0 +1,149 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Runtime.InteropServices; + + /// + /// “Edge” property identifier + /// + /// + /// Property identifiers are used to refer to properties of JavaScript objects instead of using + /// strings. + /// + internal struct EdgeJsPropertyId : IEquatable + { + /// + /// The id + /// + private readonly IntPtr _id; + + /// + /// Gets a invalid ID + /// + public static EdgeJsPropertyId Invalid + { + get { return new EdgeJsPropertyId(IntPtr.Zero); } + } + + /// + /// Gets a name associated with the property ID + /// + /// + /// + /// Requires an active script context. + /// + /// + public string Name + { + get + { + IntPtr buffer; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetPropertyNameFromId(this, out buffer)); + + return Marshal.PtrToStringAuto(buffer); + } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The ID + internal EdgeJsPropertyId(IntPtr id) + { + _id = id; + } + + + /// + /// Gets a property ID associated with the name + /// + /// + /// + /// Property IDs are specific to a context and cannot be used across contexts. + /// + /// + /// Requires an active script context. + /// + /// + /// The name of the property ID to get or create. + /// The name may consist of only digits. + /// The property ID in this runtime for the given name + public static EdgeJsPropertyId FromString(string name) + { + EdgeJsPropertyId id; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetPropertyIdFromName(name, out id)); + + return id; + } + + /// + /// The equality operator for property IDs + /// + /// The first property ID to compare + /// The second property ID to compare + /// Whether the two property IDs are the same + public static bool operator ==(EdgeJsPropertyId left, EdgeJsPropertyId right) + { + return left.Equals(right); + } + + /// + /// The inequality operator for property IDs + /// + /// The first property ID to compare + /// The second property ID to compare + /// Whether the two property IDs are not the same + public static bool operator !=(EdgeJsPropertyId left, EdgeJsPropertyId right) + { + return !left.Equals(right); + } + + /// + /// Checks for equality between property IDs + /// + /// The other property ID to compare + /// Whether the two property IDs are the same + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is EdgeJsPropertyId && Equals((EdgeJsPropertyId)obj); + } + + /// + /// The hash code + /// + /// The hash code of the property ID + public override int GetHashCode() + { + return _id.ToInt32(); + } + + /// + /// Converts a property ID to a string + /// + /// The name of the property ID + public override string ToString() + { + return Name; + } + + #region IEquatable implementation + + /// + /// Checks for equality between property IDs + /// + /// The other property ID to compare + /// Whether the two property IDs are the same + public bool Equals(EdgeJsPropertyId other) + { + return _id == other._id; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs new file mode 100644 index 0000000..e1e80b2 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs @@ -0,0 +1,229 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + + using JsRt; + + /// + /// “Edge” Chakra runtime + /// + /// + /// + /// Each Chakra runtime has its own independent execution engine, JIT compiler, and garbage + /// collected heap. As such, each runtime is completely isolated from other runtimes. + /// + /// + /// Runtimes can be used on any thread, but only one thread can call into a runtime at any + /// time. + /// + /// + /// NOTE: A , unlike other objects in the Chakra hosting API, is not + /// garbage collected since it contains the garbage collected heap itself. A runtime will + /// continue to exist until Dispose is called. + /// + /// + internal struct EdgeJsRuntime : IDisposable + { + /// + /// The handle + /// + private IntPtr _handle; + + /// + /// Gets a value indicating whether the runtime is valid + /// + public bool IsValid + { + get { return _handle != IntPtr.Zero; } + } + + /// + /// Gets a current memory usage for a runtime + /// + /// + /// Memory usage can be always be retrieved, regardless of whether or not the runtime is active + /// on another thread. + /// + public UIntPtr MemoryUsage + { + get + { + UIntPtr memoryUsage; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetRuntimeMemoryUsage(this, out memoryUsage)); + + return memoryUsage; + } + } + + /// + /// Gets or sets a current memory limit for a runtime + /// + /// + /// The memory limit of a runtime can be always be retrieved, regardless of whether or not the + /// runtime is active on another thread. + /// + public UIntPtr MemoryLimit + { + get + { + UIntPtr memoryLimit; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetRuntimeMemoryLimit(this, out memoryLimit)); + + return memoryLimit; + } + set + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetRuntimeMemoryLimit(this, value)); + } + } + + /// + /// Gets or sets a value indicating whether script execution is disabled in the runtime + /// + public bool Disabled + { + get + { + bool isDisabled; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsIsRuntimeExecutionDisabled(this, out isDisabled)); + + return isDisabled; + } + set + { + EdgeJsErrorHelpers.ThrowIfError(value ? + EdgeNativeMethods.JsDisableRuntimeExecution(this) + : + EdgeNativeMethods.JsEnableRuntimeExecution(this)) + ; + } + } + + + /// + /// Creates a new runtime + /// + /// The attributes of the runtime to be created + /// The thread service for the runtime. Can be null + /// The runtime created + public static EdgeJsRuntime Create(JsRuntimeAttributes attributes, JsThreadServiceCallback threadServiceCallback) + { + EdgeJsRuntime handle; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateRuntime(attributes, threadServiceCallback, out handle)); + + return handle; + } + + /// + /// Creates a new runtime + /// + /// The attributes of the runtime to be created + /// The runtime created + public static EdgeJsRuntime Create(JsRuntimeAttributes attributes) + { + return Create(attributes, null); + } + + /// + /// Creates a new runtime + /// + /// The runtime created + public static EdgeJsRuntime Create() + { + return Create(JsRuntimeAttributes.None, null); + } + + /// + /// Performs a full garbage collection + /// + public void CollectGarbage() + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCollectGarbage(this)); + } + + /// + /// Sets a memory allocation callback for specified runtime + /// + /// + /// + /// Registering a memory allocation callback will cause the runtime to call back to the host + /// whenever it acquires memory from, or releases memory to, the OS. The callback routine is + /// called before the runtime memory manager allocates a block of memory. The allocation will + /// be rejected if the callback returns false. The runtime memory manager will also invoke the + /// callback routine after freeing a block of memory, as well as after allocation failures. + /// + /// + /// The callback is invoked on the current runtime execution thread, therefore execution is + /// blocked until the callback completes. + /// + /// + /// The return value of the callback is not stored; previously rejected allocations will not + /// prevent the runtime from invoking the callback again later for new memory allocations. + /// + /// + /// User provided state that will be passed back to the callback + /// Memory allocation callback to be called for memory allocation events + public void SetMemoryAllocationCallback(IntPtr callbackState, JsMemoryAllocationCallback allocationCallback) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetRuntimeMemoryAllocationCallback(this, callbackState, allocationCallback)); + } + + /// + /// Sets a callback function that is called by the runtime before garbage collection + /// + /// + /// + /// The callback is invoked on the current runtime execution thread, therefore execution is + /// blocked until the callback completes. + /// + /// + /// The callback can be used by hosts to prepare for garbage collection. For example, by + /// releasing unnecessary references on Chakra objects. + /// + /// + /// User provided state that will be passed back to the callback + /// The callback function being set + public void SetBeforeCollectCallback(IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetRuntimeBeforeCollectCallback(this, callbackState, beforeCollectCallback)); + } + + /// + /// Creates a debug script context for running scripts + /// + /// + /// Each script context has its own global object that is isolated from all other script + /// contexts. + /// + /// The created script context + public EdgeJsContext CreateContext() + { + EdgeJsContext reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateContext(this, out reference)); + + return reference; + } + + #region IDisposable implementation + + /// + /// Disposes a runtime + /// + /// + /// Once a runtime has been disposed, all resources owned by it are invalid and cannot be used. + /// If the runtime is active (i.e. it is set to be current on a particular thread), it cannot + /// be disposed. + /// + public void Dispose() + { + if (IsValid) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsDisposeRuntime(this)); + } + + _handle = IntPtr.Zero; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs new file mode 100644 index 0000000..bfb5d86 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs @@ -0,0 +1,51 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + + /// + /// “Edge” scope automatically sets a context to current and resets the original context + /// when disposed + /// + internal struct EdgeJsScope : IDisposable + { + /// + /// The previous context + /// + private readonly EdgeJsContext _previousContext; + + /// + /// Whether the structure has been disposed + /// + private bool _disposed; + + + /// + /// Initializes a new instance of the struct + /// + /// The context to create the scope for + public EdgeJsScope(EdgeJsContext context) + { + _disposed = false; + _previousContext = EdgeJsContext.Current; + EdgeJsContext.Current = context; + } + + #region IDisposable implementation + + /// + /// Disposes a scope and sets the previous context to current + /// + public void Dispose() + { + if (_disposed) + { + return; + } + + EdgeJsContext.Current = _previousContext; + _disposed = true; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs new file mode 100644 index 0000000..14c8119 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs @@ -0,0 +1,59 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Runtime.Serialization; + + using JsRt; + + /// + /// Edge script exception + /// + [Serializable] + internal sealed class EdgeJsScriptException : JsException + { + /// + /// The error + /// + [NonSerialized] + private readonly EdgeJsValue _error; + + /// + /// Gets a JavaScript object representing the script error + /// + public EdgeJsValue Error + { + get { return _error; } + } + + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The JavaScript error object + public EdgeJsScriptException(JsErrorCode code, EdgeJsValue error) + : this(code, error, "JavaScript Exception") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The JavaScript error object + /// The error message + public EdgeJsScriptException(JsErrorCode code, EdgeJsValue error, string message) + : base(code, message) + { + _error = error; + } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + private EdgeJsScriptException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs new file mode 100644 index 0000000..5a8a69e --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -0,0 +1,934 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Runtime.InteropServices; + + using JsRt; + + /// + /// “Edge” JavaScript value + /// + /// + /// The JavaScript value is one of the following types of values: Undefined, Null, Boolean, + /// String, Number, or Object. + /// + internal struct EdgeJsValue + { + /// + /// The reference + /// + private readonly IntPtr _reference; + + /// + /// Gets a invalid value + /// + public static EdgeJsValue Invalid + { + get { return new EdgeJsValue(IntPtr.Zero); } + } + + /// + /// Gets a value of undefined in the current script context + /// + /// + /// Requires an active script context. + /// + public static EdgeJsValue Undefined + { + get + { + EdgeJsValue value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetUndefinedValue(out value)); + + return value; + } + } + + /// + /// Gets a value of null in the current script context + /// + /// + /// Requires an active script context. + /// + public static EdgeJsValue Null + { + get + { + EdgeJsValue value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetNullValue(out value)); + + return value; + } + } + + /// + /// Gets a value of true in the current script context + /// + /// + /// Requires an active script context. + /// + public static EdgeJsValue True + { + get + { + EdgeJsValue value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetTrueValue(out value)); + + return value; + } + } + + /// + /// Gets a value of false in the current script context + /// + /// + /// Requires an active script context. + /// + public static EdgeJsValue False + { + get + { + EdgeJsValue value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetFalseValue(out value)); + + return value; + } + } + + /// + /// Gets a global object in the current script context + /// + /// + /// Requires an active script context. + /// + public static EdgeJsValue GlobalObject + { + get + { + EdgeJsValue value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetGlobalObject(out value)); + + return value; + } + } + + /// + /// Gets a value indicating whether the value is valid + /// + public bool IsValid + { + get { return _reference != IntPtr.Zero; } + } + + /// + /// Gets a JavaScript type of the value + /// + /// + /// Requires an active script context. + /// + /// The type of the value + public JsValueType ValueType + { + get + { + JsValueType type; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetValueType(this, out type)); + + return type; + } + } + + /// + /// Gets a length of a String value + /// + /// + /// Requires an active script context. + /// + /// The length of the string + public int StringLength + { + get + { + int length; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetStringLength(this, out length)); + + return length; + } + } + + /// + /// Gets or sets a prototype of an object + /// + /// + /// Requires an active script context. + /// + public EdgeJsValue Prototype + { + get + { + EdgeJsValue prototypeReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetPrototype(this, out prototypeReference)); + + return prototypeReference; + } + set + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetPrototype(this, value)); + } + } + + /// + /// Gets a value indicating whether an object is extensible or not + /// + /// + /// Requires an active script context. + /// + public bool IsExtensionAllowed + { + get + { + bool allowed; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetExtensionAllowed(this, out allowed)); + + return allowed; + } + } + + /// + /// Gets a value indicating whether an object is an external object + /// + /// + /// Requires an active script context. + /// + public bool HasExternalData + { + get + { + bool hasExternalData; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsHasExternalData(this, out hasExternalData)); + + return hasExternalData; + } + } + + /// + /// Gets or sets a data in an external object + /// + /// + /// Requires an active script context. + /// + public IntPtr ExternalData + { + get + { + IntPtr data; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetExternalData(this, out data)); + + return data; + } + set + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetExternalData(this, value)); + } + } + + + /// + /// Initializes a new instance of the struct. + /// + /// The reference + private EdgeJsValue(IntPtr reference) + { + _reference = reference; + } + + + /// + /// Creates a Boolean value from a bool value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The converted value + public static EdgeJsValue FromBoolean(bool value) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsBoolToBoolean(value, out reference)); + + return reference; + } + + /// + /// Creates a Number value from a double value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The new Number value + public static EdgeJsValue FromDouble(double value) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsDoubleToNumber(value, out reference)); + + return reference; + } + + /// + /// Creates a Number value from a int value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The new Number value + public static EdgeJsValue FromInt32(int value) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsIntToNumber(value, out reference)); + + return reference; + } + + /// + /// Creates a String value from a string pointer + /// + /// + /// Requires an active script context. + /// + /// The string to convert to a String value + /// The new String value + public static EdgeJsValue FromString(string value) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsPointerToString(value, new UIntPtr((uint)value.Length), out reference)); + + return reference; + } + + /// + /// Creates a JavaScript value that is a projection of the passed in object + /// + /// + /// Requires an active script context. + /// + /// The object to be projected + /// The JavaScript value that is a projection of the object + public static EdgeJsValue FromObject(object value) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsVariantToValue(ref value, out reference)); + + return reference; + } + + /// + /// Creates a new Object + /// + /// + /// Requires an active script context. + /// + /// The new Object + public static EdgeJsValue CreateObject() + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateObject(out reference)); + + return reference; + } + + /// + /// Creates a new Object that stores some external data + /// + /// + /// Requires an active script context. + /// + /// External data that the object will represent. May be null + /// The callback for when the object is finalized. May be null. + /// The new Object + public static EdgeJsValue CreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizer) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateExternalObject(data, finalizer, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript function + /// + /// + /// Requires an active script context. + /// + /// The method to call when the function is invoked + /// The new function object + public static EdgeJsValue CreateFunction(EdgeJsNativeFunction function) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateFunction(function, IntPtr.Zero, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript function + /// + /// + /// Requires an active script context. + /// + /// The method to call when the function is invoked + /// Data to be provided to all function callbacks + /// The new function object + public static EdgeJsValue CreateFunction(EdgeJsNativeFunction function, IntPtr callbackData) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateFunction(function, callbackData, out reference)); + + return reference; + } + + /// + /// Creates a JavaScript array object + /// + /// + /// Requires an active script context. + /// + /// The initial length of the array + /// The new array object + public static EdgeJsValue CreateArray(uint length) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateArray(length, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript RangeError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateRangeError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateRangeError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript ReferenceError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateReferenceError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateReferenceError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript SyntaxError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateSyntaxError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateSyntaxError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript TypeError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateTypeError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateTypeError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript URIError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static EdgeJsValue CreateUriError(EdgeJsValue message) + { + EdgeJsValue reference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateURIError(message, out reference)); + + return reference; + } + + /// + /// Adds a reference to the object + /// + /// + /// This only needs to be called on objects that are not going to be stored somewhere on + /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed + /// until Release is called. + /// + /// The object's new reference count + public uint AddRef() + { + uint count; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsAddRef(this, out count)); + + return count; + } + + /// + /// Releases a reference to the object + /// + /// + /// Removes a reference that was created by AddRef. + /// + /// The object's new reference count + public uint Release() + { + uint count; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRelease(this, out count)); + + return count; + } + + /// + /// Retrieves a bool value of a Boolean value + /// + /// + /// Requires an active script context. + /// + /// The converted value + public bool ToBoolean() + { + bool value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsBooleanToBool(this, out value)); + + return value; + } + + /// + /// Retrieves a double value of a Number value + /// + /// + /// + /// This function retrieves the value of a Number value. It will fail with + /// InvalidArgument if the type of the value is not Number. + /// + /// + /// Requires an active script context. + /// + /// + /// The double value + public double ToDouble() + { + double value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsNumberToDouble(this, out value)); + + return value; + } + + /// + /// Retrieves a string pointer of a String value + /// + /// + /// + /// This function retrieves the string pointer of a String value. It will fail with + /// InvalidArgument if the type of the value is not String. + /// + /// + /// Requires an active script context. + /// + /// + /// The string + public new string ToString() + { + IntPtr buffer; + UIntPtr length; + + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStringToPointer(this, out buffer, out length)); + + return Marshal.PtrToStringAuto(buffer, (int)length); + } + + /// + /// Retrieves a object representation of an Object value + /// + /// + /// Requires an active script context. + /// + /// The object representation of the value + public object ToObject() + { + object value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsValueToVariant(this, out value)); + + return value; + } + + /// + /// Converts a value to Boolean using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public EdgeJsValue ConvertToBoolean() + { + EdgeJsValue booleanReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConvertValueToBoolean(this, out booleanReference)); + + return booleanReference; + } + + /// + /// Converts a value to Number using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public EdgeJsValue ConvertToNumber() + { + EdgeJsValue numberReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConvertValueToNumber(this, out numberReference)); + + return numberReference; + } + + /// + /// Converts a value to String using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public EdgeJsValue ConvertToString() + { + EdgeJsValue stringReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConvertValueToString(this, out stringReference)); + + return stringReference; + } + + /// + /// Converts a value to Object using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public EdgeJsValue ConvertToObject() + { + EdgeJsValue objectReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConvertValueToObject(this, out objectReference)); + + return objectReference; + } + + /// + /// Sets a object to not be extensible + /// + /// + /// Requires an active script context. + /// + public void PreventExtension() + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsPreventExtension(this)); + } + + /// + /// Gets a property descriptor for an object's own property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property descriptor + public EdgeJsValue GetOwnPropertyDescriptor(EdgeJsPropertyId propertyId) + { + EdgeJsValue descriptorReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetOwnPropertyDescriptor(this, propertyId, out descriptorReference)); + + return descriptorReference; + } + + /// + /// Gets a list of all properties on the object + /// + /// + /// Requires an active script context. + /// + /// An array of property names + public EdgeJsValue GetOwnPropertyNames() + { + EdgeJsValue propertyNamesReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetOwnPropertyNames(this, out propertyNamesReference)); + + return propertyNamesReference; + } + + /// + /// Determines whether an object has a property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// Whether the object (or a prototype) has the property + public bool HasProperty(EdgeJsPropertyId propertyId) + { + bool hasProperty; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsHasProperty(this, propertyId, out hasProperty)); + + return hasProperty; + } + + /// + /// Gets a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The value of the property + public EdgeJsValue GetProperty(EdgeJsPropertyId id) + { + EdgeJsValue propertyReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetProperty(this, id, out propertyReference)); + + return propertyReference; + } + + /// + /// Sets a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The new value of the property + /// The property set should follow strict mode rules + public void SetProperty(EdgeJsPropertyId id, EdgeJsValue value, bool useStrictRules) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetProperty(this, id, value, useStrictRules)); + } + + /// + /// Deletes a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property set should follow strict mode rules + /// Whether the property was deleted + public EdgeJsValue DeleteProperty(EdgeJsPropertyId propertyId, bool useStrictRules) + { + EdgeJsValue returnReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsDeleteProperty(this, propertyId, useStrictRules, out returnReference)); + + return returnReference; + } + + /// + /// Defines a new object's own property from a property descriptor + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property descriptor + /// Whether the property was defined + public bool DefineProperty(EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor) + { + bool result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsDefineProperty(this, propertyId, propertyDescriptor, out result)); + + return result; + } + + /// + /// Test if an object has a value at the specified index + /// + /// + /// Requires an active script context. + /// + /// The index to test + /// Whether the object has an value at the specified index + public bool HasIndexedProperty(EdgeJsValue index) + { + bool hasProperty; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsHasIndexedProperty(this, index, out hasProperty)); + + return hasProperty; + } + + /// + /// Retrieve a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to retrieve + /// The retrieved value + public EdgeJsValue GetIndexedProperty(EdgeJsValue index) + { + EdgeJsValue propertyReference; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsGetIndexedProperty(this, index, out propertyReference)); + + return propertyReference; + } + + /// + /// Sets a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to set + /// The value to set + public void SetIndexedProperty(EdgeJsValue index, EdgeJsValue value) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSetIndexedProperty(this, index, value)); + } + + /// + /// Delete a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to delete + public void DeleteIndexedProperty(EdgeJsValue index) + { + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsDeleteIndexedProperty(this, index)); + } + + /// + /// Compare two JavaScript values for equality + /// + /// + /// + /// This function is equivalent to the "==" operator in JavaScript. + /// + /// + /// Requires an active script context. + /// + /// + /// The object to compare + /// Whether the values are equal + public bool Equals(EdgeJsValue other) + { + bool equals; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsEquals(this, other, out equals)); + + return equals; + } + + /// + /// Compare two JavaScript values for strict equality + /// + /// + /// + /// This function is equivalent to the "===" operator in JavaScript. + /// + /// + /// Requires an active script context. + /// + /// + /// The object to compare + /// Whether the values are strictly equal + public bool StrictEquals(EdgeJsValue other) + { + bool equals; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStrictEquals(this, other, out equals)); + + return equals; + } + + /// + /// Invokes a function + /// + /// + /// Requires an active script context. + /// + /// The arguments to the call + /// The Value returned from the function invocation, if any + public EdgeJsValue CallFunction(params EdgeJsValue[] arguments) + { + EdgeJsValue returnReference; + + if (arguments.Length > ushort.MaxValue) + { + throw new ArgumentOutOfRangeException("arguments"); + } + + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCallFunction(this, arguments, (ushort)arguments.Length, out returnReference)); + + return returnReference; + } + + /// + /// Invokes a function as a constructor + /// + /// + /// Requires an active script context. + /// + /// The arguments to the call + /// The Value returned from the function invocation + public EdgeJsValue ConstructObject(params EdgeJsValue[] arguments) + { + EdgeJsValue returnReference; + + if (arguments.Length > ushort.MaxValue) + { + throw new ArgumentOutOfRangeException("arguments"); + } + + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConstructObject(this, arguments, (ushort)arguments.Length, out returnReference)); + + return returnReference; + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs new file mode 100644 index 0000000..5fac1cd --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -0,0 +1,274 @@ +namespace MsieJavaScriptEngine.JsRt.Edge +{ + using System; + using System.Runtime.InteropServices; + + using JsRt; + + /// + /// “Edge” native methods + /// + internal static class EdgeNativeMethods + { + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDisposeRuntime(EdgeJsRuntime handle); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntimeMemoryUsage(EdgeJsRuntime runtime, out UIntPtr memoryUsage); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntimeMemoryLimit(EdgeJsRuntime runtime, out UIntPtr memoryLimit); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRelease(EdgeJsValue reference, out uint count); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateContext(EdgeJsRuntime runtime, out EdgeJsContext newContext); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetCurrentContext(out EdgeJsContext currentContext); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetCurrentContext(EdgeJsContext context); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntime(EdgeJsContext context, out EdgeJsRuntime runtime); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStartDebugging(); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIdle(out uint nextIdleTick); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetNullValue(out EdgeJsValue nullValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetTrueValue(out EdgeJsValue trueValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetFalseValue(out EdgeJsValue falseValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsBoolToBoolean(bool value, out EdgeJsValue booleanValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsBooleanToBool(EdgeJsValue booleanValue, out bool boolValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToBoolean(EdgeJsValue value, out EdgeJsValue booleanValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetValueType(EdgeJsValue value, out JsValueType type); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out EdgeJsValue value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIntToNumber(int intValue, out EdgeJsValue value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPrototype(EdgeJsValue obj, out EdgeJsValue prototypeObject); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetPrototype(EdgeJsValue obj, EdgeJsValue prototypeObject); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetExtensionAllowed(EdgeJsValue obj, out bool value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStrictEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasExternalData(EdgeJsValue obj, out bool value); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetExternalData(EdgeJsValue obj, out IntPtr externalData); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetExternalData(EdgeJsValue obj, IntPtr externalData); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateRangeError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateReferenceError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateSyntaxError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateTypeError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateURIError(EdgeJsValue message, out EdgeJsValue error); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasException(out bool hasException); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetAndClearException(out EdgeJsValue exception); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetException(EdgeJsValue exception); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDisableRuntimeExecution(EdgeJsRuntime runtime); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEnableRuntimeExecution(EdgeJsRuntime runtime); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStopProfiling(int reason); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); + + [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs new file mode 100644 index 0000000..a6cb347 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs @@ -0,0 +1,57 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + using System.Runtime.InteropServices; + + /// + /// IActiveScriptProfilerCallback COM interface + /// + [Guid("740eca23-7d9d-42e5-ba9d-f8b24b1c7a9b")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IActiveScriptProfilerCallback + { + /// + /// Called when the profile is started + /// + /// The context provided when profiling was started + void Initialize(uint context); + + /// + /// Called when profiling is stopped + /// + /// The reason code provided when profiling was stopped + void Shutdown(uint reason); + + /// + /// Called when a script is compiled + /// + /// The ID of the script + /// The type of the script + /// The debug document context, if any + void ScriptCompiled(int scriptId, ProfilerScriptType type, IntPtr debugDocumentContext); + + /// + /// Called when a function is compiled + /// + /// The ID of the function + /// The ID of the script + /// The name of the function + /// The function name hint + /// The debug document context, if any + void FunctionCompiled(int functionId, int scriptId, [MarshalAs(UnmanagedType.LPWStr)] string functionName, [MarshalAs(UnmanagedType.LPWStr)] string functionNameHint, IntPtr debugDocumentContext); + + /// + /// Called when a function is entered + /// + /// The ID of the script + /// The ID of the function + void OnFunctionEnter(int scriptId, int functionId); + + /// + /// Called when a function is exited + /// + /// The ID of the script + /// The ID of the function + void OnFunctionExit(int scriptId, int functionId); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs new file mode 100644 index 0000000..bdb942d --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs @@ -0,0 +1,25 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System.Runtime.InteropServices; + + /// + /// IActiveScriptProfilerCallback2 COM interface + /// + [Guid("31B7F8AD-A637-409C-B22F-040995B6103D")] + internal interface IActiveScriptProfilerCallback2 : IActiveScriptProfilerCallback + { + /// + /// Called when a function is entered by name + /// + /// The name of the function + /// The type of the function + void OnFunctionEnterByName(string functionName, ProfilerScriptType type); + + /// + /// Called when a function is exited by name + /// + /// The name of the function + /// The type of the function + void OnFunctionExitByName(string functionName, ProfilerScriptType type); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs new file mode 100644 index 0000000..d1d2671 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs @@ -0,0 +1,13 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System.Diagnostics.CodeAnalysis; + using System.Runtime.InteropServices; + + /// + /// IActiveScriptProfilerHeapEnum COM interface + /// + [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Name defined in COM.")] + [Guid("32E4694E-0D37-419B-B93D-FA20DED6E8EA")] + internal interface IActiveScriptProfilerHeapEnum + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngine.cs b/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs similarity index 62% rename from MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngine.cs rename to MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 34f47a3..611dc83 100644 --- a/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngine.cs +++ b/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.JsRt +namespace MsieJavaScriptEngine.JsRt.Ie { using System; using System.Globalization; @@ -9,14 +9,14 @@ using Utilities; /// - /// JsRT version of Chakra JavaScript engine + /// “IE” JsRT version of Chakra JavaScript engine /// - internal sealed class ChakraJsRtJsEngine : IInnerJsEngine + internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine { /// /// Name of JavaScript engine mode /// - const string ENGINE_MODE_NAME = JsEngineModeName.ChakraJsRt; + const string ENGINE_MODE_NAME = JsEngineModeName.ChakraIeJsRt; /// /// Lowest supported version of Internet Explorer @@ -26,12 +26,12 @@ internal sealed class ChakraJsRtJsEngine : IInnerJsEngine /// /// Instance of JavaScript runtime /// - private JavaScriptRuntime _jsRuntime; + private IeJsRuntime _jsRuntime; /// /// Instance of JavaScript context /// - private readonly JavaScriptContext _jsContext; + private readonly IeJsContext _jsContext; /// /// Synchronizer @@ -45,25 +45,25 @@ internal sealed class ChakraJsRtJsEngine : IInnerJsEngine /// - /// Constructs instance of the Chakra JsRT JavaScript engine + /// Constructs instance of the Chakra “IE” JsRT JavaScript engine /// - public ChakraJsRtJsEngine() + public ChakraIeJsRtJsEngine() { try { _jsRuntime = CreateJsRuntime(); _jsContext = _jsRuntime.CreateContext(); } - catch (JavaScriptUsageException e) + catch (JsUsageException e) { string errorMessage; - if (e.ErrorCode == JavaScriptErrorCode.WrongThread) + if (e.ErrorCode == JsErrorCode.WrongThread) { errorMessage = Strings.Runtime_JsEnginesChakraJsRtAndActiveScriptConflict; } else { - errorMessage = string.Format(Strings.Runtime_JsEngineNotLoaded, + errorMessage = string.Format(Strings.Runtime_IeJsEngineNotLoaded, ENGINE_MODE_NAME, LOWER_IE_VERSION, e.Message); } @@ -72,15 +72,15 @@ public ChakraJsRtJsEngine() catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_JsEngineNotLoaded, + string.Format(Strings.Runtime_IeJsEngineNotLoaded, ENGINE_MODE_NAME, LOWER_IE_VERSION, e.Message), ENGINE_MODE_NAME); } } /// - /// Destructs instance of the Chakra JsRT JavaScript engine + /// Destructs instance of the Chakra “IE” JsRT JavaScript engine /// - ~ChakraJsRtJsEngine() + ~ChakraIeJsRtJsEngine() { Dispose(false); } @@ -90,16 +90,16 @@ public ChakraJsRtJsEngine() /// Creates a instance of JavaScript runtime with special settings /// /// Instance of JavaScript runtime with special settings - private static JavaScriptRuntime CreateJsRuntime() + private static IeJsRuntime CreateJsRuntime() { - var jsRuntime = JavaScriptRuntime.Create(JavaScriptRuntimeAttributes.AllowScriptInterrupt, - JavaScriptRuntimeVersion.VersionEdge, null); + var jsRuntime = IeJsRuntime.Create(JsRuntimeAttributes.AllowScriptInterrupt, + JsRuntimeVersion.VersionEdge, null); return jsRuntime; } /// - /// Checks a support of the Chakra JsRT JavaScript engine + /// Checks a support of the Chakra “IE” JsRT JavaScript engine /// /// Result of check (true - supports; false - does not support) public static bool IsSupported() @@ -126,16 +126,16 @@ public static bool IsSupported() /// /// The source value /// The mapped value - private static JavaScriptValue MapToScriptType(object value) + private static IeJsValue MapToScriptType(object value) { if (value == null) { - return JavaScriptValue.Null; + return IeJsValue.Null; } if (value is Undefined) { - return JavaScriptValue.Undefined; + return IeJsValue.Undefined; } var typeCode = Type.GetTypeCode(value.GetType()); @@ -143,15 +143,15 @@ private static JavaScriptValue MapToScriptType(object value) switch (typeCode) { case TypeCode.Boolean: - return JavaScriptValue.FromBoolean((bool)value); + return IeJsValue.FromBoolean((bool)value); case TypeCode.Int32: - return JavaScriptValue.FromInt32((int)value); + return IeJsValue.FromInt32((int)value); case TypeCode.Double: - return JavaScriptValue.FromDouble((double)value); + return IeJsValue.FromDouble((double)value); case TypeCode.String: - return JavaScriptValue.FromString((string)value); + return IeJsValue.FromString((string)value); default: - return JavaScriptValue.FromObject(value); + return IeJsValue.FromObject(value); } } @@ -160,36 +160,36 @@ private static JavaScriptValue MapToScriptType(object value) /// /// The source value /// The mapped value - private static object MapToHostType(JavaScriptValue value) + private static object MapToHostType(IeJsValue value) { - JavaScriptValueType valueType = value.ValueType; - JavaScriptValue processedValue; + JsValueType valueType = value.ValueType; + IeJsValue processedValue; object result; switch (valueType) { - case JavaScriptValueType.Null: + case JsValueType.Null: result = null; break; - case JavaScriptValueType.Undefined: + case JsValueType.Undefined: result = Undefined.Value; break; - case JavaScriptValueType.Boolean: + case JsValueType.Boolean: processedValue = value.ConvertToBoolean(); result = processedValue.ToBoolean(); break; - case JavaScriptValueType.Number: + case JsValueType.Number: processedValue = value.ConvertToNumber(); result = processedValue.ToDouble(); break; - case JavaScriptValueType.String: + case JsValueType.String: processedValue = value.ConvertToString(); result = processedValue.ToString(); break; - case JavaScriptValueType.Object: - case JavaScriptValueType.Function: - case JavaScriptValueType.Error: - case JavaScriptValueType.Array: + case JsValueType.Object: + case JsValueType.Function: + case JsValueType.Error: + case JsValueType.Array: processedValue = value.ConvertToObject(); result = processedValue.ToObject(); break; @@ -200,8 +200,8 @@ private static object MapToHostType(JavaScriptValue value) return result; } - private JsRuntimeException ConvertJavaScriptExceptionToJsRuntimeException( - JavaScriptException jsException) + private JsRuntimeException ConvertJsExceptionToJsRuntimeException( + JsException jsException) { string message = jsException.Message; string category = string.Empty; @@ -209,51 +209,50 @@ private JsRuntimeException ConvertJavaScriptExceptionToJsRuntimeException( int columnNumber = 0; string sourceFragment = string.Empty; - if (jsException is JavaScriptScriptException) + var jsScriptException = jsException as IeJsScriptException; + if (jsScriptException != null) { category = "Script error"; + IeJsValue errorValue = jsScriptException.Error; - var jsScriptException = (JavaScriptScriptException)jsException; - JavaScriptValue errorValue = jsScriptException.Error; - - JavaScriptPropertyId messagePropertyId = JavaScriptPropertyId.FromString("message"); - JavaScriptValue messagePropertyValue = errorValue.GetProperty(messagePropertyId); + IeJsPropertyId messagePropertyId = IeJsPropertyId.FromString("message"); + IeJsValue messagePropertyValue = errorValue.GetProperty(messagePropertyId); string scriptMessage = messagePropertyValue.ConvertToString().ToString(); if (!string.IsNullOrWhiteSpace(scriptMessage)) { message = string.Format("{0}: {1}", message.TrimEnd('.'), scriptMessage); } - JavaScriptPropertyId linePropertyId = JavaScriptPropertyId.FromString("line"); + IeJsPropertyId linePropertyId = IeJsPropertyId.FromString("line"); if (errorValue.HasProperty(linePropertyId)) { - JavaScriptValue linePropertyValue = errorValue.GetProperty(linePropertyId); + IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; } - JavaScriptPropertyId columnPropertyId = JavaScriptPropertyId.FromString("column"); + IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); if (errorValue.HasProperty(columnPropertyId)) { - JavaScriptValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; } - JavaScriptPropertyId sourcePropertyId = JavaScriptPropertyId.FromString("source"); + IeJsPropertyId sourcePropertyId = IeJsPropertyId.FromString("source"); if (errorValue.HasProperty(sourcePropertyId)) { - JavaScriptValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); + IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); sourceFragment = sourcePropertyValue.ConvertToString().ToString(); } } - else if (jsException is JavaScriptUsageException) + else if (jsException is JsUsageException) { category = "Usage error"; } - else if (jsException is JavaScriptEngineException) + else if (jsException is JsEngineException) { category = "Engine error"; } - else if (jsException is JavaScriptFatalException) + else if (jsException is JsFatalException) { category = "Fatal error"; } @@ -274,15 +273,15 @@ private JsRuntimeException ConvertJavaScriptExceptionToJsRuntimeException( private void InvokeScript(Action action) { lock (_synchronizer) - using (new JavaScriptContext.Scope(_jsContext)) + using (new IeJsScope(_jsContext)) { try { action(); } - catch (JavaScriptException e) + catch (JsException e) { - throw ConvertJavaScriptExceptionToJsRuntimeException(e); + throw ConvertJsExceptionToJsRuntimeException(e); } } } @@ -290,15 +289,15 @@ private void InvokeScript(Action action) private T InvokeScript(Func func) { lock (_synchronizer) - using (new JavaScriptContext.Scope(_jsContext)) + using (new IeJsScope(_jsContext)) { try { return func(); } - catch (JavaScriptException e) + catch (JsException e) { - throw ConvertJavaScriptExceptionToJsRuntimeException(e); + throw ConvertJsExceptionToJsRuntimeException(e); } } } @@ -332,7 +331,7 @@ public object Evaluate(string expression) { object result = InvokeScript(() => { - JavaScriptValue resultValue = JavaScriptContext.RunScript(expression); + IeJsValue resultValue = IeJsContext.RunScript(expression); return MapToHostType(resultValue); }); @@ -342,7 +341,7 @@ public object Evaluate(string expression) public void Execute(string code) { - InvokeScript(() => JavaScriptContext.RunScript(code)); + InvokeScript(() => IeJsContext.RunScript(code)); } public object CallFunction(string functionName, params object[] args) @@ -383,14 +382,14 @@ public bool HasVariable(string variableName) { bool result = InvokeScript(() => { - JavaScriptValue globalObj = JavaScriptValue.GlobalObject; - JavaScriptPropertyId variableId = JavaScriptPropertyId.FromString(variableName); + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); bool variableExist = globalObj.HasProperty(variableId); if (variableExist) { - JavaScriptValue variableValue = globalObj.GetProperty(variableId); - variableExist = (variableValue.ValueType != JavaScriptValueType.Undefined); + IeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = (variableValue.ValueType != JsValueType.Undefined); } return variableExist; @@ -403,8 +402,8 @@ public object GetVariableValue(string variableName) { object result = InvokeScript(() => { - JavaScriptPropertyId variableId = JavaScriptPropertyId.FromString(variableName); - JavaScriptValue variableValue = JavaScriptValue.GlobalObject.GetProperty(variableId); + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableId); return MapToHostType(variableValue); }); @@ -416,10 +415,10 @@ public void SetVariableValue(string variableName, object value) { InvokeScript(() => { - JavaScriptPropertyId variableId = JavaScriptPropertyId.FromString(variableName); - JavaScriptValue inputValue = MapToScriptType(value); + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + IeJsValue inputValue = MapToScriptType(value); - JavaScriptValue.GlobalObject.SetProperty(variableId, inputValue, true); + IeJsValue.GlobalObject.SetProperty(variableId, inputValue, true); }); } @@ -427,12 +426,12 @@ public void RemoveVariable(string variableName) { InvokeScript(() => { - JavaScriptValue globalObj = JavaScriptValue.GlobalObject; - JavaScriptPropertyId variableId = JavaScriptPropertyId.FromString(variableName); + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); if (globalObj.HasProperty(variableId)) { - globalObj.SetProperty(variableId, JavaScriptValue.Undefined, true); + globalObj.SetProperty(variableId, IeJsValue.Undefined, true); } }); } diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs b/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs new file mode 100644 index 0000000..fd3ae56 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs @@ -0,0 +1,11 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IDebugApplication32 COM interface + /// + [Guid("51973C32-CB0C-11d0-B5C9-00A0244A0E7A")] + internal interface IDebugApplication32 + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs b/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs new file mode 100644 index 0000000..29bd944 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs @@ -0,0 +1,11 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IDebugApplication64 COM interface + /// + [Guid("4dedc754-04c7-4f10-9e60-16a390fe6e62")] + internal interface IDebugApplication64 + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs b/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs new file mode 100644 index 0000000..fb8d0bc --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs @@ -0,0 +1,11 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IDebugDocumentHelper32 COM interface + /// + [Guid("51973C26-CB0C-11d0-B5C9-00A0244A0E7A")] + internal interface IDebugDocumentHelper32 + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs b/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs new file mode 100644 index 0000000..6d024f0 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs @@ -0,0 +1,11 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IDebugDocumentHelper64 COM interface + /// + [Guid("c4c7363c-20fd-47f9-bd82-4855e0150871")] + internal interface IDebugDocumentHelper64 + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs b/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs new file mode 100644 index 0000000..fee3744 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs @@ -0,0 +1,44 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IProcessDebugManager32 COM interface + /// + [Guid("51973C2f-CB0C-11d0-B5C9-00A0244A0E7A")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IProcessDebugManager32 + { + /// + /// Creates a new debug application + /// + /// The new debug application + void CreateApplication(out IDebugApplication32 debugApplication); + + /// + /// Gets a default debug application + /// + /// The default debug application + void GetDefaultApplication(out IDebugApplication32 debugApplication); + + /// + /// Adds a new debug application + /// + /// The new debug application + /// An engine-defined cookie + void AddApplication(IDebugApplication32 debugApplication, out uint cookie); + + /// + /// Removes a debug application + /// + /// The cookie of the debug application to remove + void RemoveApplication(uint cookie); + + /// + /// Creates a debug document helper + /// + /// The outer unknown + /// The new debug document helper + void CreateDebugDocumentHelper(object outerUnknown, out IDebugDocumentHelper32 helper); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs b/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs new file mode 100644 index 0000000..413576f --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs @@ -0,0 +1,44 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// IProcessDebugManager64 COM interface + /// + [Guid("56b9fC1C-63A9-4CC1-AC21-087D69A17FAB")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IProcessDebugManager64 + { + /// + /// Creates a new debug application + /// + /// The new debug application + void CreateApplication(out IDebugApplication64 debugApplication); + + /// + /// Gets a default debug application + /// + /// The default debug application + void GetDefaultApplication(out IDebugApplication64 debugApplication); + + /// + /// Adds a new debug application + /// + /// The new debug application + /// An engine-defined cookie + void AddApplication(IDebugApplication64 debugApplication, out uint cookie); + + /// + /// Removes a debug application + /// + /// The cookie of the debug application to remove + void RemoveApplication(uint cookie); + + /// + /// Creates a debug document helper + /// + /// The outer unknown + /// The new debug document helper + void CreateDebugDocumentHelper(object outerUnknown, out IDebugDocumentHelper64 helper); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs new file mode 100644 index 0000000..5e0b626 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -0,0 +1,467 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + + /// + /// “IE” script context + /// + /// + /// + /// Each script context contains its own global object, distinct from the global object in + /// other script contexts. + /// + /// + /// Many Chakra hosting APIs require an "active" script context, which can be set using + /// Current. Chakra hosting APIs that require a current context to be set will note + /// that explicitly in their documentation. + /// + /// + internal struct IeJsContext + { + /// + /// The reference + /// + private readonly IntPtr _reference; + + /// + /// Gets a invalid context + /// + public static IeJsContext Invalid + { + get { return new IeJsContext(IntPtr.Zero); } + } + + /// + /// Gets or sets a current script context on the thread + /// + public static IeJsContext Current + { + get + { + IeJsContext reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetCurrentContext(out reference)); + + return reference; + } + set + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetCurrentContext(value)); + } + } + + /// + /// Gets a value indicating whether the runtime of the current context is in an exception state + /// + /// + /// + /// If a call into the runtime results in an exception (either as the result of running a + /// script or due to something like a conversion failure), the runtime is placed into an + /// "exception state." All calls into any context created by the runtime (except for the + /// exception APIs) will fail with InExceptionState until the exception is + /// cleared. + /// + /// + /// If the runtime of the current context is in the exception state when a callback returns + /// into the engine, the engine will automatically rethrow the exception. + /// + /// + /// Requires an active script context. + /// + /// + public static bool HasException + { + get + { + bool hasException; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsHasException(out hasException)); + + return hasException; + } + } + + /// + /// Gets a value indicating whether the heap of the current context is being enumerated + /// + /// + /// Requires an active script context. + /// + public static bool IsEnumeratingHeap + { + get + { + bool isEnumerating; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsIsEnumeratingHeap(out isEnumerating)); + + return isEnumerating; + } + } + + /// + /// Gets a runtime that the context belongs to + /// + public IeJsRuntime Runtime + { + get + { + IeJsRuntime handle; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetRuntime(this, out handle)); + + return handle; + } + } + + /// + /// Gets a value indicating whether the context is a valid context or not + /// + public bool IsValid + { + get { return _reference != IntPtr.Zero; } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The reference + internal IeJsContext(IntPtr reference) + { + _reference = reference; + } + + + /// + /// Tells a runtime to do any idle processing it need to do + /// + /// + /// + /// If idle processing has been enabled for the current runtime, calling Idle will + /// inform the current runtime that the host is idle and that the runtime can perform + /// memory cleanup tasks. + /// + /// + /// Idle will also return the number of system ticks until there will be more idle work + /// for the runtime to do. Calling Idle before this number of ticks has passed will do + /// no work. + /// + /// + /// Requires an active script context. + /// + /// + /// The next system tick when there will be more idle work to do. Returns the + /// maximum number of ticks if there no upcoming idle work to do. + public static uint Idle() + { + uint ticks; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsIdle(out ticks)); + + return ticks; + } + + /// + /// Parses a script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The Function representing the script code + public static IeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) + { + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseScript(script, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Parses a serialized script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The serialized script + /// The cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// The Function representing the script code + public static IeJsValue ParseScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + { + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Parses a script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The Function representing the script code + public static IeJsValue ParseScript(string script) + { + return ParseScript(script, JsSourceContext.None, string.Empty); + } + + /// + /// Parses a serialized script and returns a Function representing the script + /// + /// + /// Requires an active script context. + /// + /// The script to parse + /// The serialized script + /// The Function representing the script code + public static IeJsValue ParseScript(string script, byte[] buffer) + { + return ParseScript(script, buffer, JsSourceContext.None, string.Empty); + } + + /// + /// Executes a script + /// + /// + /// Requires an active script context. + /// + /// The script to run + /// The cookie identifying the script that can be used by script contexts that have debugging enabled + /// The location the script came from + /// The result of the script, if any + public static IeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) + { + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunScript(script, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Runs a serialized script + /// + /// + /// Requires an active script context. + /// + /// The source code of the serialized script + /// The serialized script + /// The cookie identifying the script that can be used by script contexts that have debugging enabled + /// The location the script came from + /// The result of the script, if any + public static IeJsValue RunScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + { + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, sourceName, out result)); + + return result; + } + + /// + /// Executes a script + /// + /// + /// Requires an active script context. + /// + /// The script to run + /// The result of the script, if any + public static IeJsValue RunScript(string script) + { + return RunScript(script, JsSourceContext.None, string.Empty); + } + + /// + /// Runs a serialized script + /// + /// + /// Requires an active script context. + /// + /// The source code of the serialized script + /// The serialized script + /// The result of the script, if any + public static IeJsValue RunScript(string script, byte[] buffer) + { + return RunScript(script, buffer, JsSourceContext.None, string.Empty); + } + + /// + /// Serializes a parsed script to a buffer than can be reused + /// + /// + /// + /// SerializeScript parses a script and then stores the parsed form of the script in a + /// runtime-independent format. The serialized script then can be deserialized in any + /// runtime without requiring the script to be re-parsed. + /// + /// + /// Requires an active script context. + /// + /// + /// The script to serialize + /// The buffer to put the serialized script into. Can be null. + /// The size of the buffer, in bytes, required to hold the serialized script + public static ulong SerializeScript(string script, byte[] buffer) + { + var bufferSize = (ulong)buffer.Length; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize)); + + return bufferSize; + } + + /// + /// Returns a exception that caused the runtime of the current context to be in the + /// exception state and resets the exception state for that runtime + /// + /// + /// + /// If the runtime of the current context is not in an exception state, this API will throw + /// JsErrorInvalidArgument. If the runtime is disabled, this will return an exception + /// indicating that the script was terminated, but it will not clear the exception (the + /// exception will be cleared if the runtime is re-enabled using + /// EnableRuntimeExecution). + /// + /// + /// Requires an active script context. + /// + /// + /// The exception for the runtime of the current context + public static IeJsValue GetAndClearException() + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetAndClearException(out reference)); + + return reference; + } + + /// + /// Sets a runtime of the current context to an exception state + /// + /// + /// + /// If the runtime of the current context is already in an exception state, this API will + /// throw JsErrorInExceptionState. + /// + /// + /// Requires an active script context. + /// + /// + /// The JavaScript exception to set for the runtime of the current context + public static void SetException(IeJsValue exception) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetException(exception)); + } + + /// + /// Starts debugging in the context + /// + /// The debug application to use for debugging + public static void StartDebugging(IDebugApplication64 debugApplication) + { + if (!Environment.Is64BitProcess) + { + throw new InvalidOperationException(); + } + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication)); + } + + /// + /// Starts debugging in the context + /// + /// The debug application to use for debugging + public static void StartDebugging(IDebugApplication32 debugApplication) + { + if (Environment.Is64BitProcess) + { + throw new InvalidOperationException(); + } + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication)); + } + + /// + /// Starts profiling in the current context + /// + /// + /// Requires an active script context. + /// + /// The profiling callback to use + /// The profiling events to callback with + /// The context to pass to the profiling callback + public static void StartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartProfiling(callback, eventMask, context)); + } + + /// + /// Stops profiling in the current context + /// + /// + /// + /// Will not return an error if profiling has not started. + /// + /// + /// Requires an active script context. + /// + /// + /// The reason for stopping profiling to pass to the profiler callback + public static void StopProfiling(int reason) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStopProfiling(reason)); + } + + /// + /// Enumerates a heap of the current context + /// + /// + /// + /// While the heap is being enumerated, the current context cannot be removed, and all calls to + /// modify the state of the context will fail until the heap enumerator is released. + /// + /// + /// Requires an active script context. + /// + /// + /// The heap enumerator + public static IActiveScriptProfilerHeapEnum EnumerateHeap() + { + IActiveScriptProfilerHeapEnum enumerator; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsEnumerateHeap(out enumerator)); + + return enumerator; + } + + /// + /// Adds a reference to a script context + /// + /// + /// Calling AddRef ensures that the context will not be freed until Release is called. + /// + /// The object's new reference count + public uint AddRef() + { + uint count; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsContextAddRef(this, out count)); + + return count; + } + + /// + /// Releases a reference to a script context + /// + /// + /// Removes a reference to a context that was created by AddRef. + /// + /// The object's new reference count + public uint Release() + { + uint count; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsContextRelease(this, out count)); + + return count; + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs new file mode 100644 index 0000000..0709541 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs @@ -0,0 +1,116 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + /// + /// “IE” error helpers + /// + internal static class IeJsErrorHelpers + { + /// + /// Throws if a native method returns an error code + /// + /// The error + public static void ThrowIfError(JsErrorCode error) + { + if (error != JsErrorCode.NoError) + { + switch (error) + { + case JsErrorCode.InvalidArgument: + throw new JsUsageException(error, "Invalid argument."); + + case JsErrorCode.NullArgument: + throw new JsUsageException(error, "Null argument."); + + case JsErrorCode.NoCurrentContext: + throw new JsUsageException(error, "No current context."); + + case JsErrorCode.InExceptionState: + throw new JsUsageException(error, "Runtime is in exception state."); + + case JsErrorCode.NotImplemented: + throw new JsUsageException(error, "Method is not implemented."); + + case JsErrorCode.WrongThread: + throw new JsUsageException(error, "Runtime is active on another thread."); + + case JsErrorCode.RuntimeInUse: + throw new JsUsageException(error, "Runtime is in use."); + + case JsErrorCode.BadSerializedScript: + throw new JsUsageException(error, "Bad serialized script."); + + case JsErrorCode.InDisabledState: + throw new JsUsageException(error, "Runtime is disabled."); + + case JsErrorCode.CannotDisableExecution: + throw new JsUsageException(error, "Cannot disable execution."); + + case JsErrorCode.AlreadyDebuggingContext: + throw new JsUsageException(error, "Context is already in debug mode."); + + case JsErrorCode.HeapEnumInProgress: + throw new JsUsageException(error, "Heap enumeration is in progress."); + + case JsErrorCode.ArgumentNotObject: + throw new JsUsageException(error, "Argument is not an object."); + + case JsErrorCode.InProfileCallback: + throw new JsUsageException(error, "In a profile callback."); + + case JsErrorCode.InThreadServiceCallback: + throw new JsUsageException(error, "In a thread service callback."); + + case JsErrorCode.CannotSerializeDebugScript: + throw new JsUsageException(error, "Cannot serialize a debug script."); + + case JsErrorCode.AlreadyProfilingContext: + throw new JsUsageException(error, "Already profiling this context."); + + case JsErrorCode.IdleNotEnabled: + throw new JsUsageException(error, "Idle is not enabled."); + + case JsErrorCode.OutOfMemory: + throw new JsEngineException(error, "Out of memory."); + + case JsErrorCode.ScriptException: + { + IeJsValue errorObject; + JsErrorCode innerError = IeNativeMethods.JsGetAndClearException(out errorObject); + + if (innerError != JsErrorCode.NoError) + { + throw new JsFatalException(innerError); + } + + throw new IeJsScriptException(error, errorObject, "Script threw an exception."); + } + + case JsErrorCode.ScriptCompile: + { + IeJsValue errorObject; + JsErrorCode innerError = IeNativeMethods.JsGetAndClearException(out errorObject); + + if (innerError != JsErrorCode.NoError) + { + throw new JsFatalException(innerError); + } + + throw new IeJsScriptException(error, errorObject, "Compile error."); + } + + case JsErrorCode.ScriptTerminated: + throw new IeJsScriptException(error, IeJsValue.Invalid, "Script was terminated."); + + case JsErrorCode.ScriptEvalDisabled: + throw new IeJsScriptException(error, IeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + + case JsErrorCode.Fatal: + throw new JsFatalException(error); + + default: + throw new JsFatalException(error); + } + } + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs new file mode 100644 index 0000000..55b9429 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs @@ -0,0 +1,16 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + using System.Runtime.InteropServices; + + /// + /// “IE” function callback + /// + /// The Function object that represents the function being invoked + /// Indicates whether this is a regular call or a 'new' call + /// The arguments to the call + /// The number of arguments + /// Callback data, if any + /// The result of the call, if any + internal delegate IeJsValue IeJsNativeFunction(IeJsValue callee, bool isConstructCall, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] IeJsValue[] arguments, ushort argumentCount, IntPtr callbackData); +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs new file mode 100644 index 0000000..dd5b10a --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs @@ -0,0 +1,150 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + using System.Runtime.InteropServices; + + /// + /// “IE” property identifier + /// + /// + /// Property identifiers are used to refer to properties of JavaScript objects instead of using + /// strings. + /// + internal struct IeJsPropertyId : IEquatable + { + /// + /// The id + /// + private readonly IntPtr _id; + + /// + /// Gets a invalid ID + /// + public static IeJsPropertyId Invalid + { + get { return new IeJsPropertyId(IntPtr.Zero); } + } + + /// + /// Gets a name associated with the property ID + /// + /// + /// + /// Requires an active script context. + /// + /// + public string Name + { + get + { + IntPtr buffer; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetPropertyNameFromId(this, out buffer)); + + return Marshal.PtrToStringAuto(buffer); + } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The ID + internal IeJsPropertyId(IntPtr id) + { + _id = id; + } + + + /// + /// Gets a property ID associated with the name + /// + /// + /// + /// Property IDs are specific to a context and cannot be used across contexts. + /// + /// + /// Requires an active script context. + /// + /// + /// + /// The name of the property ID to get or create. The name may consist of only digits. + /// + /// The property ID in this runtime for the given name + public static IeJsPropertyId FromString(string name) + { + IeJsPropertyId id; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetPropertyIdFromName(name, out id)); + + return id; + } + + /// + /// The equality operator for property IDs + /// + /// The first property ID to compare + /// The second property ID to compare + /// Whether the two property IDs are the same + public static bool operator ==(IeJsPropertyId left, IeJsPropertyId right) + { + return left.Equals(right); + } + + /// + /// The inequality operator for property IDs + /// + /// The first property ID to compare + /// The second property ID to compare + /// Whether the two property IDs are not the same + public static bool operator !=(IeJsPropertyId left, IeJsPropertyId right) + { + return !left.Equals(right); + } + + /// + /// Checks for equality between property IDs + /// + /// The other property ID to compare + /// Whether the two property IDs are the same + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is IeJsPropertyId && Equals((IeJsPropertyId)obj); + } + + /// + /// The hash code + /// + /// The hash code of the property ID + public override int GetHashCode() + { + return _id.ToInt32(); + } + + /// + /// Converts a property ID to a string + /// + /// The name of the property ID + public override string ToString() + { + return Name; + } + + #region IEquatable implementation + + /// + /// Checks for equality between property IDs + /// + /// The other property ID to compare + /// Whether the two property IDs are the same + public bool Equals(IeJsPropertyId other) + { + return _id == other._id; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptRuntime.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs similarity index 59% rename from MsieJavaScriptEngine/JsRt/JavaScriptRuntime.cs rename to MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs index a1687d0..2e4f30f 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptRuntime.cs +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.JsRt +namespace MsieJavaScriptEngine.JsRt.Ie { using System; /// - /// A Chakra runtime. + /// “IE” Chakra runtime /// /// /// @@ -15,20 +15,20 @@ /// time. /// /// - /// NOTE: A JavaScriptRuntime, unlike other objects in the Chakra hosting API, is not + /// NOTE: A , unlike other objects in the Chakra hosting API, is not /// garbage collected since it contains the garbage collected heap itself. A runtime will /// continue to exist until Dispose is called. /// /// - internal struct JavaScriptRuntime : IDisposable + internal struct IeJsRuntime : IDisposable { /// - /// The handle. + /// The handle /// private IntPtr _handle; /// - /// Gets a value indicating whether the runtime is valid. + /// Gets a value indicating whether the runtime is valid /// public bool IsValid { @@ -36,7 +36,7 @@ public bool IsValid } /// - /// Gets the current memory usage for a runtime. + /// Gets a current memory usage for a runtime /// /// /// Memory usage can be always be retrieved, regardless of whether or not the runtime is active @@ -47,13 +47,14 @@ public UIntPtr MemoryUsage get { UIntPtr memoryUsage; - Native.ThrowIfError(Native.JsGetRuntimeMemoryUsage(this, out memoryUsage)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetRuntimeMemoryUsage(this, out memoryUsage)); + return memoryUsage; } } /// - /// Gets or sets the current memory limit for a runtime. + /// Gets or sets a current memory limit for a runtime /// /// /// The memory limit of a runtime can be always be retrieved, regardless of whether or not the @@ -64,94 +65,80 @@ public UIntPtr MemoryLimit get { UIntPtr memoryLimit; - Native.ThrowIfError(Native.JsGetRuntimeMemoryLimit(this, out memoryLimit)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetRuntimeMemoryLimit(this, out memoryLimit)); + return memoryLimit; } - set { - Native.ThrowIfError(Native.JsSetRuntimeMemoryLimit(this, value)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetRuntimeMemoryLimit(this, value)); } } /// - /// Gets or sets a value indicating whether script execution is disabled in the runtime. + /// Gets or sets a value indicating whether script execution is disabled in the runtime /// public bool Disabled { get { bool isDisabled; - Native.ThrowIfError(Native.JsIsRuntimeExecutionDisabled(this, out isDisabled)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsIsRuntimeExecutionDisabled(this, out isDisabled)); + return isDisabled; } - set { - Native.ThrowIfError(value - ? Native.JsDisableRuntimeExecution(this) - : Native.JsEnableRuntimeExecution(this)); + IeJsErrorHelpers.ThrowIfError(value ? + IeNativeMethods.JsDisableRuntimeExecution(this) + : + IeNativeMethods.JsEnableRuntimeExecution(this) + ); } } + /// - /// Creates a new runtime. + /// Creates a new runtime /// - /// The attributes of the runtime to be created. - /// The version of the runtime to be created. + /// The attributes of the runtime to be created + /// The version of the runtime to be created /// The thread service for the runtime. Can be null. - /// The runtime created. - public static JavaScriptRuntime Create(JavaScriptRuntimeAttributes attributes, JavaScriptRuntimeVersion version, JavaScriptThreadServiceCallback threadServiceCallback) + /// The runtime created + public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersion version, JsThreadServiceCallback threadServiceCallback) { - JavaScriptRuntime handle; - Native.ThrowIfError(Native.JsCreateRuntime(attributes, version, threadServiceCallback, out handle)); + IeJsRuntime handle; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateRuntime(attributes, version, threadServiceCallback, out handle)); + return handle; } /// - /// Creates a new runtime. + /// Creates a new runtime /// - /// The attributes of the runtime to be created. - /// The version of the runtime to be created. - /// The runtime created. - public static JavaScriptRuntime Create(JavaScriptRuntimeAttributes attributes, JavaScriptRuntimeVersion version) + /// The attributes of the runtime to be created + /// The version of the runtime to be created + /// The runtime created + public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersion version) { return Create(attributes, version, null); } /// - /// Creates a new runtime. + /// Creates a new runtime /// - /// The runtime created. - public static JavaScriptRuntime Create() + /// The runtime created + public static IeJsRuntime Create() { - return Create(JavaScriptRuntimeAttributes.None, JavaScriptRuntimeVersion.Version11, null); - } - - /// - /// Disposes a runtime. - /// - /// - /// Once a runtime has been disposed, all resources owned by it are invalid and cannot be used. - /// If the runtime is active (i.e. it is set to be current on a particular thread), it cannot - /// be disposed. - /// - public void Dispose() - { - if (IsValid) - { - Native.ThrowIfError(Native.JsDisposeRuntime(this)); - } - - _handle = IntPtr.Zero; + return Create(JsRuntimeAttributes.None, JsRuntimeVersion.Version11, null); } /// - /// Performs a full garbage collection. + /// Performs a full garbage collection /// public void CollectGarbage() { - Native.ThrowIfError(Native.JsCollectGarbage(this)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCollectGarbage(this)); } /// @@ -175,18 +162,18 @@ public void CollectGarbage() /// /// /// - /// User provided state that will be passed back to the callback. + /// User provided state that will be passed back to the callback /// /// - /// Memory allocation callback to be called for memory allocation events. + /// Memory allocation callback to be called for memory allocation events /// - public void SetMemoryAllocationCallback(IntPtr callbackState, JavaScriptMemoryAllocationCallback allocationCallback) + public void SetMemoryAllocationCallback(IntPtr callbackState, JsMemoryAllocationCallback allocationCallback) { - Native.ThrowIfError(Native.JsSetRuntimeMemoryAllocationCallback(this, callbackState, allocationCallback)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetRuntimeMemoryAllocationCallback(this, callbackState, allocationCallback)); } /// - /// Sets a callback function that is called by the runtime before garbage collection. + /// Sets a callback function that is called by the runtime before garbage collection /// /// /// @@ -198,71 +185,95 @@ public void SetMemoryAllocationCallback(IntPtr callbackState, JavaScriptMemoryAl /// releasing unnecessary references on Chakra objects. /// /// - /// - /// User provided state that will be passed back to the callback. - /// - /// The callback function being set. - public void SetBeforeCollectCallback(IntPtr callbackState, JavaScriptBeforeCollectCallback beforeCollectCallback) + /// User provided state that will be passed back to the callback + /// The callback function being set + public void SetBeforeCollectCallback(IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback) { - Native.ThrowIfError(Native.JsSetRuntimeBeforeCollectCallback(this, callbackState, beforeCollectCallback)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetRuntimeBeforeCollectCallback(this, callbackState, beforeCollectCallback)); } /// - /// Creates a debug script context for running scripts. + /// Creates a debug script context for running scripts /// /// /// Each script context has its own global object that is isolated from all other script /// contexts. /// - /// The debug application to use. - /// The created script context. - public JavaScriptContext CreateContext(Native.IDebugApplication64 debugApplication) + /// The debug application to use + /// The created script context + public IeJsContext CreateContext(IDebugApplication64 debugApplication) { - JavaScriptContext reference; + IeJsContext reference; if (!Environment.Is64BitProcess) { throw new InvalidOperationException(); } - Native.ThrowIfError(Native.JsCreateContext(this, debugApplication, out reference)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateContext(this, debugApplication, out reference)); + return reference; } /// - /// Creates a debug script context for running scripts. + /// Creates a debug script context for running scripts /// /// /// Each script context has its own global object that is isolated from all other script /// contexts. /// - /// The debug application to use. - /// The created script context. - public JavaScriptContext CreateContext(Native.IDebugApplication32 debugApplication) + /// The debug application to use + /// The created script context + public IeJsContext CreateContext(IDebugApplication32 debugApplication) { - JavaScriptContext reference; + IeJsContext reference; if (Environment.Is64BitProcess) { throw new InvalidOperationException(); } - Native.ThrowIfError(Native.JsCreateContext(this, debugApplication, out reference)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateContext(this, debugApplication, out reference)); + return reference; } /// - /// Creates a script context for running scripts. + /// Creates a script context for running scripts /// /// /// Each script context has its own global object that is isolated from all other script /// contexts. /// - /// The created script context. - public JavaScriptContext CreateContext() + /// The created script context + public IeJsContext CreateContext() { - JavaScriptContext reference; - Native.ThrowIfError( - Environment.Is64BitProcess - ? Native.JsCreateContext(this, (Native.IDebugApplication64)null, out reference) - : Native.JsCreateContext(this, (Native.IDebugApplication32)null, out reference)); + IeJsContext reference; + IeJsErrorHelpers.ThrowIfError(Environment.Is64BitProcess ? + IeNativeMethods.JsCreateContext(this, (IDebugApplication64)null, out reference) + : + IeNativeMethods.JsCreateContext(this, (IDebugApplication32)null, out reference) + ); + return reference; } + + #region IDisposable implementation + + /// + /// Disposes a runtime + /// + /// + /// Once a runtime has been disposed, all resources owned by it are invalid and cannot be used. + /// If the runtime is active (i.e. it is set to be current on a particular thread), it cannot + /// be disposed. + /// + public void Dispose() + { + if (IsValid) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsDisposeRuntime(this)); + } + + _handle = IntPtr.Zero; + } + + #endregion } } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs new file mode 100644 index 0000000..97f2ea6 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs @@ -0,0 +1,51 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + + /// + /// “IE” scope automatically sets a context to current and resets the original context + /// when disposed + /// + internal struct IeJsScope : IDisposable + { + /// + /// The previous context + /// + private readonly IeJsContext _previousContext; + + /// + /// Whether the structure has been disposed + /// + private bool _disposed; + + + /// + /// Initializes a new instance of the struct + /// + /// The context to create the scope for + public IeJsScope(IeJsContext context) + { + _disposed = false; + _previousContext = IeJsContext.Current; + IeJsContext.Current = context; + } + + #region IDisposable implementation + + /// + /// Disposes the scope and sets the previous context to current + /// + public void Dispose() + { + if (_disposed) + { + return; + } + + IeJsContext.Current = _previousContext; + _disposed = true; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs new file mode 100644 index 0000000..a560286 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs @@ -0,0 +1,57 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + using System.Runtime.Serialization; + + /// + /// IE script exception + /// + [Serializable] + internal sealed class IeJsScriptException : JsException + { + /// + /// The error + /// + [NonSerialized] + private readonly IeJsValue _error; + + /// + /// Gets a JavaScript object representing the script error + /// + public IeJsValue Error + { + get { return _error; } + } + + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The JavaScript error object + public IeJsScriptException(JsErrorCode code, IeJsValue error) + : this(code, error, "JavaScript Exception") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The JavaScript error object + /// The error message + public IeJsScriptException(JsErrorCode code, IeJsValue error, string message) + : base(code, message) + { + _error = error; + } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + private IeJsScriptException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs new file mode 100644 index 0000000..67e0d3f --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -0,0 +1,931 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + using System.Runtime.InteropServices; + + /// + /// “IE” JavaScript value + /// + /// + /// The JavaScript value is one of the following types of values: Undefined, Null, Boolean, + /// String, Number, or Object. + /// + internal struct IeJsValue + { + /// + /// The reference + /// + private readonly IntPtr _reference; + + /// + /// Gets a invalid value + /// + public static IeJsValue Invalid + { + get { return new IeJsValue(IntPtr.Zero); } + } + + /// + /// Gets a value of undefined in the current script context + /// + /// + /// Requires an active script context. + /// + public static IeJsValue Undefined + { + get + { + IeJsValue value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetUndefinedValue(out value)); + + return value; + } + } + + /// + /// Gets a value of null in the current script context + /// + /// + /// Requires an active script context. + /// + public static IeJsValue Null + { + get + { + IeJsValue value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetNullValue(out value)); + + return value; + } + } + + /// + /// Gets a value of true in the current script context + /// + /// + /// Requires an active script context. + /// + public static IeJsValue True + { + get + { + IeJsValue value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetTrueValue(out value)); + + return value; + } + } + + /// + /// Gets a value of false in the current script context + /// + /// + /// Requires an active script context. + /// + public static IeJsValue False + { + get + { + IeJsValue value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetFalseValue(out value)); + + return value; + } + } + + /// + /// Gets a global object in the current script context + /// + /// + /// Requires an active script context. + /// + public static IeJsValue GlobalObject + { + get + { + IeJsValue value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetGlobalObject(out value)); + + return value; + } + } + + /// + /// Gets a value indicating whether the value is valid + /// + public bool IsValid + { + get { return _reference != IntPtr.Zero; } + } + + /// + /// Gets a JavaScript type of the value + /// + /// + /// Requires an active script context. + /// + /// The type of the value + public JsValueType ValueType + { + get + { + JsValueType type; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetValueType(this, out type)); + + return type; + } + } + + /// + /// Gets a length of a String value + /// + /// + /// Requires an active script context. + /// + /// The length of the string + public int StringLength + { + get + { + int length; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetStringLength(this, out length)); + + return length; + } + } + + /// + /// Gets or sets a prototype of an object + /// + /// + /// Requires an active script context. + /// + public IeJsValue Prototype + { + get + { + IeJsValue prototypeReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetPrototype(this, out prototypeReference)); + + return prototypeReference; + } + set + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetPrototype(this, value)); + } + } + + /// + /// Gets a value indicating whether an object is extensible or not + /// + /// + /// Requires an active script context. + /// + public bool IsExtensionAllowed + { + get + { + bool allowed; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetExtensionAllowed(this, out allowed)); + + return allowed; + } + } + + /// + /// Gets a value indicating whether an object is an external object + /// + /// + /// Requires an active script context. + /// + public bool HasExternalData + { + get + { + bool hasExternalData; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsHasExternalData(this, out hasExternalData)); + + return hasExternalData; + } + } + + /// + /// Gets or sets the data in an external object + /// + /// + /// Requires an active script context. + /// + public IntPtr ExternalData + { + get + { + IntPtr data; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetExternalData(this, out data)); + + return data; + } + set + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetExternalData(this, value)); + } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The reference + private IeJsValue(IntPtr reference) + { + _reference = reference; + } + + + /// + /// Creates a Boolean value from a bool value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The converted value + public static IeJsValue FromBoolean(bool value) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsBoolToBoolean(value, out reference)); + + return reference; + } + + /// + /// Creates a Number value from a double value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The new Number value + public static IeJsValue FromDouble(double value) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsDoubleToNumber(value, out reference)); + + return reference; + } + + /// + /// Creates a Number value from a int value + /// + /// + /// Requires an active script context. + /// + /// The value to be converted + /// The new Number value + public static IeJsValue FromInt32(int value) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsIntToNumber(value, out reference)); + + return reference; + } + + /// + /// Creates a String value from a string pointer + /// + /// + /// Requires an active script context. + /// + /// The string to convert to a String value + /// The new String value + public static IeJsValue FromString(string value) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsPointerToString(value, new UIntPtr((uint)value.Length), out reference)); + + return reference; + } + + /// + /// Creates a JavaScript value that is a projection of the passed in object + /// + /// + /// Requires an active script context. + /// + /// The object to be projected + /// The JavaScript value that is a projection of the object + public static IeJsValue FromObject(object value) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsVariantToValue(ref value, out reference)); + + return reference; + } + + /// + /// Creates a new Object + /// + /// + /// Requires an active script context. + /// + /// The new Object + public static IeJsValue CreateObject() + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateObject(out reference)); + + return reference; + } + + /// + /// Creates a new Object that stores some external data + /// + /// + /// Requires an active script context. + /// + /// External data that the object will represent. May be null. + /// A callback for when the object is finalized. May be null. + /// The new Object + public static IeJsValue CreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizer) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateExternalObject(data, finalizer, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript function + /// + /// + /// Requires an active script context. + /// + /// The method to call when the function is invoked + /// The new function object + public static IeJsValue CreateFunction(IeJsNativeFunction function) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateFunction(function, IntPtr.Zero, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript function + /// + /// + /// Requires an active script context. + /// + /// The method to call when the function is invoked + /// Data to be provided to all function callbacks + /// The new function object + public static IeJsValue CreateFunction(IeJsNativeFunction function, IntPtr callbackData) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateFunction(function, callbackData, out reference)); + + return reference; + } + + /// + /// Creates a JavaScript array object + /// + /// + /// Requires an active script context + /// + /// The initial length of the array + /// The new array object + public static IeJsValue CreateArray(uint length) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateArray(length, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript RangeError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateRangeError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateRangeError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript ReferenceError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateReferenceError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateReferenceError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript SyntaxError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateSyntaxError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateSyntaxError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript TypeError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateTypeError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateTypeError(message, out reference)); + + return reference; + } + + /// + /// Creates a new JavaScript URIError error object + /// + /// + /// Requires an active script context. + /// + /// Message for the error object + /// The new error object + public static IeJsValue CreateUriError(IeJsValue message) + { + IeJsValue reference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateURIError(message, out reference)); + + return reference; + } + + /// + /// Adds a reference to the object + /// + /// + /// This only needs to be called on objects that are not going to be stored somewhere on + /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed + /// until Release is called + /// + /// The object's new reference count + public uint AddRef() + { + uint count; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsAddRef(this, out count)); + + return count; + } + + /// + /// Releases a reference to the object + /// + /// + /// Removes a reference that was created by AddRef. + /// + /// The object's new reference count + public uint Release() + { + uint count; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRelease(this, out count)); + + return count; + } + + /// + /// Retrieves a bool value of a Boolean value + /// + /// + /// Requires an active script context. + /// + /// The converted value + public bool ToBoolean() + { + bool value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsBooleanToBool(this, out value)); + + return value; + } + + /// + /// Retrieves a double value of a Number value + /// + /// + /// + /// This function retrieves the value of a Number value. It will fail with + /// InvalidArgument if the type of the value is not Number. + /// + /// + /// Requires an active script context. + /// + /// + /// The double value + public double ToDouble() + { + double value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsNumberToDouble(this, out value)); + + return value; + } + + /// + /// Retrieves a string pointer of a String value + /// + /// + /// + /// This function retrieves the string pointer of a String value. It will fail with + /// InvalidArgument if the type of the value is not String. + /// + /// + /// Requires an active script context. + /// + /// + /// The string + public new string ToString() + { + IntPtr buffer; + UIntPtr length; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStringToPointer(this, out buffer, out length)); + + return Marshal.PtrToStringAuto(buffer, (int)length); + } + + /// + /// Retrieves a object representation of an Object value + /// + /// + /// Requires an active script context. + /// + /// The object representation of the value + public object ToObject() + { + object value; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsValueToVariant(this, out value)); + + return value; + } + + /// + /// Converts a value to Boolean using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public IeJsValue ConvertToBoolean() + { + IeJsValue booleanReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConvertValueToBoolean(this, out booleanReference)); + + return booleanReference; + } + + /// + /// Converts a value to Number using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public IeJsValue ConvertToNumber() + { + IeJsValue numberReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConvertValueToNumber(this, out numberReference)); + + return numberReference; + } + + /// + /// Converts a value to String using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public IeJsValue ConvertToString() + { + IeJsValue stringReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConvertValueToString(this, out stringReference)); + + return stringReference; + } + + /// + /// Converts a value to Object using regular JavaScript semantics + /// + /// + /// Requires an active script context. + /// + /// The converted value + public IeJsValue ConvertToObject() + { + IeJsValue objectReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConvertValueToObject(this, out objectReference)); + + return objectReference; + } + + /// + /// Sets a object to not be extensible + /// + /// + /// Requires an active script context. + /// + public void PreventExtension() + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsPreventExtension(this)); + } + + /// + /// Gets a property descriptor for an object's own property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property descriptor + public IeJsValue GetOwnPropertyDescriptor(IeJsPropertyId propertyId) + { + IeJsValue descriptorReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetOwnPropertyDescriptor(this, propertyId, out descriptorReference)); + + return descriptorReference; + } + + /// + /// Gets a list of all properties on the object + /// + /// + /// Requires an active script context. + /// + /// The array of property names + public IeJsValue GetOwnPropertyNames() + { + IeJsValue propertyNamesReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetOwnPropertyNames(this, out propertyNamesReference)); + + return propertyNamesReference; + } + + /// + /// Determines whether an object has a property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// Whether the object (or a prototype) has the property + public bool HasProperty(IeJsPropertyId propertyId) + { + bool hasProperty; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsHasProperty(this, propertyId, out hasProperty)); + + return hasProperty; + } + + /// + /// Gets a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The value of the property + public IeJsValue GetProperty(IeJsPropertyId id) + { + IeJsValue propertyReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetProperty(this, id, out propertyReference)); + + return propertyReference; + } + + /// + /// Sets a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The new value of the property + /// The property set should follow strict mode rules + public void SetProperty(IeJsPropertyId id, IeJsValue value, bool useStrictRules) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetProperty(this, id, value, useStrictRules)); + } + + /// + /// Deletes a object's property + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property set should follow strict mode rules + /// Whether the property was deleted + public IeJsValue DeleteProperty(IeJsPropertyId propertyId, bool useStrictRules) + { + IeJsValue returnReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsDeleteProperty(this, propertyId, useStrictRules, out returnReference)); + + return returnReference; + } + + /// + /// Defines a new object's own property from a property descriptor + /// + /// + /// Requires an active script context. + /// + /// The ID of the property + /// The property descriptor + /// Whether the property was defined + public bool DefineProperty(IeJsPropertyId propertyId, IeJsValue propertyDescriptor) + { + bool result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsDefineProperty(this, propertyId, propertyDescriptor, out result)); + + return result; + } + + /// + /// Test if an object has a value at the specified index + /// + /// + /// Requires an active script context. + /// + /// The index to test + /// Whether the object has an value at the specified index + public bool HasIndexedProperty(IeJsValue index) + { + bool hasProperty; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsHasIndexedProperty(this, index, out hasProperty)); + + return hasProperty; + } + + /// + /// Retrieve a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to retrieve + /// The retrieved value + public IeJsValue GetIndexedProperty(IeJsValue index) + { + IeJsValue propertyReference; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsGetIndexedProperty(this, index, out propertyReference)); + + return propertyReference; + } + + /// + /// Set a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to set + /// The value to set + public void SetIndexedProperty(IeJsValue index, IeJsValue value) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSetIndexedProperty(this, index, value)); + } + + /// + /// Deletes a value at the specified index of an object + /// + /// + /// Requires an active script context. + /// + /// The index to delete + public void DeleteIndexedProperty(IeJsValue index) + { + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsDeleteIndexedProperty(this, index)); + } + + /// + /// Compare two JavaScript values for equality + /// + /// + /// + /// This function is equivalent to the "==" operator in JavaScript. + /// + /// + /// Requires an active script context. + /// + /// + /// The object to compare + /// Whether the values are equal + public bool Equals(IeJsValue other) + { + bool equals; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsEquals(this, other, out equals)); + + return equals; + } + + /// + /// Compare two JavaScript values for strict equality + /// + /// + /// + /// This function is equivalent to the "===" operator in JavaScript. + /// + /// + /// Requires an active script context. + /// + /// + /// The object to compare + /// Whether the values are strictly equal + public bool StrictEquals(IeJsValue other) + { + bool equals; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStrictEquals(this, other, out equals)); + + return equals; + } + + /// + /// Invokes a function + /// + /// + /// Requires an active script context. + /// + /// The arguments to the call + /// The Value returned from the function invocation, if any + public IeJsValue CallFunction(params IeJsValue[] arguments) + { + IeJsValue returnReference; + + if (arguments.Length > ushort.MaxValue) + { + throw new ArgumentOutOfRangeException("arguments"); + } + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCallFunction(this, arguments, (ushort)arguments.Length, out returnReference)); + + return returnReference; + } + + /// + /// Invokes a function as a constructor + /// + /// + /// Requires an active script context. + /// + /// The arguments to the call + /// The Value returned from the function invocation + public IeJsValue ConstructObject(params IeJsValue[] arguments) + { + IeJsValue returnReference; + + if (arguments.Length > ushort.MaxValue) + { + throw new ArgumentOutOfRangeException("arguments"); + } + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConstructObject(this, arguments, (ushort)arguments.Length, out returnReference)); + + return returnReference; + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs new file mode 100644 index 0000000..f4e5806 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -0,0 +1,280 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System; + using System.Runtime.InteropServices; + + using JsRt; + + /// + /// “IE” native methods + /// + internal static class IeNativeMethods + { + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDisposeRuntime(IeJsRuntime handle); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntimeMemoryUsage(IeJsRuntime runtime, out UIntPtr memoryUsage); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntimeMemoryLimit(IeJsRuntime runtime, out UIntPtr memoryLimit); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetCurrentContext(IeJsContext context); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetRuntime(IeJsContext context, out IeJsRuntime runtime); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStartDebugging(IDebugApplication64 debugApplication); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStartDebugging(IDebugApplication32 debugApplication); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIdle(out uint nextIdleTick); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetNullValue(out IeJsValue nullValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetTrueValue(out IeJsValue trueValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetFalseValue(out IeJsValue falseValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsBoolToBoolean(bool value, out IeJsValue booleanValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsBooleanToBool(IeJsValue booleanValue, out bool boolValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToBoolean(IeJsValue value, out IeJsValue booleanValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetValueType(IeJsValue value, out JsValueType type); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out IeJsValue value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIntToNumber(int intValue, out IeJsValue value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsNumberToDouble(IeJsValue value, out double doubleValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToNumber(IeJsValue value, out IeJsValue numberValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPrototype(IeJsValue obj, out IeJsValue prototypeObject); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetPrototype(IeJsValue obj, IeJsValue prototypeObject); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetExtensionAllowed(IeJsValue obj, out bool value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDeleteIndexedProperty(IeJsValue obj, IeJsValue index); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEquals(IeJsValue obj1, IeJsValue obj2, out bool result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStrictEquals(IeJsValue obj1, IeJsValue obj2, out bool result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasExternalData(IeJsValue obj, out bool value); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetExternalData(IeJsValue obj, out IntPtr externalData); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetExternalData(IeJsValue obj, IntPtr externalData); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateRangeError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateReferenceError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateSyntaxError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateTypeError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsCreateURIError(IeJsValue message, out IeJsValue error); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsHasException(out bool hasException); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetAndClearException(out IeJsValue exception); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSetException(IeJsValue exception); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsDisableRuntimeExecution(IeJsRuntime runtime); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEnableRuntimeExecution(IeJsRuntime runtime); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStopProfiling(int reason); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); + + [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs b/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs new file mode 100644 index 0000000..602032b --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs @@ -0,0 +1,12 @@ +namespace MsieJavaScriptEngine.JsRt.Ie +{ + using System.Runtime.InteropServices; + + /// + /// ProcessDebugManager COM interface + /// + [ComImport] + [Guid("78A51822-51F4-11D0-8F20-00805F2CD064")] + internal class ProcessDebugManager + { } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptContext.cs b/MsieJavaScriptEngine/JsRt/JavaScriptContext.cs deleted file mode 100644 index e3793c2..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptContext.cs +++ /dev/null @@ -1,506 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - - /// - /// A script context. - /// - /// - /// - /// Each script context contains its own global object, distinct from the global object in - /// other script contexts. - /// - /// - /// Many Chakra hosting APIs require an "active" script context, which can be set using - /// Current. Chakra hosting APIs that require a current context to be set will note - /// that explicitly in their documentation. - /// - /// - internal struct JavaScriptContext - { - /// - /// The reference. - /// - private readonly IntPtr _reference; - - /// - /// Initializes a new instance of the struct. - /// - /// The reference. - internal JavaScriptContext(IntPtr reference) - { - _reference = reference; - } - - /// - /// Gets an invalid context. - /// - public static JavaScriptContext Invalid - { - get { return new JavaScriptContext(IntPtr.Zero); } - } - - /// - /// Gets or sets the current script context on the thread. - /// - public static JavaScriptContext Current - { - get - { - JavaScriptContext reference; - Native.ThrowIfError(Native.JsGetCurrentContext(out reference)); - return reference; - } - - set - { - Native.ThrowIfError(Native.JsSetCurrentContext(value)); - } - } - - /// - /// Gets a value indicating whether the runtime of the current context is in an exception state. - /// - /// - /// - /// If a call into the runtime results in an exception (either as the result of running a - /// script or due to something like a conversion failure), the runtime is placed into an - /// "exception state." All calls into any context created by the runtime (except for the - /// exception APIs) will fail with InExceptionState until the exception is - /// cleared. - /// - /// - /// If the runtime of the current context is in the exception state when a callback returns - /// into the engine, the engine will automatically rethrow the exception. - /// - /// - /// Requires an active script context. - /// - /// - public static bool HasException - { - get - { - bool hasException; - Native.ThrowIfError(Native.JsHasException(out hasException)); - return hasException; - } - } - - /// - /// Gets a value indicating whether the heap of the current context is being enumerated. - /// - /// - /// Requires an active script context. - /// - public static bool IsEnumeratingHeap - { - get - { - bool isEnumerating; - Native.ThrowIfError(Native.JsIsEnumeratingHeap(out isEnumerating)); - return isEnumerating; - } - } - - /// - /// Gets the runtime that the context belongs to. - /// - public JavaScriptRuntime Runtime - { - get - { - JavaScriptRuntime handle; - Native.ThrowIfError(Native.JsGetRuntime(this, out handle)); - return handle; - } - } - - /// - /// Gets a value indicating whether the context is a valid context or not. - /// - public bool IsValid - { - get { return _reference != IntPtr.Zero; } - } - - /// - /// Tells the runtime to do any idle processing it need to do. - /// - /// - /// - /// If idle processing has been enabled for the current runtime, calling Idle will - /// inform the current runtime that the host is idle and that the runtime can perform - /// memory cleanup tasks. - /// - /// - /// Idle will also return the number of system ticks until there will be more idle work - /// for the runtime to do. Calling Idle before this number of ticks has passed will do - /// no work. - /// - /// - /// Requires an active script context. - /// - /// - /// - /// The next system tick when there will be more idle work to do. Returns the - /// maximum number of ticks if there no upcoming idle work to do. - /// - public static uint Idle() - { - uint ticks; - Native.ThrowIfError(Native.JsIdle(out ticks)); - return ticks; - } - - /// - /// Parses a script and returns a Function representing the script. - /// - /// - /// Requires an active script context. - /// - /// The script to parse. - /// - /// A cookie identifying the script that can be used by script contexts that have debugging enabled. - /// - /// The location the script came from. - /// A Function representing the script code. - public static JavaScriptValue ParseScript(string script, JavaScriptSourceContext sourceContext, string sourceName) - { - JavaScriptValue result; - Native.ThrowIfError(Native.JsParseScript(script, sourceContext, sourceName, out result)); - return result; - } - - /// - /// Parses a serialized script and returns a Function representing the script. - /// - /// - /// Requires an active script context. - /// - /// The script to parse. - /// The serialized script. - /// - /// A cookie identifying the script that can be used by script contexts that have debugging enabled. - /// - /// The location the script came from. - /// A Function representing the script code. - public static JavaScriptValue ParseScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceName) - { - JavaScriptValue result; - Native.ThrowIfError(Native.JsParseSerializedScript(script, buffer, sourceContext, sourceName, out result)); - return result; - } - - /// - /// Parses a script and returns a Function representing the script. - /// - /// - /// Requires an active script context. - /// - /// The script to parse. - /// A Function representing the script code. - public static JavaScriptValue ParseScript(string script) - { - return ParseScript(script, JavaScriptSourceContext.None, string.Empty); - } - - /// - /// Parses a serialized script and returns a Function representing the script. - /// - /// - /// Requires an active script context. - /// - /// The script to parse. - /// The serialized script. - /// A Function representing the script code. - public static JavaScriptValue ParseScript(string script, byte[] buffer) - { - return ParseScript(script, buffer, JavaScriptSourceContext.None, string.Empty); - } - - /// - /// Executes a script. - /// - /// - /// Requires an active script context. - /// - /// The script to run. - /// - /// A cookie identifying the script that can be used by script contexts that have debugging enabled. - /// - /// The location the script came from. - /// The result of the script, if any. - public static JavaScriptValue RunScript(string script, JavaScriptSourceContext sourceContext, string sourceName) - { - JavaScriptValue result; - Native.ThrowIfError(Native.JsRunScript(script, sourceContext, sourceName, out result)); - return result; - } - - /// - /// Runs a serialized script. - /// - /// - /// Requires an active script context. - /// - /// The source code of the serialized script. - /// The serialized script. - /// - /// A cookie identifying the script that can be used by script contexts that have debugging enabled. - /// - /// The location the script came from. - /// The result of the script, if any. - public static JavaScriptValue RunScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceName) - { - JavaScriptValue result; - Native.ThrowIfError(Native.JsRunSerializedScript(script, buffer, sourceContext, sourceName, out result)); - return result; - } - - /// - /// Executes a script. - /// - /// - /// Requires an active script context. - /// - /// The script to run. - /// The result of the script, if any. - public static JavaScriptValue RunScript(string script) - { - return RunScript(script, JavaScriptSourceContext.None, string.Empty); - } - - /// - /// Runs a serialized script. - /// - /// - /// Requires an active script context. - /// - /// The source code of the serialized script. - /// The serialized script. - /// The result of the script, if any. - public static JavaScriptValue RunScript(string script, byte[] buffer) - { - return RunScript(script, buffer, JavaScriptSourceContext.None, string.Empty); - } - - /// - /// Serializes a parsed script to a buffer than can be reused. - /// - /// - /// - /// SerializeScript parses a script and then stores the parsed form of the script in a - /// runtime-independent format. The serialized script then can be deserialized in any - /// runtime without requiring the script to be re-parsed. - /// - /// - /// Requires an active script context. - /// - /// - /// The script to serialize. - /// The buffer to put the serialized script into. Can be null. - /// - /// The size of the buffer, in bytes, required to hold the serialized script. - /// - public static ulong SerializeScript(string script, byte[] buffer) - { - var bufferSize = (ulong)buffer.Length; - Native.ThrowIfError(Native.JsSerializeScript(script, buffer, ref bufferSize)); - return bufferSize; - } - - /// - /// Returns the exception that caused the runtime of the current context to be in the - /// exception state and resets the exception state for that runtime. - /// - /// - /// - /// If the runtime of the current context is not in an exception state, this API will throw - /// JsErrorInvalidArgument. If the runtime is disabled, this will return an exception - /// indicating that the script was terminated, but it will not clear the exception (the - /// exception will be cleared if the runtime is re-enabled using - /// EnableRuntimeExecution). - /// - /// - /// Requires an active script context. - /// - /// - /// The exception for the runtime of the current context. - public static JavaScriptValue GetAndClearException() - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsGetAndClearException(out reference)); - return reference; - } - - /// - /// Sets the runtime of the current context to an exception state. - /// - /// - /// - /// If the runtime of the current context is already in an exception state, this API will - /// throw JsErrorInExceptionState. - /// - /// - /// Requires an active script context. - /// - /// - /// - /// The JavaScript exception to set for the runtime of the current context. - /// - public static void SetException(JavaScriptValue exception) - { - Native.ThrowIfError(Native.JsSetException(exception)); - } - - /// - /// Starts debugging in the context. - /// - /// The debug application to use for debugging. - public static void StartDebugging(Native.IDebugApplication64 debugApplication) - { - if (!Environment.Is64BitProcess) - { - throw new InvalidOperationException(); - } - Native.ThrowIfError(Native.JsStartDebugging(debugApplication)); - } - - /// - /// Starts debugging in the context. - /// - /// The debug application to use for debugging. - public static void StartDebugging(Native.IDebugApplication32 debugApplication) - { - if (Environment.Is64BitProcess) - { - throw new InvalidOperationException(); - } - Native.ThrowIfError(Native.JsStartDebugging(debugApplication)); - } - - /// - /// Starts profiling in the current context. - /// - /// - /// Requires an active script context. - /// - /// The profiling callback to use. - /// The profiling events to callback with. - /// A context to pass to the profiling callback. - public static void StartProfiling(Native.IActiveScriptProfilerCallback callback, Native.ProfilerEventMask eventMask, int context) - { - Native.ThrowIfError(Native.JsStartProfiling(callback, eventMask, context)); - } - - /// - /// Stops profiling in the current context. - /// - /// - /// - /// Will not return an error if profiling has not started. - /// - /// - /// Requires an active script context. - /// - /// - /// - /// The reason for stopping profiling to pass to the profiler callback. - /// - public static void StopProfiling(int reason) - { - Native.ThrowIfError(Native.JsStopProfiling(reason)); - } - - /// - /// Enumerates the heap of the current context. - /// - /// - /// - /// While the heap is being enumerated, the current context cannot be removed, and all calls to - /// modify the state of the context will fail until the heap enumerator is released. - /// - /// - /// Requires an active script context. - /// - /// - /// A heap enumerator. - public static Native.IActiveScriptProfilerHeapEnum EnumerateHeap() - { - Native.IActiveScriptProfilerHeapEnum enumerator; - Native.ThrowIfError(Native.JsEnumerateHeap(out enumerator)); - return enumerator; - } - - /// - /// Adds a reference to a script context. - /// - /// - /// Calling AddRef ensures that the context will not be freed until Release is called. - /// - /// The object's new reference count. - public uint AddRef() - { - uint count; - Native.ThrowIfError(Native.JsContextAddRef(this, out count)); - return count; - } - - /// - /// Releases a reference to a script context. - /// - /// - /// Removes a reference to a context that was created by AddRef. - /// - /// The object's new reference count. - public uint Release() - { - uint count; - Native.ThrowIfError(Native.JsContextRelease(this, out count)); - return count; - } - - /// - /// A scope automatically sets a context to current and resets the original context - /// when disposed. - /// - internal struct Scope : IDisposable - { - /// - /// The previous context. - /// - private readonly JavaScriptContext _previousContext; - - /// - /// Whether the structure has been disposed. - /// - private bool _disposed; - - /// - /// Initializes a new instance of the struct. - /// - /// The context to create the scope for. - public Scope(JavaScriptContext context) - { - _disposed = false; - _previousContext = Current; - Current = context; - } - - /// - /// Disposes the scope and sets the previous context to current. - /// - public void Dispose() - { - if (_disposed) - { - return; - } - - Current = _previousContext; - _disposed = true; - } - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptEngineException.cs b/MsieJavaScriptEngine/JsRt/JavaScriptEngineException.cs deleted file mode 100644 index 054ba7b..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptEngineException.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; - - /// - /// An exception that occurred in the workings of the JavaScript engine itself. - /// - [Serializable] - internal sealed class JavaScriptEngineException : JavaScriptException - { - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - public JavaScriptEngineException(JavaScriptErrorCode code) : - this(code, "A fatal exception has occurred in a JavaScript runtime") - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The error message. - public JavaScriptEngineException(JavaScriptErrorCode code, string message) : - base(code, message) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The serialization info. - /// The streaming context. - private JavaScriptEngineException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptException.cs b/MsieJavaScriptEngine/JsRt/JavaScriptException.cs deleted file mode 100644 index 623d5d2..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptException.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; - - /// - /// An exception returned from the Chakra engine. - /// - [Serializable] - internal class JavaScriptException : Exception - { - /// - /// The error code. - /// - private readonly JavaScriptErrorCode _code; - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - public JavaScriptException(JavaScriptErrorCode code) : - this(code, "A fatal exception has occurred in a JavaScript runtime") - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The error message. - public JavaScriptException(JavaScriptErrorCode code, string message) : - base(message) - { - _code = code; - } - - /// - /// Initializes a new instance of the class. - /// - /// The serialization info. - /// The streaming context. - protected JavaScriptException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - if (info != null) - { - _code = (JavaScriptErrorCode) info.GetUInt32("code"); - } - } - - /// - /// Serializes the exception information. - /// - /// The serialization information. - /// The streaming context. - public override void GetObjectData(SerializationInfo info, StreamingContext context) - { - base.GetObjectData(info, context); - info.AddValue("code", (uint)_code); - } - - /// - /// Gets the error code. - /// - public JavaScriptErrorCode ErrorCode - { - get { return _code; } - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptFatalException.cs b/MsieJavaScriptEngine/JsRt/JavaScriptFatalException.cs deleted file mode 100644 index a4c24f0..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptFatalException.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; - - /// - /// A fatal exception occurred. - /// - [Serializable] - internal sealed class JavaScriptFatalException : JavaScriptException - { - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - public JavaScriptFatalException(JavaScriptErrorCode code) : - this(code, "A fatal exception has occurred in a JavaScript runtime") - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The error message. - public JavaScriptFatalException(JavaScriptErrorCode code, string message) : - base(code, message) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The serialization info. - /// The streaming context. - private JavaScriptFatalException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptNativeFunction.cs b/MsieJavaScriptEngine/JsRt/JavaScriptNativeFunction.cs deleted file mode 100644 index 0a4a5e9..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptNativeFunction.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.InteropServices; - - /// - /// A function callback. - /// - /// - /// A Function object that represents the function being invoked. - /// - /// Indicates whether this is a regular call or a 'new' call. - /// The arguments to the call. - /// The number of arguments. - /// Callback data, if any. - /// The result of the call, if any. - internal delegate JavaScriptValue JavaScriptNativeFunction(JavaScriptValue callee, bool isConstructCall, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] JavaScriptValue[] arguments, ushort argumentCount, IntPtr callbackData); -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptObjectFinalizeCallback.cs b/MsieJavaScriptEngine/JsRt/JavaScriptObjectFinalizeCallback.cs deleted file mode 100644 index 4099c66..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptObjectFinalizeCallback.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - - /// - /// A finalization callback. - /// - /// - /// The external data that was passed in when creating the object being finalized. - /// - internal delegate void JavaScriptObjectFinalizeCallback(IntPtr data); -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptPropertyId.cs b/MsieJavaScriptEngine/JsRt/JavaScriptPropertyId.cs deleted file mode 100644 index 8642569..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptPropertyId.cs +++ /dev/null @@ -1,142 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.InteropServices; - - /// - /// A property identifier. - /// - /// - /// Property identifiers are used to refer to properties of JavaScript objects instead of using - /// strings. - /// - internal struct JavaScriptPropertyId : IEquatable - { - /// - /// The id. - /// - private readonly IntPtr _id; - - /// - /// Initializes a new instance of the struct. - /// - /// The ID. - internal JavaScriptPropertyId(IntPtr id) - { - _id = id; - } - - /// - /// Gets an invalid ID. - /// - public static JavaScriptPropertyId Invalid - { - get { return new JavaScriptPropertyId(IntPtr.Zero); } - } - - /// - /// Gets the name associated with the property ID. - /// - /// - /// - /// Requires an active script context. - /// - /// - public string Name - { - get - { - IntPtr buffer; - Native.ThrowIfError(Native.JsGetPropertyNameFromId(this, out buffer)); - return Marshal.PtrToStringAuto(buffer); - } - } - - /// - /// Gets the property ID associated with the name. - /// - /// - /// - /// Property IDs are specific to a context and cannot be used across contexts. - /// - /// - /// Requires an active script context. - /// - /// - /// - /// The name of the property ID to get or create. The name may consist of only digits. - /// - /// The property ID in this runtime for the given name. - public static JavaScriptPropertyId FromString(string name) - { - JavaScriptPropertyId id; - Native.ThrowIfError(Native.JsGetPropertyIdFromName(name, out id)); - return id; - } - - /// - /// The equality operator for property IDs. - /// - /// The first property ID to compare. - /// The second property ID to compare. - /// Whether the two property IDs are the same. - public static bool operator ==(JavaScriptPropertyId left, JavaScriptPropertyId right) - { - return left.Equals(right); - } - - /// - /// The inequality operator for property IDs. - /// - /// The first property ID to compare. - /// The second property ID to compare. - /// Whether the two property IDs are not the same. - public static bool operator !=(JavaScriptPropertyId left, JavaScriptPropertyId right) - { - return !left.Equals(right); - } - - /// - /// Checks for equality between property IDs. - /// - /// The other property ID to compare. - /// Whether the two property IDs are the same. - public bool Equals(JavaScriptPropertyId other) - { - return _id == other._id; - } - - /// - /// Checks for equality between property IDs. - /// - /// The other property ID to compare. - /// Whether the two property IDs are the same. - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is JavaScriptPropertyId && Equals((JavaScriptPropertyId)obj); - } - - /// - /// The hash code. - /// - /// The hash code of the property ID. - public override int GetHashCode() - { - return _id.ToInt32(); - } - - /// - /// Converts the property ID to a string. - /// - /// The name of the property ID. - public override string ToString() - { - return Name; - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptScriptException.cs b/MsieJavaScriptEngine/JsRt/JavaScriptScriptException.cs deleted file mode 100644 index 58a460b..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptScriptException.cs +++ /dev/null @@ -1,61 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; - - /// - /// A script exception. - /// - [Serializable] - internal sealed class JavaScriptScriptException : JavaScriptException - { - /// - /// The error. - /// - [NonSerialized] - private readonly JavaScriptValue _error; - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The JavaScript error object. - public JavaScriptScriptException(JavaScriptErrorCode code, JavaScriptValue error) : - this(code, error, "JavaScript Exception") - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The JavaScript error object. - /// The error message. - public JavaScriptScriptException(JavaScriptErrorCode code, JavaScriptValue error, string message) : - base(code, message) - { - _error = error; - } - - /// - /// Initializes a new instance of the class. - /// - /// The serialization info. - /// The streaming context. - private JavaScriptScriptException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - - /// - /// Gets a JavaScript object representing the script error. - /// - public JavaScriptValue Error - { - get - { - return _error; - } - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptSourceContext.cs b/MsieJavaScriptEngine/JsRt/JavaScriptSourceContext.cs deleted file mode 100644 index 01dcde1..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptSourceContext.cs +++ /dev/null @@ -1,184 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - - /// - /// A cookie that identifies a script for debugging purposes. - /// - internal struct JavaScriptSourceContext : IEquatable - { - /// - /// The context. - /// - private readonly IntPtr _context; - - /// - /// Initializes a new instance of the struct. - /// - /// The context. - private JavaScriptSourceContext(IntPtr context) - { - _context = context; - } - - /// - /// Gets an empty source context. - /// - public static JavaScriptSourceContext None - { - get { return new JavaScriptSourceContext(new IntPtr(-1)); } - } - - /// - /// The equality operator for source contexts. - /// - /// The first source context to compare. - /// The second source context to compare. - /// Whether the two source contexts are the same. - public static bool operator ==(JavaScriptSourceContext left, JavaScriptSourceContext right) - { - return left.Equals(right); - } - - /// - /// The inequality operator for source contexts. - /// - /// The first source context to compare. - /// The second source context to compare. - /// Whether the two source contexts are not the same. - public static bool operator !=(JavaScriptSourceContext left, JavaScriptSourceContext right) - { - return !left.Equals(right); - } - - /// - /// Subtracts an offset from the value of the source context. - /// - /// The source context to subtract the offset from. - /// The offset to subtract. - /// A new source context that reflects the subtraction of the offset from the context. - public static JavaScriptSourceContext operator -(JavaScriptSourceContext context, int offset) - { - return FromIntPtr(context._context - offset); - } - - /// - /// Subtracts an offset from the value of the source context. - /// - /// The source context to subtract the offset from. - /// The offset to subtract. - /// A new source context that reflects the subtraction of the offset from the context. - public static JavaScriptSourceContext Subtract(JavaScriptSourceContext left, int right) - { - return left - right; - } - - /// - /// Decrements the value of the source context. - /// - /// The source context to decrement. - /// A new source context that reflects the decrementing of the context. - public static JavaScriptSourceContext operator --(JavaScriptSourceContext context) - { - return FromIntPtr(context._context - 1); - } - - /// - /// Decrements the value of the source context. - /// - /// The source context to decrement. - /// A new source context that reflects the decrementing of the context. - public static JavaScriptSourceContext Decrement(JavaScriptSourceContext left) - { - return --left; - } - - /// - /// Adds an offset from the value of the source context. - /// - /// The source context to add the offset to. - /// The offset to add. - /// A new source context that reflects the addition of the offset to the context. - public static JavaScriptSourceContext operator +(JavaScriptSourceContext context, int offset) - { - return FromIntPtr(context._context + offset); - } - - /// - /// Adds an offset from the value of the source context. - /// - /// The source context to add the offset to. - /// The offset to add. - /// A new source context that reflects the addition of the offset to the context. - public static JavaScriptSourceContext Add(JavaScriptSourceContext left, int right) - { - return left + right; - } - - /// - /// Increments the value of the source context. - /// - /// The source context to increment. - /// A new source context that reflects the incrementing of the context. - public static JavaScriptSourceContext operator ++(JavaScriptSourceContext context) - { - return FromIntPtr(context._context + 1); - } - - /// - /// Increments the value of the source context. - /// - /// The source context to increment. - /// A new source context that reflects the incrementing of the context. - public static JavaScriptSourceContext Increment(JavaScriptSourceContext left) - { - return ++left; - } - - /// - /// Creates a new source context. - /// - /// - /// The cookie for the source context. - /// - /// The new source context. - public static JavaScriptSourceContext FromIntPtr(IntPtr cookie) - { - return new JavaScriptSourceContext(cookie); - } - - /// - /// Checks for equality between source contexts. - /// - /// The other source context to compare. - /// Whether the two source contexts are the same. - public bool Equals(JavaScriptSourceContext other) - { - return _context == other._context; - } - - /// - /// Checks for equality between source contexts. - /// - /// The other source context to compare. - /// Whether the two source contexts are the same. - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is JavaScriptSourceContext && Equals((JavaScriptSourceContext)obj); - } - - /// - /// The hash code. - /// - /// The hash code of the source context. - public override int GetHashCode() - { - return _context.ToInt32(); - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptUsageException.cs b/MsieJavaScriptEngine/JsRt/JavaScriptUsageException.cs deleted file mode 100644 index acbdb0f..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptUsageException.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; - - /// - /// An API usage exception occurred. - /// - [Serializable] - internal sealed class JavaScriptUsageException : JavaScriptException - { - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - public JavaScriptUsageException(JavaScriptErrorCode code) : - this(code, "A fatal exception has occurred in a JavaScript runtime") - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The error code returned. - /// The error message. - public JavaScriptUsageException(JavaScriptErrorCode code, string message) : - base(code, message) - { - } - - /// - /// Initializes a new instance of the class. - /// - /// The serialization info. - /// The streaming context. - private JavaScriptUsageException(SerializationInfo info, StreamingContext context) : - base(info, context) - { - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptValue.cs b/MsieJavaScriptEngine/JsRt/JavaScriptValue.cs deleted file mode 100644 index 7696661..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptValue.cs +++ /dev/null @@ -1,884 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.InteropServices; - - /// - /// A JavaScript value. - /// - /// - /// A JavaScript value is one of the following types of values: Undefined, Null, Boolean, - /// String, Number, or Object. - /// - internal struct JavaScriptValue - { - /// - /// The reference. - /// - private readonly IntPtr _reference; - - /// - /// Initializes a new instance of the struct. - /// - /// The reference. - private JavaScriptValue(IntPtr reference) - { - _reference = reference; - } - - /// - /// Gets an invalid value. - /// - public static JavaScriptValue Invalid - { - get { return new JavaScriptValue(IntPtr.Zero); } - } - - /// - /// Gets the value of undefined in the current script context. - /// - /// - /// Requires an active script context. - /// - public static JavaScriptValue Undefined - { - get - { - JavaScriptValue value; - Native.ThrowIfError(Native.JsGetUndefinedValue(out value)); - return value; - } - } - - /// - /// Gets the value of null in the current script context. - /// - /// - /// Requires an active script context. - /// - public static JavaScriptValue Null - { - get - { - JavaScriptValue value; - Native.ThrowIfError(Native.JsGetNullValue(out value)); - return value; - } - } - - /// - /// Gets the value of true in the current script context. - /// - /// - /// Requires an active script context. - /// - public static JavaScriptValue True - { - get - { - JavaScriptValue value; - Native.ThrowIfError(Native.JsGetTrueValue(out value)); - return value; - } - } - - /// - /// Gets the value of false in the current script context. - /// - /// - /// Requires an active script context. - /// - public static JavaScriptValue False - { - get - { - JavaScriptValue value; - Native.ThrowIfError(Native.JsGetFalseValue(out value)); - return value; - } - } - - /// - /// Gets the global object in the current script context. - /// - /// - /// Requires an active script context. - /// - public static JavaScriptValue GlobalObject - { - get - { - JavaScriptValue value; - Native.ThrowIfError(Native.JsGetGlobalObject(out value)); - return value; - } - } - - /// - /// Gets a value indicating whether the value is valid. - /// - public bool IsValid - { - get { return _reference != IntPtr.Zero; } - } - - /// - /// Gets the JavaScript type of the value. - /// - /// - /// Requires an active script context. - /// - /// The type of the value. - public JavaScriptValueType ValueType - { - get - { - JavaScriptValueType type; - Native.ThrowIfError(Native.JsGetValueType(this, out type)); - return type; - } - } - - /// - /// Gets the length of a String value. - /// - /// - /// Requires an active script context. - /// - /// The length of the string. - public int StringLength - { - get - { - int length; - Native.ThrowIfError(Native.JsGetStringLength(this, out length)); - return length; - } - } - - /// - /// Gets or sets the prototype of an object. - /// - /// - /// Requires an active script context. - /// - public JavaScriptValue Prototype - { - get - { - JavaScriptValue prototypeReference; - Native.ThrowIfError(Native.JsGetPrototype(this, out prototypeReference)); - return prototypeReference; - } - - set - { - Native.ThrowIfError(Native.JsSetPrototype(this, value)); - } - } - - /// - /// Gets a value indicating whether an object is extensible or not. - /// - /// - /// Requires an active script context. - /// - public bool IsExtensionAllowed - { - get - { - bool allowed; - Native.ThrowIfError(Native.JsGetExtensionAllowed(this, out allowed)); - return allowed; - } - } - - /// - /// Gets a value indicating whether an object is an external object. - /// - /// - /// Requires an active script context. - /// - public bool HasExternalData - { - get - { - bool hasExternalData; - Native.ThrowIfError(Native.JsHasExternalData(this, out hasExternalData)); - return hasExternalData; - } - } - - /// - /// Gets or sets the data in an external object. - /// - /// - /// Requires an active script context. - /// - public IntPtr ExternalData - { - get - { - IntPtr data; - Native.ThrowIfError(Native.JsGetExternalData(this, out data)); - return data; - } - - set - { - Native.ThrowIfError(Native.JsSetExternalData(this, value)); - } - } - - /// - /// Creates a Boolean value from a bool value. - /// - /// - /// Requires an active script context. - /// - /// The value to be converted. - /// The converted value. - public static JavaScriptValue FromBoolean(bool value) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsBoolToBoolean(value, out reference)); - return reference; - } - - /// - /// Creates a Number value from a double value. - /// - /// - /// Requires an active script context. - /// - /// The value to be converted. - /// The new Number value. - public static JavaScriptValue FromDouble(double value) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsDoubleToNumber(value, out reference)); - return reference; - } - - /// - /// Creates a Number value from a int value. - /// - /// - /// Requires an active script context. - /// - /// The value to be converted. - /// The new Number value. - public static JavaScriptValue FromInt32(int value) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsIntToNumber(value, out reference)); - return reference; - } - - /// - /// Creates a String value from a string pointer. - /// - /// - /// Requires an active script context. - /// - /// The string to convert to a String value. - /// The new String value. - public static JavaScriptValue FromString(string value) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsPointerToString(value, new UIntPtr((uint)value.Length), out reference)); - return reference; - } - - /// - /// Creates a JavaScript value that is a projection of the passed in object. - /// - /// - /// Requires an active script context. - /// - /// An object to be projected. - /// A JavaScript value that is a projection of the object. - public static JavaScriptValue FromObject(object value) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsVariantToValue(ref value, out reference)); - return reference; - } - - /// - /// Creates a new Object. - /// - /// - /// Requires an active script context. - /// - /// The new Object. - public static JavaScriptValue CreateObject() - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateObject(out reference)); - return reference; - } - - /// - /// Creates a new Object that stores some external data. - /// - /// - /// Requires an active script context. - /// - /// External data that the object will represent. May be null. - /// - /// A callback for when the object is finalized. May be null. - /// - /// The new Object. - public static JavaScriptValue CreateExternalObject(IntPtr data, JavaScriptObjectFinalizeCallback finalizer) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateExternalObject(data, finalizer, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript function. - /// - /// - /// Requires an active script context. - /// - /// The method to call when the function is invoked. - /// The new function object. - public static JavaScriptValue CreateFunction(JavaScriptNativeFunction function) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateFunction(function, IntPtr.Zero, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript function. - /// - /// - /// Requires an active script context. - /// - /// The method to call when the function is invoked. - /// Data to be provided to all function callbacks. - /// The new function object. - public static JavaScriptValue CreateFunction(JavaScriptNativeFunction function, IntPtr callbackData) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateFunction(function, callbackData, out reference)); - return reference; - } - - /// - /// Creates a JavaScript array object. - /// - /// - /// Requires an active script context. - /// - /// The initial length of the array. - /// The new array object. - public static JavaScriptValue CreateArray(uint length) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateArray(length, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateError(message, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript RangeError error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateRangeError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateRangeError(message, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript ReferenceError error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateReferenceError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateReferenceError(message, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript SyntaxError error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateSyntaxError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateSyntaxError(message, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript TypeError error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateTypeError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateTypeError(message, out reference)); - return reference; - } - - /// - /// Creates a new JavaScript URIError error object - /// - /// - /// Requires an active script context. - /// - /// Message for the error object. - /// The new error object. - public static JavaScriptValue CreateUriError(JavaScriptValue message) - { - JavaScriptValue reference; - Native.ThrowIfError(Native.JsCreateURIError(message, out reference)); - return reference; - } - - /// - /// Adds a reference to the object. - /// - /// - /// This only needs to be called on objects that are not going to be stored somewhere on - /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed - /// until Release is called - /// - /// The object's new reference count. - public uint AddRef() - { - uint count; - Native.ThrowIfError(Native.JsAddRef(this, out count)); - return count; - } - - /// - /// Releases a reference to the object. - /// - /// - /// Removes a reference that was created by AddRef. - /// - /// The object's new reference count. - public uint Release() - { - uint count; - Native.ThrowIfError(Native.JsRelease(this, out count)); - return count; - } - - /// - /// Retrieves the bool value of a Boolean value. - /// - /// - /// Requires an active script context. - /// - /// The converted value. - public bool ToBoolean() - { - bool value; - Native.ThrowIfError(Native.JsBooleanToBool(this, out value)); - return value; - } - - /// - /// Retrieves the double value of a Number value. - /// - /// - /// - /// This function retrieves the value of a Number value. It will fail with - /// InvalidArgument if the type of the value is not Number. - /// - /// - /// Requires an active script context. - /// - /// - /// The double value. - public double ToDouble() - { - double value; - Native.ThrowIfError(Native.JsNumberToDouble(this, out value)); - return value; - } - - /// - /// Retrieves the string pointer of a String value. - /// - /// - /// - /// This function retrieves the string pointer of a String value. It will fail with - /// InvalidArgument if the type of the value is not String. - /// - /// - /// Requires an active script context. - /// - /// - /// The string. - public new string ToString() - { - IntPtr buffer; - UIntPtr length; - Native.ThrowIfError(Native.JsStringToPointer(this, out buffer, out length)); - return Marshal.PtrToStringAuto(buffer, (int)length); - } - - /// - /// Retrieves the object representation of an Object value. - /// - /// - /// Requires an active script context. - /// - /// The object representation of the value. - public object ToObject() - { - object value; - Native.ThrowIfError(Native.JsValueToVariant(this, out value)); - return value; - } - - /// - /// Converts the value to Boolean using regular JavaScript semantics. - /// - /// - /// Requires an active script context. - /// - /// The converted value. - public JavaScriptValue ConvertToBoolean() - { - JavaScriptValue booleanReference; - Native.ThrowIfError(Native.JsConvertValueToBoolean(this, out booleanReference)); - return booleanReference; - } - - /// - /// Converts the value to Number using regular JavaScript semantics. - /// - /// - /// Requires an active script context. - /// - /// The converted value. - public JavaScriptValue ConvertToNumber() - { - JavaScriptValue numberReference; - Native.ThrowIfError(Native.JsConvertValueToNumber(this, out numberReference)); - return numberReference; - } - - /// - /// Converts the value to String using regular JavaScript semantics. - /// - /// - /// Requires an active script context. - /// - /// The converted value. - public JavaScriptValue ConvertToString() - { - JavaScriptValue stringReference; - Native.ThrowIfError(Native.JsConvertValueToString(this, out stringReference)); - return stringReference; - } - - /// - /// Converts the value to Object using regular JavaScript semantics. - /// - /// - /// Requires an active script context. - /// - /// The converted value. - public JavaScriptValue ConvertToObject() - { - JavaScriptValue objectReference; - Native.ThrowIfError(Native.JsConvertValueToObject(this, out objectReference)); - return objectReference; - } - - /// - /// Sets an object to not be extensible. - /// - /// - /// Requires an active script context. - /// - public void PreventExtension() - { - Native.ThrowIfError(Native.JsPreventExtension(this)); - } - - /// - /// Gets a property descriptor for an object's own property. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// The property descriptor. - public JavaScriptValue GetOwnPropertyDescriptor(JavaScriptPropertyId propertyId) - { - JavaScriptValue descriptorReference; - Native.ThrowIfError(Native.JsGetOwnPropertyDescriptor(this, propertyId, out descriptorReference)); - return descriptorReference; - } - - /// - /// Gets the list of all properties on the object. - /// - /// - /// Requires an active script context. - /// - /// An array of property names. - public JavaScriptValue GetOwnPropertyNames() - { - JavaScriptValue propertyNamesReference; - Native.ThrowIfError(Native.JsGetOwnPropertyNames(this, out propertyNamesReference)); - return propertyNamesReference; - } - - /// - /// Determines whether an object has a property. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// Whether the object (or a prototype) has the property. - public bool HasProperty(JavaScriptPropertyId propertyId) - { - bool hasProperty; - Native.ThrowIfError(Native.JsHasProperty(this, propertyId, out hasProperty)); - return hasProperty; - } - - /// - /// Gets an object's property. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// The value of the property. - public JavaScriptValue GetProperty(JavaScriptPropertyId id) - { - JavaScriptValue propertyReference; - Native.ThrowIfError(Native.JsGetProperty(this, id, out propertyReference)); - return propertyReference; - } - - /// - /// Sets an object's property. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// The new value of the property. - /// The property set should follow strict mode rules. - public void SetProperty(JavaScriptPropertyId id, JavaScriptValue value, bool useStrictRules) - { - Native.ThrowIfError(Native.JsSetProperty(this, id, value, useStrictRules)); - } - - /// - /// Deletes an object's property. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// The property set should follow strict mode rules. - /// Whether the property was deleted. - public JavaScriptValue DeleteProperty(JavaScriptPropertyId propertyId, bool useStrictRules) - { - JavaScriptValue returnReference; - Native.ThrowIfError(Native.JsDeleteProperty(this, propertyId, useStrictRules, out returnReference)); - return returnReference; - } - - /// - /// Defines a new object's own property from a property descriptor. - /// - /// - /// Requires an active script context. - /// - /// The ID of the property. - /// The property descriptor. - /// Whether the property was defined. - public bool DefineProperty(JavaScriptPropertyId propertyId, JavaScriptValue propertyDescriptor) - { - bool result; - Native.ThrowIfError(Native.JsDefineProperty(this, propertyId, propertyDescriptor, out result)); - return result; - } - - /// - /// Test if an object has a value at the specified index. - /// - /// - /// Requires an active script context. - /// - /// The index to test. - /// Whether the object has an value at the specified index. - public bool HasIndexedProperty(JavaScriptValue index) - { - bool hasProperty; - Native.ThrowIfError(Native.JsHasIndexedProperty(this, index, out hasProperty)); - return hasProperty; - } - - /// - /// Retrieve the value at the specified index of an object. - /// - /// - /// Requires an active script context. - /// - /// The index to retrieve. - /// The retrieved value. - public JavaScriptValue GetIndexedProperty(JavaScriptValue index) - { - JavaScriptValue propertyReference; - Native.ThrowIfError(Native.JsGetIndexedProperty(this, index, out propertyReference)); - return propertyReference; - } - - /// - /// Set the value at the specified index of an object. - /// - /// - /// Requires an active script context. - /// - /// The index to set. - /// The value to set. - public void SetIndexedProperty(JavaScriptValue index, JavaScriptValue value) - { - Native.ThrowIfError(Native.JsSetIndexedProperty(this, index, value)); - } - - /// - /// Delete the value at the specified index of an object. - /// - /// - /// Requires an active script context. - /// - /// The index to delete. - public void DeleteIndexedProperty(JavaScriptValue index) - { - Native.ThrowIfError(Native.JsDeleteIndexedProperty(this, index)); - } - - /// - /// Compare two JavaScript values for equality. - /// - /// - /// - /// This function is equivalent to the "==" operator in JavaScript. - /// - /// - /// Requires an active script context. - /// - /// - /// The object to compare. - /// Whether the values are equal. - public bool Equals(JavaScriptValue other) - { - bool equals; - Native.ThrowIfError(Native.JsEquals(this, other, out equals)); - return equals; - } - - /// - /// Compare two JavaScript values for strict equality. - /// - /// - /// - /// This function is equivalent to the "===" operator in JavaScript. - /// - /// - /// Requires an active script context. - /// - /// - /// The object to compare. - /// Whether the values are strictly equal. - public bool StrictEquals(JavaScriptValue other) - { - bool equals; - Native.ThrowIfError(Native.JsStrictEquals(this, other, out equals)); - return equals; - } - - /// - /// Invokes a function. - /// - /// - /// Requires an active script context. - /// - /// The arguments to the call. - /// The Value returned from the function invocation, if any. - public JavaScriptValue CallFunction(params JavaScriptValue[] arguments) - { - JavaScriptValue returnReference; - - if (arguments.Length > ushort.MaxValue) - { - throw new ArgumentOutOfRangeException("arguments"); - } - - Native.ThrowIfError(Native.JsCallFunction(this, arguments, (ushort)arguments.Length, out returnReference)); - return returnReference; - } - - /// - /// Invokes a function as a constructor. - /// - /// - /// Requires an active script context. - /// - /// The arguments to the call. - /// The Value returned from the function invocation. - public JavaScriptValue ConstructObject(params JavaScriptValue[] arguments) - { - JavaScriptValue returnReference; - - if (arguments.Length > ushort.MaxValue) - { - throw new ArgumentOutOfRangeException("arguments"); - } - - Native.ThrowIfError(Native.JsConstructObject(this, arguments, (ushort)arguments.Length, out returnReference)); - return returnReference; - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptValueType.cs b/MsieJavaScriptEngine/JsRt/JavaScriptValueType.cs deleted file mode 100644 index 4db7312..0000000 --- a/MsieJavaScriptEngine/JsRt/JavaScriptValueType.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - /// - /// The JavaScript type of a JavaScriptValue. - /// - internal enum JavaScriptValueType - { - /// - /// The value is the undefined value. - /// - Undefined = 0, - - /// - /// The value is the null value. - /// - Null = 1, - - /// - /// The value is a JavaScript number value. - /// - Number = 2, - - /// - /// The value is a JavaScript string value. - /// - String = 3, - - /// - /// The value is a JavaScript Boolean value. - /// - Boolean = 4, - - /// - /// The value is a JavaScript object value. - /// - Object = 5, - - /// - /// The value is a JavaScript function object value. - /// - Function = 6, - - /// - /// The value is a JavaScript error object value. - /// - Error = 7, - - /// - /// The value is a JavaScript array object value. - /// - Array = 8, - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptBackgroundWorkItemCallback.cs b/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs similarity index 70% rename from MsieJavaScriptEngine/JsRt/JavaScriptBackgroundWorkItemCallback.cs rename to MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs index 086ef84..df7a572 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptBackgroundWorkItemCallback.cs +++ b/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs @@ -3,12 +3,12 @@ using System; /// - /// A background work item callback. + /// The background work item callback /// /// /// This is passed to the host's thread service (if provided) to allow the host to /// invoke the work item callback on the background thread of its choice. /// - /// Data argument passed to the thread service. - internal delegate void JavaScriptBackgroundWorkItemCallback(IntPtr callbackData); + /// Data argument passed to the thread service + internal delegate void JsBackgroundWorkItemCallback(IntPtr callbackData); } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptBeforeCollectCallback.cs b/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs similarity index 51% rename from MsieJavaScriptEngine/JsRt/JavaScriptBeforeCollectCallback.cs rename to MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs index 0c8ad29..0dc374f 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptBeforeCollectCallback.cs +++ b/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs @@ -3,8 +3,8 @@ using System; /// - /// A callback called before collection. + /// The callback called before collection /// - /// The state passed to SetBeforeCollectCallback. - internal delegate void JavaScriptBeforeCollectCallback(IntPtr callbackState); + /// The state passed to SetBeforeCollectCallback + internal delegate void JsBeforeCollectCallback(IntPtr callbackState); } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/MsieJavaScriptEngine/JsRt/JsEngineException.cs new file mode 100644 index 0000000..19eafd6 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -0,0 +1,38 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + using System.Runtime.Serialization; + + /// + /// The exception that occurred in the workings of the JavaScript engine itself + /// + [Serializable] + internal sealed class JsEngineException : JsException + { + /// + /// Initializes a new instance of the class + /// + /// The error code returned + public JsEngineException(JsErrorCode code) + : this(code, "A fatal exception has occurred in a JavaScript runtime") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The error message + public JsEngineException(JsErrorCode code, string message) + : base(code, message) + { } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + private JsEngineException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptErrorCode.cs b/MsieJavaScriptEngine/JsRt/JsErrorCode.cs similarity index 71% rename from MsieJavaScriptEngine/JsRt/JavaScriptErrorCode.cs rename to MsieJavaScriptEngine/JsRt/JsErrorCode.cs index 6e5424b..f4719bb 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptErrorCode.cs +++ b/MsieJavaScriptEngine/JsRt/JsErrorCode.cs @@ -3,156 +3,156 @@ using System.Diagnostics.CodeAnalysis; /// - /// An error code returned from a Chakra hosting API. + /// The error code returned from a Chakra hosting API /// - internal enum JavaScriptErrorCode : uint + internal enum JsErrorCode : uint { /// - /// Success error code. + /// Success error code /// NoError = 0, /// - /// Category of errors that relates to incorrect usage of the API itself. + /// Category of errors that relates to incorrect usage of the API itself /// CategoryUsage = 0x10000, /// - /// An argument to a hosting API was invalid. + /// An argument to a hosting API was invalid /// InvalidArgument, /// - /// An argument to a hosting API was null in a context where null is not allowed. + /// An argument to a hosting API was null in a context where null is not allowed /// NullArgument, /// - /// The hosting API requires that a context be current, but there is no current context. + /// The hosting API requires that a context be current, but there is no current context /// NoCurrentContext, /// /// The engine is in an exception state and no APIs can be called until the exception is - /// cleared. + /// cleared /// InExceptionState, /// - /// A hosting API is not yet implemented. + /// A hosting API is not yet implemented /// NotImplemented, /// - /// A hosting API was called on the wrong thread. + /// A hosting API was called on the wrong thread /// WrongThread, /// - /// A runtime that is still in use cannot be disposed. + /// A runtime that is still in use cannot be disposed /// RuntimeInUse, /// /// A bad serialized script was used, or the serialized script was serialized by a - /// different version of the Chakra engine. + /// different version of the Chakra engine /// BadSerializedScript, /// - /// The runtime is in a disabled state. + /// The runtime is in a disabled state /// InDisabledState, /// - /// Runtime does not support reliable script interruption. + /// Runtime does not support reliable script interruption /// CannotDisableExecution, /// - /// A heap enumeration is currently underway in the script context. + /// A heap enumeration is currently underway in the script context /// HeapEnumInProgress, /// - /// A hosting API that operates on Object values was called with a non-Object value. + /// A hosting API that operates on Object values was called with a non-Object value /// ArgumentNotObject, /// - /// A script context is in the middle of a profile callback. + /// A script context is in the middle of a profile callback /// InProfileCallback, /// - /// A thread service callback is currently underway. + /// A thread service callback is currently underway /// InThreadServiceCallback, /// - /// Scripts cannot be serialized in debug contexts. + /// Scripts cannot be serialized in debug contexts /// CannotSerializeDebugScript, /// - /// The context cannot be put into a debug state because it is already in a debug state. + /// The context cannot be put into a debug state because it is already in a debug state /// AlreadyDebuggingContext, /// - /// The context cannot start profiling because it is already profiling. + /// The context cannot start profiling because it is already profiling /// AlreadyProfilingContext, /// - /// Idle notification given when the host did not enable idle processing. + /// Idle notification given when the host did not enable idle processing /// IdleNotEnabled, /// - /// Category of errors that relates to errors occurring within the engine itself. + /// Category of errors that relates to errors occurring within the engine itself /// CategoryEngine = 0x20000, /// - /// The Chakra engine has run out of memory. + /// The Chakra engine has run out of memory /// OutOfMemory, /// - /// Category of errors that relates to errors in a script. + /// Category of errors that relates to errors in a script /// CategoryScript = 0x30000, /// - /// A JavaScript exception occurred while running a script. + /// A JavaScript exception occurred while running a script /// ScriptException, /// - /// JavaScript failed to compile. + /// JavaScript failed to compile /// ScriptCompile, /// - /// A script was terminated due to a request to suspend a runtime. + /// A script was terminated due to a request to suspend a runtime /// ScriptTerminated, /// - /// A script was terminated because it tried to use "eval" or "function" and eval was disabled. + /// A script was terminated because it tried to use "eval" or "function" and eval was disabled /// [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] ScriptEvalDisabled, /// - /// Category of errors that are fatal and signify failure of the engine. + /// Category of errors that are fatal and signify failure of the engine /// CategoryFatal = 0x40000, /// - /// A fatal error in the engine has occurred. + /// A fatal error in the engine has occurred /// - Fatal, + Fatal } } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsException.cs b/MsieJavaScriptEngine/JsRt/JsException.cs new file mode 100644 index 0000000..78393ef --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsException.cs @@ -0,0 +1,71 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + using System.Runtime.Serialization; + + /// + /// The exception returned from the Chakra engine + /// + [Serializable] + internal class JsException : Exception + { + /// + /// The error code + /// + private readonly JsErrorCode _code; + + /// + /// Gets a error code + /// + public JsErrorCode ErrorCode + { + get { return _code; } + } + + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + public JsException(JsErrorCode code) + : this(code, "A fatal exception has occurred in a JavaScript runtime") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The error message + public JsException(JsErrorCode code, string message) + : base(message) + { + _code = code; + } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + protected JsException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info != null) + { + _code = (JsErrorCode) info.GetUInt32("code"); + } + } + + + /// + /// Serializes the exception information + /// + /// The serialization information + /// The streaming context + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + base.GetObjectData(info, context); + info.AddValue("code", (uint)_code); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/MsieJavaScriptEngine/JsRt/JsFatalException.cs new file mode 100644 index 0000000..82680e7 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsFatalException.cs @@ -0,0 +1,38 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + using System.Runtime.Serialization; + + /// + /// The fatal exception + /// + [Serializable] + internal sealed class JsFatalException : JsException + { + /// + /// Initializes a new instance of the class + /// + /// The error code returned + public JsFatalException(JsErrorCode code) + : this(code, "A fatal exception has occurred in a JavaScript runtime") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The error message + public JsFatalException(JsErrorCode code, string message) + : base(code, message) + { } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + private JsFatalException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptMemoryAllocationCallback.cs b/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs similarity index 66% rename from MsieJavaScriptEngine/JsRt/JavaScriptMemoryAllocationCallback.cs rename to MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs index c0afabe..992a888 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptMemoryAllocationCallback.cs +++ b/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs @@ -5,13 +5,13 @@ /// /// User implemented callback routine for memory allocation events /// - /// The state passed to SetRuntimeMemoryAllocationCallback. - /// The type of type allocation event. - /// The size of the allocation. + /// The state passed to SetRuntimeMemoryAllocationCallback + /// The type of type allocation event + /// The size of the allocation /// /// For the Allocate event, returning true allows the runtime to continue with /// allocation. Returning false indicates the allocation request is rejected. The return value /// is ignored for other allocation events. /// - internal delegate bool JavaScriptMemoryAllocationCallback(IntPtr callbackState, JavaScriptMemoryEventType allocationEvent, UIntPtr allocationSize); + internal delegate bool JsMemoryAllocationCallback(IntPtr callbackState, JsMemoryEventType allocationEvent, UIntPtr allocationSize); } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptMemoryEventType.cs b/MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs similarity index 51% rename from MsieJavaScriptEngine/JsRt/JavaScriptMemoryEventType.cs rename to MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs index 3b76487..b0dbbec 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptMemoryEventType.cs +++ b/MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs @@ -1,22 +1,22 @@ namespace MsieJavaScriptEngine.JsRt { /// - /// Allocation callback event type. + /// Allocation callback event type /// - internal enum JavaScriptMemoryEventType + internal enum JsMemoryEventType { /// - /// Indicates a request for memory allocation. + /// Indicates a request for memory allocation /// Allocate = 0, /// - /// Indicates a memory freeing event. + /// Indicates a memory freeing event /// Free = 1, /// - /// Indicates a failed allocation event. + /// Indicates a failed allocation event /// Failure = 2 } diff --git a/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs b/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs new file mode 100644 index 0000000..0069182 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + + /// + /// The finalization callback + /// + /// The external data that was passed in when creating the object being finalized + internal delegate void JsObjectFinalizeCallback(IntPtr data); +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptRuntimeAttributes.cs b/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs similarity index 87% rename from MsieJavaScriptEngine/JsRt/JavaScriptRuntimeAttributes.cs rename to MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs index 1c49156..a4f8706 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptRuntimeAttributes.cs +++ b/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs @@ -4,18 +4,18 @@ using System.Diagnostics.CodeAnalysis; /// - /// Attributes of a runtime. + /// Attributes of a runtime /// [Flags] - internal enum JavaScriptRuntimeAttributes + internal enum JsRuntimeAttributes { /// - /// No special attributes. + /// No special attributes /// None = 0x00000000, /// - /// The runtime will not do any work (such as garbage collection) on background threads. + /// The runtime will not do any work (such as garbage collection) on background threads /// DisableBackgroundWork = 0x00000001, @@ -33,12 +33,12 @@ internal enum JavaScriptRuntimeAttributes EnableIdleProcessing = 0x00000004, /// - /// Runtime will not generate native code. + /// Runtime will not generate native code /// DisableNativeCodeGeneration = 0x00000008, /// - /// Using Eval or Function constructor will throw an exception. + /// Using Eval or Function constructor will throw an exception /// [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] DisableEval = 0x00000010, diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptRuntimeVersion.cs b/MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs similarity index 60% rename from MsieJavaScriptEngine/JsRt/JavaScriptRuntimeVersion.cs rename to MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs index 9fb558b..95f6741 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptRuntimeVersion.cs +++ b/MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs @@ -1,23 +1,23 @@ namespace MsieJavaScriptEngine.JsRt { /// - /// Version of the runtime. + /// Version of the runtime /// - internal enum JavaScriptRuntimeVersion + internal enum JsRuntimeVersion { /// - /// Create runtime with IE10 version. + /// Create runtime with IE10 version /// Version10 = 0, /// - /// Create runtime with IE11 version. + /// Create runtime with IE11 version /// Version11 = 1, /// - /// Create runtime with highest version present on the machine at runtime. + /// Create runtime with highest version present on the machine at runtime /// - VersionEdge = -1, + VersionEdge = -1 } } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsSourceContext.cs b/MsieJavaScriptEngine/JsRt/JsSourceContext.cs new file mode 100644 index 0000000..7f2780b --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsSourceContext.cs @@ -0,0 +1,188 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + + /// + /// The cookie that identifies a script for debugging purposes + /// + internal struct JsSourceContext : IEquatable + { + /// + /// The context + /// + private readonly IntPtr _context; + + /// + /// Gets a empty source context + /// + public static JsSourceContext None + { + get { return new JsSourceContext(new IntPtr(-1)); } + } + + + /// + /// Initializes a new instance of the struct + /// + /// The context + private JsSourceContext(IntPtr context) + { + _context = context; + } + + + /// + /// The equality operator for source contexts + /// + /// The first source context to compare + /// The second source context to compare + /// Whether the two source contexts are the same + public static bool operator ==(JsSourceContext left, JsSourceContext right) + { + return left.Equals(right); + } + + /// + /// The inequality operator for source contexts + /// + /// The first source context to compare + /// The second source context to compare + /// Whether the two source contexts are not the same + public static bool operator !=(JsSourceContext left, JsSourceContext right) + { + return !left.Equals(right); + } + + /// + /// Subtracts a offset from the value of the source context + /// + /// The source context to subtract the offset from + /// The offset to subtract + /// A new source context that reflects the subtraction of the offset from the context + public static JsSourceContext operator -(JsSourceContext context, int offset) + { + return FromIntPtr(context._context - offset); + } + + /// + /// Subtracts a offset from the value of the source context + /// + /// The source context to subtract the offset from + /// The offset to subtract + /// A new source context that reflects the subtraction of the offset from the context + public static JsSourceContext Subtract(JsSourceContext left, int right) + { + return left - right; + } + + /// + /// Decrements a value of the source context + /// + /// The source context to decrement + /// The new source context that reflects the decrementing of the context + public static JsSourceContext operator --(JsSourceContext context) + { + return FromIntPtr(context._context - 1); + } + + /// + /// Decrements a value of the source context + /// + /// The source context to decrement + /// The new source context that reflects the decrementing of the context + public static JsSourceContext Decrement(JsSourceContext left) + { + return --left; + } + + /// + /// Adds a offset from the value of the source context + /// + /// The source context to add the offset to + /// The offset to add + /// The new source context that reflects the addition of the offset to the context + public static JsSourceContext operator +(JsSourceContext context, int offset) + { + return FromIntPtr(context._context + offset); + } + + /// + /// Adds a offset from the value of the source context + /// + /// The source context to add the offset to + /// The offset to add + /// The new source context that reflects the addition of the offset to the context + public static JsSourceContext Add(JsSourceContext left, int right) + { + return left + right; + } + + /// + /// Increments a value of the source context + /// + /// The source context to increment + /// The new source context that reflects the incrementing of the context + public static JsSourceContext operator ++(JsSourceContext context) + { + return FromIntPtr(context._context + 1); + } + + /// + /// Increments a value of the source context + /// + /// The source context to increment + /// The new source context that reflects the incrementing of the context + public static JsSourceContext Increment(JsSourceContext left) + { + return ++left; + } + + /// + /// Creates a new source context + /// + /// The cookie for the source context + /// The new source context + public static JsSourceContext FromIntPtr(IntPtr cookie) + { + return new JsSourceContext(cookie); + } + + /// + /// Checks for equality between source contexts + /// + /// The other source context to compare + /// Whether the two source contexts are the same + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is JsSourceContext && Equals((JsSourceContext)obj); + } + + /// + /// The hash code + /// + /// The hash code of the source context + public override int GetHashCode() + { + return _context.ToInt32(); + } + + #region IEquatable implementation + + /// + /// Checks for equality between source contexts + /// + /// The other source context to compare + /// Whether the two source contexts are the same + public bool Equals(JsSourceContext other) + { + return _context == other._context; + } + + #endregion + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JavaScriptThreadServiceCallback.cs b/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs similarity index 74% rename from MsieJavaScriptEngine/JsRt/JavaScriptThreadServiceCallback.cs rename to MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs index 93b9cef..9008444 100644 --- a/MsieJavaScriptEngine/JsRt/JavaScriptThreadServiceCallback.cs +++ b/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs @@ -3,7 +3,7 @@ using System; /// - /// A thread service callback. + /// The thread service callback /// /// /// The host can specify a background thread service when creating a runtime. If @@ -11,8 +11,8 @@ /// host is expected to either begin executing the background work item immediately and return /// true or return false and the runtime will handle the work item in-thread. /// - /// The callback for the background work item. - /// The data argument to be passed to the callback. - /// Whether the thread service will execute the callback. - internal delegate bool JavaScriptThreadServiceCallback(JavaScriptBackgroundWorkItemCallback callbackFunction, IntPtr callbackData); + /// The callback for the background work item + /// The data argument to be passed to the callback + /// Whether the thread service will execute the callback + internal delegate bool JsThreadServiceCallback(JsBackgroundWorkItemCallback callbackFunction, IntPtr callbackData); } \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/MsieJavaScriptEngine/JsRt/JsUsageException.cs new file mode 100644 index 0000000..1682791 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsUsageException.cs @@ -0,0 +1,38 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using System; + using System.Runtime.Serialization; + + /// + /// The API usage exception + /// + [Serializable] + internal sealed class JsUsageException : JsException + { + /// + /// Initializes a new instance of the class + /// + /// The error code returned + public JsUsageException(JsErrorCode code) + : this(code, "A fatal exception has occurred in a JavaScript runtime") + { } + + /// + /// Initializes a new instance of the class + /// + /// The error code returned + /// The error message + public JsUsageException(JsErrorCode code, string message) + : base(code, message) + { } + + /// + /// Initializes a new instance of the class + /// + /// The serialization info + /// The streaming context + private JsUsageException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/JsValueType.cs b/MsieJavaScriptEngine/JsRt/JsValueType.cs new file mode 100644 index 0000000..b50cfa7 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/JsValueType.cs @@ -0,0 +1,53 @@ +namespace MsieJavaScriptEngine.JsRt +{ + /// + /// The JavaScript type of a JavaScript value + /// + internal enum JsValueType + { + /// + /// The value is the undefined value + /// + Undefined = 0, + + /// + /// The value is the null value + /// + Null = 1, + + /// + /// The value is a JavaScript number value + /// + Number = 2, + + /// + /// The value is a JavaScript string value + /// + String = 3, + + /// + /// The value is a JavaScript Boolean value + /// + Boolean = 4, + + /// + /// The value is a JavaScript object value + /// + Object = 5, + + /// + /// The value is a JavaScript function object value + /// + Function = 6, + + /// + /// The value is a JavaScript error object value + /// + Error = 7, + + /// + /// The value is a JavaScript array object value + /// + Array = 8 + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/Native.cs b/MsieJavaScriptEngine/JsRt/Native.cs deleted file mode 100644 index a52e77f..0000000 --- a/MsieJavaScriptEngine/JsRt/Native.cs +++ /dev/null @@ -1,647 +0,0 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Diagnostics.CodeAnalysis; - using System.Runtime.InteropServices; - - /// - /// Native interfaces. - /// - internal static class Native - { - /// - /// Event mask for profiling. - /// - internal enum ProfilerEventMask - { - /// - /// Trace calls to script functions. - /// - TraceScriptFunctionCall = 0x1, - - /// - /// Trace calls to built-in functions. - /// - TraceNativeFunctionCall = 0x2, - - /// - /// Trace calls to DOM methods. - /// - TraceDomFunctionCall = 0x4, - - /// - /// Trace all calls except DOM methods. - /// - TraceAll = (TraceScriptFunctionCall | TraceNativeFunctionCall), - - /// - /// Trace all calls. - /// - TraceAllWithDom = (TraceAll | TraceDomFunctionCall) - } - - /// - /// Profiled script type. - /// - internal enum ProfilerScriptType - { - /// - /// A user script. - /// - User, - - /// - /// A dynamic script. - /// - Dynamic, - - /// - /// A native script. - /// - Native, - - /// - /// A DOM-related script. - /// - Dom - } - - /// - /// IProcessDebugManager32 COM interface. - /// - [Guid("51973C2f-CB0C-11d0-B5C9-00A0244A0E7A")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IProcessDebugManager32 - { - /// - /// Creates a new debug application. - /// - /// The new debug application. - void CreateApplication(out IDebugApplication32 debugApplication); - - /// - /// Gets the default debug application. - /// - /// The default debug application. - void GetDefaultApplication(out IDebugApplication32 debugApplication); - - /// - /// Adds a new debug application. - /// - /// The new debug application. - /// An engine-defined cookie. - void AddApplication(IDebugApplication32 debugApplication, out uint cookie); - - /// - /// Removes a debug application. - /// - /// The cookie of the debug application to remove. - void RemoveApplication(uint cookie); - - /// - /// Creates a debug document helper. - /// - /// The outer unknown. - /// The new debug document helper. - void CreateDebugDocumentHelper(object outerUnknown, out IDebugDocumentHelper32 helper); - } - - /// - /// IProcessDebugManager64 COM interface. - /// - [Guid("56b9fC1C-63A9-4CC1-AC21-087D69A17FAB")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IProcessDebugManager64 - { - /// - /// Creates a new debug application. - /// - /// The new debug application. - void CreateApplication(out IDebugApplication64 debugApplication); - - /// - /// Gets the default debug application. - /// - /// The default debug application. - void GetDefaultApplication(out IDebugApplication64 debugApplication); - - /// - /// Adds a new debug application. - /// - /// The new debug application. - /// An engine-defined cookie. - void AddApplication(IDebugApplication64 debugApplication, out uint cookie); - - /// - /// Removes a debug application. - /// - /// The cookie of the debug application to remove. - void RemoveApplication(uint cookie); - - /// - /// Creates a debug document helper. - /// - /// The outer unknown. - /// The new debug document helper. - void CreateDebugDocumentHelper(object outerUnknown, out IDebugDocumentHelper64 helper); - } - - /// - /// IDebugApplication32 COM interface. - /// - [Guid("51973C32-CB0C-11d0-B5C9-00A0244A0E7A")] - internal interface IDebugApplication32 - { - } - - /// - /// IDebugApplication64 COM interface. - /// - [Guid("4dedc754-04c7-4f10-9e60-16a390fe6e62")] - internal interface IDebugApplication64 - { - } - - /// - /// IDebugDocumentHelper32 COM interface. - /// - [Guid("51973C26-CB0C-11d0-B5C9-00A0244A0E7A")] - internal interface IDebugDocumentHelper32 - { - } - - /// - /// IDebugDocumentHelper64 COM interface. - /// - [Guid("c4c7363c-20fd-47f9-bd82-4855e0150871")] - internal interface IDebugDocumentHelper64 - { - } - - /// - /// IActiveScriptProfilerCallback COM interface. - /// - [Guid("740eca23-7d9d-42e5-ba9d-f8b24b1c7a9b")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IActiveScriptProfilerCallback - { - /// - /// Called when the profile is started. - /// - /// The context provided when profiling was started. - void Initialize(uint context); - - /// - /// Called when profiling is stopped. - /// - /// The reason code provided when profiling was stopped. - void Shutdown(uint reason); - - /// - /// Called when a script is compiled. - /// - /// The ID of the script. - /// The type of the script. - /// The debug document context, if any. - void ScriptCompiled(int scriptId, ProfilerScriptType type, IntPtr debugDocumentContext); - - /// - /// Called when a function is compiled. - /// - /// The ID of the function. - /// The ID of the script. - /// The name of the function. - /// The function name hint. - /// The debug document context, if any. - void FunctionCompiled(int functionId, int scriptId, [MarshalAs(UnmanagedType.LPWStr)] string functionName, [MarshalAs(UnmanagedType.LPWStr)] string functionNameHint, IntPtr debugDocumentContext); - - /// - /// Called when a function is entered. - /// - /// The ID of the script. - /// The ID of the function. - void OnFunctionEnter(int scriptId, int functionId); - - /// - /// Called when a function is exited. - /// - /// The ID of the script. - /// The ID of the function. - void OnFunctionExit(int scriptId, int functionId); - } - - /// - /// IActiveScriptProfilerCallback2 COM interface. - /// - [Guid("31B7F8AD-A637-409C-B22F-040995B6103D")] - internal interface IActiveScriptProfilerCallback2 : IActiveScriptProfilerCallback - { - /// - /// Called when a function is entered by name. - /// - /// The name of the function. - /// The type of the function. - void OnFunctionEnterByName(string functionName, ProfilerScriptType type); - - /// - /// Called when a function is exited by name. - /// - /// The name of the function. - /// The type of the function. - void OnFunctionExitByName(string functionName, ProfilerScriptType type); - } - - /// - /// IActiveScriptProfilerHeapEnum COM interface. - /// - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Name defined in COM.")] - [Guid("32E4694E-0D37-419B-B93D-FA20DED6E8EA")] - internal interface IActiveScriptProfilerHeapEnum - { - } - - /// - /// Throws if a native method returns an error code. - /// - /// The error. - internal static void ThrowIfError(JavaScriptErrorCode error) - { - if (error != JavaScriptErrorCode.NoError) - { - switch (error) - { - case JavaScriptErrorCode.InvalidArgument: - throw new JavaScriptUsageException(error, "Invalid argument."); - - case JavaScriptErrorCode.NullArgument: - throw new JavaScriptUsageException(error, "Null argument."); - - case JavaScriptErrorCode.NoCurrentContext: - throw new JavaScriptUsageException(error, "No current context."); - - case JavaScriptErrorCode.InExceptionState: - throw new JavaScriptUsageException(error, "Runtime is in exception state."); - - case JavaScriptErrorCode.NotImplemented: - throw new JavaScriptUsageException(error, "Method is not implemented."); - - case JavaScriptErrorCode.WrongThread: - throw new JavaScriptUsageException(error, "Runtime is active on another thread."); - - case JavaScriptErrorCode.RuntimeInUse: - throw new JavaScriptUsageException(error, "Runtime is in use."); - - case JavaScriptErrorCode.BadSerializedScript: - throw new JavaScriptUsageException(error, "Bad serialized script."); - - case JavaScriptErrorCode.InDisabledState: - throw new JavaScriptUsageException(error, "Runtime is disabled."); - - case JavaScriptErrorCode.CannotDisableExecution: - throw new JavaScriptUsageException(error, "Cannot disable execution."); - - case JavaScriptErrorCode.AlreadyDebuggingContext: - throw new JavaScriptUsageException(error, "Context is already in debug mode."); - - case JavaScriptErrorCode.HeapEnumInProgress: - throw new JavaScriptUsageException(error, "Heap enumeration is in progress."); - - case JavaScriptErrorCode.ArgumentNotObject: - throw new JavaScriptUsageException(error, "Argument is not an object."); - - case JavaScriptErrorCode.InProfileCallback: - throw new JavaScriptUsageException(error, "In a profile callback."); - - case JavaScriptErrorCode.InThreadServiceCallback: - throw new JavaScriptUsageException(error, "In a thread service callback."); - - case JavaScriptErrorCode.CannotSerializeDebugScript: - throw new JavaScriptUsageException(error, "Cannot serialize a debug script."); - - case JavaScriptErrorCode.AlreadyProfilingContext: - throw new JavaScriptUsageException(error, "Already profiling this context."); - - case JavaScriptErrorCode.IdleNotEnabled: - throw new JavaScriptUsageException(error, "Idle is not enabled."); - - case JavaScriptErrorCode.OutOfMemory: - throw new JavaScriptEngineException(error, "Out of memory."); - - case JavaScriptErrorCode.ScriptException: - { - JavaScriptValue errorObject; - JavaScriptErrorCode innerError = JsGetAndClearException(out errorObject); - - if (innerError != JavaScriptErrorCode.NoError) - { - throw new JavaScriptFatalException(innerError); - } - - throw new JavaScriptScriptException(error, errorObject, "Script threw an exception."); - } - - case JavaScriptErrorCode.ScriptCompile: - { - JavaScriptValue errorObject; - JavaScriptErrorCode innerError = JsGetAndClearException(out errorObject); - - if (innerError != JavaScriptErrorCode.NoError) - { - throw new JavaScriptFatalException(innerError); - } - - throw new JavaScriptScriptException(error, errorObject, "Compile error."); - } - - case JavaScriptErrorCode.ScriptTerminated: - throw new JavaScriptScriptException(error, JavaScriptValue.Invalid, "Script was terminated."); - - case JavaScriptErrorCode.ScriptEvalDisabled: - throw new JavaScriptScriptException(error, JavaScriptValue.Invalid, "Eval of strings is disabled in this runtime."); - - case JavaScriptErrorCode.Fatal: - throw new JavaScriptFatalException(error); - - default: - throw new JavaScriptFatalException(error); - } - } - } - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateRuntime(JavaScriptRuntimeAttributes attributes, JavaScriptRuntimeVersion runtimeVersion, JavaScriptThreadServiceCallback threadService, out JavaScriptRuntime runtime); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCollectGarbage(JavaScriptRuntime handle); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDisposeRuntime(JavaScriptRuntime handle); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetRuntimeMemoryUsage(JavaScriptRuntime runtime, out UIntPtr memoryUsage); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetRuntimeMemoryLimit(JavaScriptRuntime runtime, out UIntPtr memoryLimit); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetRuntimeMemoryLimit(JavaScriptRuntime runtime, UIntPtr memoryLimit); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetRuntimeMemoryAllocationCallback(JavaScriptRuntime runtime, IntPtr callbackState, JavaScriptMemoryAllocationCallback allocationCallback); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetRuntimeBeforeCollectCallback(JavaScriptRuntime runtime, IntPtr callbackState, JavaScriptBeforeCollectCallback beforeCollectCallback); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] - internal static extern JavaScriptErrorCode JsContextAddRef(JavaScriptContext reference, out uint count); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsAddRef(JavaScriptValue reference, out uint count); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] - internal static extern JavaScriptErrorCode JsContextRelease(JavaScriptContext reference, out uint count); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsRelease(JavaScriptValue reference, out uint count); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateContext(JavaScriptRuntime runtime, IDebugApplication64 debugSite, out JavaScriptContext newContext); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateContext(JavaScriptRuntime runtime, IDebugApplication32 debugSite, out JavaScriptContext newContext); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetCurrentContext(out JavaScriptContext currentContext); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetCurrentContext(JavaScriptContext context); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetRuntime(JavaScriptContext context, out JavaScriptRuntime runtime); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsIdle(out uint nextIdleTick); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsParseScript(string script, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsRunScript(string script, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsParseSerializedScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsRunSerializedScript(string script, byte[] buffer, JavaScriptSourceContext sourceContext, string sourceUrl, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetPropertyIdFromName(string name, out JavaScriptPropertyId propertyId); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetPropertyNameFromId(JavaScriptPropertyId propertyId, out IntPtr buffer); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetUndefinedValue(out JavaScriptValue undefinedValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetNullValue(out JavaScriptValue nullValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetTrueValue(out JavaScriptValue trueValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetFalseValue(out JavaScriptValue falseValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsBoolToBoolean(bool value, out JavaScriptValue booleanValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsBooleanToBool(JavaScriptValue booleanValue, out bool boolValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsConvertValueToBoolean(JavaScriptValue value, out JavaScriptValue booleanValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetValueType(JavaScriptValue value, out JavaScriptValueType type); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDoubleToNumber(double doubleValue, out JavaScriptValue value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsIntToNumber(int intValue, out JavaScriptValue value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsNumberToDouble(JavaScriptValue value, out double doubleValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsConvertValueToNumber(JavaScriptValue value, out JavaScriptValue numberValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetStringLength(JavaScriptValue sringValue, out int length); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsPointerToString(string value, UIntPtr stringLength, out JavaScriptValue stringValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStringToPointer(JavaScriptValue value, out IntPtr stringValue, out UIntPtr stringLength); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsConvertValueToString(JavaScriptValue value, out JavaScriptValue stringValue); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out JavaScriptValue value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsValueToVariant(JavaScriptValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetGlobalObject(out JavaScriptValue globalObject); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateObject(out JavaScriptValue obj); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateExternalObject(IntPtr data, JavaScriptObjectFinalizeCallback finalizeCallback, out JavaScriptValue obj); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsConvertValueToObject(JavaScriptValue value, out JavaScriptValue obj); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetPrototype(JavaScriptValue obj, out JavaScriptValue prototypeObject); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetPrototype(JavaScriptValue obj, JavaScriptValue prototypeObject); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetExtensionAllowed(JavaScriptValue obj, out bool value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsPreventExtension(JavaScriptValue obj); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, out JavaScriptValue value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetOwnPropertyDescriptor(JavaScriptValue obj, JavaScriptPropertyId propertyId, out JavaScriptValue propertyDescriptor); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetOwnPropertyNames(JavaScriptValue obj, out JavaScriptValue propertyNames); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, JavaScriptValue value, bool useStrictRules); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsHasProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, out bool hasProperty); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDeleteProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, bool useStrictRules, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDefineProperty(JavaScriptValue obj, JavaScriptPropertyId propertyId, JavaScriptValue propertyDescriptor, out bool result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsHasIndexedProperty(JavaScriptValue obj, JavaScriptValue index, out bool result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetIndexedProperty(JavaScriptValue obj, JavaScriptValue index, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetIndexedProperty(JavaScriptValue obj, JavaScriptValue index, JavaScriptValue value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDeleteIndexedProperty(JavaScriptValue obj, JavaScriptValue index); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsEquals(JavaScriptValue obj1, JavaScriptValue obj2, out bool result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStrictEquals(JavaScriptValue obj1, JavaScriptValue obj2, out bool result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsHasExternalData(JavaScriptValue obj, out bool value); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetExternalData(JavaScriptValue obj, out IntPtr externalData); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetExternalData(JavaScriptValue obj, IntPtr externalData); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateArray(uint length, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCallFunction(JavaScriptValue function, JavaScriptValue[] arguments, ushort argumentCount, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsConstructObject(JavaScriptValue function, JavaScriptValue[] arguments, ushort argumentCount, out JavaScriptValue result); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateFunction(JavaScriptNativeFunction nativeFunction, IntPtr externalData, out JavaScriptValue function); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateRangeError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateReferenceError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateSyntaxError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateTypeError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsCreateURIError(JavaScriptValue message, out JavaScriptValue error); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsHasException(out bool hasException); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsGetAndClearException(out JavaScriptValue exception); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsSetException(JavaScriptValue exception); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsDisableRuntimeExecution(JavaScriptRuntime runtime); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsEnableRuntimeExecution(JavaScriptRuntime runtime); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsIsRuntimeExecutionDisabled(JavaScriptRuntime runtime, out bool isDisabled); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsStopProfiling(int reason); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] - internal static extern JavaScriptErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); - - /// - /// ProcessDebugManager COM interface. - /// - [ComImport] - [Guid("78A51822-51F4-11D0-8F20-00805F2CD064")] - internal class ProcessDebugManager - { - } - } -} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs b/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs new file mode 100644 index 0000000..1715075 --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs @@ -0,0 +1,33 @@ +namespace MsieJavaScriptEngine.JsRt +{ + /// + /// Event mask for profiling + /// + internal enum ProfilerEventMask + { + /// + /// Trace calls to script functions + /// + TraceScriptFunctionCall = 0x1, + + /// + /// Trace calls to built-in functions + /// + TraceNativeFunctionCall = 0x2, + + /// + /// Trace calls to DOM methods + /// + TraceDomFunctionCall = 0x4, + + /// + /// Trace all calls except DOM methods + /// + TraceAll = (TraceScriptFunctionCall | TraceNativeFunctionCall), + + /// + /// Trace all calls + /// + TraceAllWithDom = (TraceAll | TraceDomFunctionCall) + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs b/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs new file mode 100644 index 0000000..212a51e --- /dev/null +++ b/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs @@ -0,0 +1,28 @@ +namespace MsieJavaScriptEngine.JsRt +{ + /// + /// Profiled script type + /// + internal enum ProfilerScriptType + { + /// + /// The user script + /// + User, + + /// + /// The dynamic script + /// + Dynamic, + + /// + /// The native script + /// + Native, + + /// + /// The DOM-related script + /// + Dom + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index e49f8f6..050a41a 100644 --- a/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -71,34 +71,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -144,6 +168,7 @@ Designer + cd "$(ProjectDir)..\Binaries\Microsoft Ajax Minifier\" diff --git a/MsieJavaScriptEngine/MsieJsEngine.cs b/MsieJavaScriptEngine/MsieJsEngine.cs index 2807628..8bdbbbe 100644 --- a/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/MsieJavaScriptEngine/MsieJsEngine.cs @@ -6,7 +6,8 @@ using ActiveScript; using Helpers; - using JsRt; + using JsRt.Edge; + using JsRt.Ie; using Resources; using Utilities; @@ -43,84 +44,6 @@ public MsieJsEngine() : this(new JsEngineSettings()) { } - /// - /// Constructs instance of MSIE JavaScript engine - /// - /// JavaScript engine mode - /// Failed to load a JavaScript engine. - /// Selected mode of JavaScript engine is not supported. - [Obsolete] - public MsieJsEngine(JsEngineMode engineMode) - : this(new JsEngineSettings - { - EngineMode = engineMode - }) - { } - - /// - /// Constructs instance of MSIE JavaScript engine - /// - /// JavaScript engine mode - /// Flag for whether to use the ECMAScript 5 Polyfill - /// Failed to load a JavaScript engine. - /// Selected mode of JavaScript engine is not supported. - [Obsolete] - public MsieJsEngine(JsEngineMode engineMode, bool useEcmaScript5Polyfill) - : this(new JsEngineSettings - { - EngineMode = engineMode, - UseEcmaScript5Polyfill = useEcmaScript5Polyfill - }) - { } - - /// - /// Constructs instance of MSIE JavaScript engine - /// - /// Flag for whether to use the ECMAScript 5 Polyfill - /// Failed to load a JavaScript engine. - /// Selected mode of JavaScript engine is not supported. - [Obsolete] - public MsieJsEngine(bool useEcmaScript5Polyfill) - : this(new JsEngineSettings - { - UseEcmaScript5Polyfill = useEcmaScript5Polyfill - }) - { } - - /// - /// Constructs instance of MSIE JavaScript engine - /// - /// Flag for whether to use the ECMAScript 5 Polyfill - /// Flag for whether to use the JSON2 library - /// Failed to load a JavaScript engine. - /// Selected mode of JavaScript engine is not supported. - [Obsolete] - public MsieJsEngine(bool useEcmaScript5Polyfill, bool useJson2Library) - : this(new JsEngineSettings - { - UseEcmaScript5Polyfill = useEcmaScript5Polyfill, - UseJson2Library = useJson2Library - }) - { } - - /// - /// Constructs instance of MSIE JavaScript engine - /// - /// JavaScript engine mode - /// Flag for whether to use the ECMAScript 5 Polyfill - /// Flag for whether to use the JSON2 library - /// Failed to load a JavaScript engine. - /// Selected mode of JavaScript engine is not supported. - [Obsolete] - public MsieJsEngine(JsEngineMode engineMode, bool useEcmaScript5Polyfill, bool useJson2Library) - : this(new JsEngineSettings - { - EngineMode = engineMode, - UseEcmaScript5Polyfill = useEcmaScript5Polyfill, - UseJson2Library = useJson2Library - }) - { } - /// /// Constructs instance of MSIE JavaScript engine /// @@ -134,9 +57,13 @@ public MsieJsEngine(JsEngineSettings settings) if (engineMode == JsEngineMode.Auto) { - if (ChakraJsRtJsEngine.IsSupported()) + if (ChakraEdgeJsRtJsEngine.IsSupported()) { - processedEngineMode = JsEngineMode.ChakraJsRt; + processedEngineMode = JsEngineMode.ChakraEdgeJsRt; + } + else if (ChakraIeJsRtJsEngine.IsSupported()) + { + processedEngineMode = JsEngineMode.ChakraIeJsRt; } else if (ChakraActiveScriptJsEngine.IsSupported()) { @@ -154,8 +81,11 @@ public MsieJsEngine(JsEngineSettings settings) switch (processedEngineMode) { - case JsEngineMode.ChakraJsRt: - _jsEngine = new ChakraJsRtJsEngine(); + case JsEngineMode.ChakraEdgeJsRt: + _jsEngine = new ChakraEdgeJsRtJsEngine(); + break; + case JsEngineMode.ChakraIeJsRt: + _jsEngine = new ChakraIeJsRtJsEngine(); break; case JsEngineMode.ChakraActiveScript: _jsEngine = new ChakraActiveScriptJsEngine(); diff --git a/MsieJavaScriptEngine/Resources/ES5.js b/MsieJavaScriptEngine/Resources/ES5.js index dfb5a3b..9ff4f4c 100644 --- a/MsieJavaScriptEngine/Resources/ES5.js +++ b/MsieJavaScriptEngine/Resources/ES5.js @@ -13,13 +13,13 @@ nativeStringSplit, isExecNpcgSupported // NPCG: nonparticipating capturing group ; - + //#region Internal methods - + function isArray(arg) { return objectToString(arg) === '[object Array]'; } - + function isNumber(arg) { return typeof arg === 'number'; } @@ -43,11 +43,11 @@ function objectToString(obj) { return Object.prototype.toString.call(obj); } - + //#endregion //#region Array methods - + // Array.prototype.every if (!Array.prototype.hasOwnProperty('every')) { Array.prototype.every = function (callbackfn, thisArg) { @@ -69,7 +69,7 @@ return true; }; } - + // Array.prototype.filter if (!Array.prototype.hasOwnProperty('filter')) { Array.prototype.filter = function (callbackfn, thisArg) { @@ -97,7 +97,7 @@ return result; }; } - + // Array.prototype.forEach if (!Array.prototype.hasOwnProperty('forEach')) { Array.prototype.forEach = function (callbackfn, thisArg) { @@ -117,7 +117,7 @@ } }; } - + // Array.prototype.indexOf if (!Array.prototype.hasOwnProperty('indexOf')) { Array.prototype.indexOf = function (searchElement, fromIndex) { @@ -151,12 +151,12 @@ return -1; }; } - + // Array.isArray if (!Array.hasOwnProperty('isArray')) { Array.isArray = isArray; } - + // Array.prototype.lastIndexOf if (!Array.prototype.hasOwnProperty('lastIndexOf')) { Array.prototype.lastIndexOf = function (searchElement, fromIndex) { @@ -190,7 +190,7 @@ return -1; }; } - + // Array.prototype.map if (!Array.prototype.hasOwnProperty('map')) { Array.prototype.map = function (callbackfn, thisArg) { @@ -215,7 +215,7 @@ return result; }; } - + // Array.prototype.reduce if (!Array.prototype.hasOwnProperty('reduce')) { Array.prototype.reduce = function (callbackfn, initialValue) { @@ -255,7 +255,7 @@ return value; }; } - + // Array.prototype.reduceRight if (!Array.prototype.hasOwnProperty('reduceRight')) { Array.prototype.reduceRight = function (callbackfn, initialValue) { @@ -351,7 +351,7 @@ //#endregion //#region Function methods - + // Function.prototype.bind if (!Function.prototype.hasOwnProperty('bind')) { Function.prototype.bind = function (thisArg) { @@ -365,11 +365,11 @@ }; }; } - + //#endregion //#region Object methods - + // Object.create if (!Object.hasOwnProperty('create')) { Object.create = function (obj) { @@ -383,7 +383,7 @@ return new F(); }; } - + // Object.keys if (!Object.hasOwnProperty('keys')) { Object.keys = function (obj) { @@ -404,19 +404,19 @@ return result; }; } - + //#endregion //#region String methods - + // String.prototype.split if ('aa'.split(/a/).length === 0 || '|a|'.split(/\|/).length === 1 || '1, 2'.split(/\s*(,)/).length === 2) { - + nativeStringSplit = String.prototype.split; isExecNpcgSupported = isUndefined(/()??/.exec('')[1]); - + String.prototype.split = function (separator, limit) { var str = this, result, @@ -430,7 +430,7 @@ argIndex, argCount ; - + // If `separator` is not a regex, use `nativeStringSplit` if (!isRegExp(separator)) { return nativeStringSplit.call(str, separator, limit); @@ -443,7 +443,7 @@ (separator.sticky ? 'y' : '') // Firefox 3+ ; lastLastIndex = 0; - + // Make `global` and avoid `lastIndex` issues by working with a copy separator1 = new RegExp(separator.source, flags + 'g'); @@ -451,7 +451,7 @@ // Doesn't need flags gy, but they don't hurt separator2 = new RegExp('^' + separator1.source + '$(?!\\s)', flags); } - + /* Values for `limit`, per the spec: * If undefined: 4294967295 // Math.pow(2, 32) - 1 * If 0, Infinity, or NaN: 0 @@ -512,7 +512,7 @@ return (result.length > limit) ? result.slice(0, limit) : result; }; } - + // String.prototype.trim if (!String.prototype.hasOwnProperty('trim')) { String.prototype.trim = (function (re) { @@ -521,6 +521,6 @@ }; } (/^\s*([\s\S]*\S)?\s*$/)); } - + //#endregion }()); \ No newline at end of file diff --git a/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/MsieJavaScriptEngine/Resources/Strings.Designer.cs index 672956a..454eecd 100644 --- a/MsieJavaScriptEngine/Resources/Strings.Designer.cs +++ b/MsieJavaScriptEngine/Resources/Strings.Designer.cs @@ -1,7 +1,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.0 +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -213,6 +213,18 @@ internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed { } } + /// + /// Looks up a localized string similar to Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. + ///See more details: + /// + ///{0}. + /// + internal static string Runtime_EdgeJsEngineNotLoaded { + get { + return ResourceManager.GetString("Runtime_EdgeJsEngineNotLoaded", resourceCulture); + } + } + /// /// Looks up a localized string similar to The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language.. /// @@ -240,6 +252,18 @@ internal static string Runtime_FunctionParameterTypeNotSupported { } } + /// + /// Looks up a localized string similar to Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. + ///See more details: + /// + ///{2}. + /// + internal static string Runtime_IeJsEngineNotLoaded { + get { + return ResourceManager.GetString("Runtime_IeJsEngineNotLoaded", resourceCulture); + } + } + /// /// Looks up a localized string similar to The function name '{0}' has incorrect format.. /// @@ -294,18 +318,6 @@ internal static string Runtime_JsEngineModeNotSupported { } } - /// - /// Looks up a localized string similar to Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. - ///See more details: - /// - ///{2}. - /// - internal static string Runtime_JsEngineNotLoaded { - get { - return ResourceManager.GetString("Runtime_JsEngineNotLoaded", resourceCulture); - } - } - /// /// Looks up a localized string similar to It is prohibited to use the Chakra JsRT and the Chakra ActiveScript on one machine at a time.. /// diff --git a/MsieJavaScriptEngine/Resources/Strings.resx b/MsieJavaScriptEngine/Resources/Strings.resx index 5995cd6..6544157 100644 --- a/MsieJavaScriptEngine/Resources/Strings.resx +++ b/MsieJavaScriptEngine/Resources/Strings.resx @@ -168,6 +168,12 @@ Failed to set '{0}' version of script language for the ActiveScript JavaScript engine. + + Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. +See more details: + +{0} + The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language. @@ -177,6 +183,12 @@ One of the function parameters '{0}' has a type `{1}`, which is not supported. + + Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. +See more details: + +{2} + The function name '{0}' has incorrect format. @@ -195,12 +207,6 @@ Selected '{0}' mode of JavaScript engine is not supported! - - Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. -See more details: - -{2} - It is prohibited to use the Chakra JsRT and the Chakra ActiveScript on one machine at a time. diff --git a/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx index 778e093..4d87871 100644 --- a/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx +++ b/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx @@ -168,6 +168,12 @@ Не удалось установить "{0}" версию языка сценариев для ActiveScript JavaScript-движка! + + Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. +Смотрите более подробную информацию об ошибке: + +{0} + Имя функции "{0}" запрещено, т.к. входит в список зарезервированных слов JavaScript! @@ -177,6 +183,12 @@ Один из параметров функции "{0}" имеет тип `{1}`, который не поддерживается! + + Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. +Смотрите более подробную информацию об ошибке: + +{2} + Имя функции "{0}" имеет некорректный формат! @@ -195,12 +207,6 @@ Выбранный вами режим JavaScript-движка "{0}" не поддерживается! - - Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. -Смотрите более подробную информацию об ошибке: - -{2} - Запрещается использовать Chakra JsRT и Chakra ActiveScript на одном компьютере одновременно. From edf8b86ed4fadf722b5dbb90d4a8201973a3ba08 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 26 Nov 2015 21:50:54 +0300 Subject: [PATCH 004/238] Added tests --- .../B_ChakraEdgeJsRt/CommonTests.cs | 21 +++++++ .../B_ChakraEdgeJsRt/Es5Tests.cs | 21 +++++++ .../C_ChakraIeJsRt/CommonTests.cs | 21 +++++++ .../C_ChakraIeJsRt/Es5Tests.cs | 21 +++++++ .../D_ChakraActiveScript/CommonTests.cs | 21 +++++++ .../D_ChakraActiveScript/Es5Tests.cs | 21 +++++++ .../E_Classic/CommonTests.cs | 21 +++++++ .../E_Classic/Es5Tests.cs | 60 +++++++++++++++++++ 8 files changed, 207 insertions(+) create mode 100644 MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs create mode 100644 MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs create mode 100644 MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs create mode 100644 MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs create mode 100644 MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs create mode 100644 MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs create mode 100644 MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs create mode 100644 MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs diff --git a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs b/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs new file mode 100644 index 0000000..fcc70be --- /dev/null +++ b/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.B_ChakraEdgeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class CommonTests : CommonTestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs b/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs new file mode 100644 index 0000000..5128912 --- /dev/null +++ b/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.B_ChakraEdgeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class Es5Tests : Es5TestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs b/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs new file mode 100644 index 0000000..c71b6df --- /dev/null +++ b/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.C_ChakraIeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class CommonTests : CommonTestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs b/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs new file mode 100644 index 0000000..c0c83e5 --- /dev/null +++ b/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.C_ChakraIeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class Es5Tests : Es5TestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs b/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs new file mode 100644 index 0000000..147e8ea --- /dev/null +++ b/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.D_ChakraActiveScript +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class CommonTests : CommonTestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs b/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs new file mode 100644 index 0000000..a03cd7c --- /dev/null +++ b/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.D_ChakraActiveScript +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class Es5Tests : Es5TestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs b/MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs new file mode 100644 index 0000000..1ca33f7 --- /dev/null +++ b/MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs @@ -0,0 +1,21 @@ +namespace MsieJavaScriptEngine.Tests.E_Classic +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class CommonTests : CommonTestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.Classic, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + } + } +} \ No newline at end of file diff --git a/MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs b/MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs new file mode 100644 index 0000000..0e106c3 --- /dev/null +++ b/MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs @@ -0,0 +1,60 @@ +namespace MsieJavaScriptEngine.Tests.E_Classic +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + + [TestFixture] + public class Es5Tests : Es5TestsBase + { + [TestFixtureSetUp] + public override void SetUp() + { + _jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.Classic, + UseEcmaScript5Polyfill = true, + UseJson2Library = true + }); + } + + #region Object methods + + [Test] + public override void ObjectKeysMethodIsSupported() + { + // Arrange + const string input1 = "Object.keys(['a', 'b', 'c']).toString();"; + const string targetOutput1 = "0,1,2"; + + const string input2 = "Object.keys({ 0: 'a', 1: 'b', 2: 'c' }).toString();"; + const string targetOutput2 = "0,1,2"; + + const string input3 = "Object.keys({ 100: 'a', 2: 'b', 7: 'c' }).toString();"; + const string targetOutput3 = "100,2,7"; + + const string initCode4 = @"var myObj = function() { }; +myObj.prototype = { getFoo: { value: function () { return this.foo } } };; +myObj.foo = 1; +"; + const string input4 = "Object.keys(myObj).toString();"; + const string targetOutput4 = "foo"; + + // Act + var output1 = _jsEngine.Evaluate(input1); + var output2 = _jsEngine.Evaluate(input2); + var output3 = _jsEngine.Evaluate(input3); + + _jsEngine.Execute(initCode4); + var output4 = _jsEngine.Evaluate(input4); + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + Assert.AreEqual(targetOutput4, output4); + } + + #endregion + } +} \ No newline at end of file From 808e2760ebcb41ae01f9aef27f43b294fc8b2150 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 27 Nov 2015 21:00:00 +0300 Subject: [PATCH 005/238] MsieJavaScriptEngine.sln: Projects were distributed across the solution directories --- MsieJavaScriptEngine.sln | 16 ++++++++++++---- .../ActiveScript/ActiveScriptException.cs | 0 .../ActiveScript/ActiveScriptJsEngineBase.cs | 0 .../ActiveScript/ActiveScriptParseWrapper.cs | 0 .../ActiveScript/ActiveScriptSiteWrapper.cs | 0 .../ActiveScript/ChakraActiveScriptJsEngine.cs | 0 .../ActiveScript/ClassicActiveScriptJsEngine.cs | 0 .../ActiveScript/IActiveScript.cs | 0 .../ActiveScript/IActiveScriptError.cs | 0 .../ActiveScript/IActiveScriptParse32.cs | 0 .../ActiveScript/IActiveScriptParse64.cs | 0 .../ActiveScript/IActiveScriptParseWrapper.cs | 0 .../ActiveScript/IActiveScriptProperty.cs | 0 .../ActiveScript/IActiveScriptSite.cs | 0 .../ActiveScript/ScriptHResult.cs | 0 .../ActiveScript/ScriptInfoFlags.cs | 0 .../ActiveScript/ScriptInterruptFlags.cs | 0 .../ActiveScript/ScriptItemFlags.cs | 0 .../ActiveScript/ScriptLanguageVersion.cs | 0 .../ActiveScript/ScriptProperty.cs | 0 .../ActiveScript/ScriptState.cs | 0 .../ActiveScript/ScriptTextFlags.cs | 0 .../ActiveScript/ScriptThreadState.cs | 0 .../ActiveScript/ScriptTypeLibFlags.cs | 0 .../Constants/JsEngineModeName.cs | 0 .../MsieJavaScriptEngine}/Helpers/ComHelpers.cs | 0 .../Helpers/JsErrorHelpers.cs | 0 .../Helpers/ValidationHelpers.cs | 0 .../MsieJavaScriptEngine}/IInnerJsEngine.cs | 0 .../JsEngineLoadException.cs | 0 .../MsieJavaScriptEngine}/JsEngineMode.cs | 0 .../MsieJavaScriptEngine}/JsEngineSettings.cs | 0 .../MsieJavaScriptEngine}/JsException.cs | 0 .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 0 .../JsRt/Edge/EdgeJsContext.cs | 0 .../JsRt/Edge/EdgeJsErrorHelpers.cs | 0 .../JsRt/Edge/EdgeJsNativeFunction.cs | 0 .../JsRt/Edge/EdgeJsPropertyId.cs | 0 .../JsRt/Edge/EdgeJsRuntime.cs | 0 .../JsRt/Edge/EdgeJsScope.cs | 0 .../JsRt/Edge/EdgeJsScriptException.cs | 0 .../JsRt/Edge/EdgeJsValue.cs | 0 .../JsRt/Edge/EdgeNativeMethods.cs | 0 .../JsRt/IActiveScriptProfilerCallback.cs | 0 .../JsRt/IActiveScriptProfilerCallback2.cs | 0 .../JsRt/IActiveScriptProfilerHeapEnum.cs | 0 .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 0 .../JsRt/Ie/IDebugApplication32.cs | 0 .../JsRt/Ie/IDebugApplication64.cs | 0 .../JsRt/Ie/IDebugDocumentHelper32.cs | 0 .../JsRt/Ie/IDebugDocumentHelper64.cs | 0 .../JsRt/Ie/IProcessDebugManager32.cs | 0 .../JsRt/Ie/IProcessDebugManager64.cs | 0 .../MsieJavaScriptEngine}/JsRt/Ie/IeJsContext.cs | 0 .../JsRt/Ie/IeJsErrorHelpers.cs | 0 .../JsRt/Ie/IeJsNativeFunction.cs | 0 .../JsRt/Ie/IeJsPropertyId.cs | 0 .../MsieJavaScriptEngine}/JsRt/Ie/IeJsRuntime.cs | 0 .../MsieJavaScriptEngine}/JsRt/Ie/IeJsScope.cs | 0 .../JsRt/Ie/IeJsScriptException.cs | 0 .../MsieJavaScriptEngine}/JsRt/Ie/IeJsValue.cs | 0 .../JsRt/Ie/IeNativeMethods.cs | 0 .../JsRt/Ie/ProcessDebugManager.cs | 0 .../JsRt/JsBackgroundWorkItemCallback.cs | 0 .../JsRt/JsBeforeCollectCallback.cs | 0 .../JsRt/JsEngineException.cs | 0 .../MsieJavaScriptEngine}/JsRt/JsErrorCode.cs | 0 .../MsieJavaScriptEngine}/JsRt/JsException.cs | 0 .../JsRt/JsFatalException.cs | 0 .../JsRt/JsMemoryAllocationCallback.cs | 0 .../JsRt/JsMemoryEventType.cs | 0 .../JsRt/JsObjectFinalizeCallback.cs | 0 .../JsRt/JsRuntimeAttributes.cs | 0 .../JsRt/JsRuntimeVersion.cs | 0 .../JsRt/JsSourceContext.cs | 0 .../JsRt/JsThreadServiceCallback.cs | 0 .../JsRt/JsUsageException.cs | 0 .../MsieJavaScriptEngine}/JsRt/JsValueType.cs | 0 .../JsRt/ProfilerEventMask.cs | 0 .../JsRt/ProfilerScriptType.cs | 0 .../MsieJavaScriptEngine}/JsRuntimeException.cs | 0 .../MsieJavaScriptEngine.csproj | 15 +++++++-------- .../MsieJavaScriptEngine}/MsieJsEngine.cs | 0 .../NotSupportedTypeException.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../MsieJavaScriptEngine}/Resources/ES5.js | 0 .../MsieJavaScriptEngine}/Resources/ES5.min.js | 0 .../Resources/Strings.Designer.cs | 0 .../MsieJavaScriptEngine}/Resources/Strings.resx | 0 .../Resources/Strings.ru-ru.Designer.cs | 0 .../Resources/Strings.ru-ru.resx | 0 .../MsieJavaScriptEngine}/Resources/json2.js | 0 .../MsieJavaScriptEngine}/Resources/json2.min.js | 0 .../MsieJavaScriptEngine}/Undefined.cs | 0 .../Utilities/SimplisticJsSerializer.cs | 0 .../Utilities/StringBuilderExtensions.cs | 0 .../Utilities/TypeConverter.cs | 0 .../MsieJavaScriptEngine}/Utilities/Utils.cs | 0 .../A_Auto/CommonTests.cs | 2 +- .../A_Auto/Es5Tests.cs | 2 +- .../B_ChakraEdgeJsRt/CommonTests.cs | 2 +- .../B_ChakraEdgeJsRt/Es5Tests.cs | 2 +- .../C_ChakraIeJsRt/CommonTests.cs | 2 +- .../C_ChakraIeJsRt/Es5Tests.cs | 2 +- .../CommonTestsBase.cs | 2 +- .../D_ChakraActiveScript/CommonTests.cs | 2 +- .../D_ChakraActiveScript/Es5Tests.cs | 2 +- .../E_Classic/CommonTests.cs | 2 +- .../E_Classic/Es5Tests.cs | 2 +- .../MsieJavaScriptEngine.Test}/Es5TestsBase.cs | 2 +- .../MsieJavaScriptEngine.Test.csproj | 6 +++--- .../Properties/AssemblyInfo.cs | 2 +- .../MsieJavaScriptEngine.Test}/Resources/cube.js | 0 .../Resources/power.js | 0 .../Resources/square.js | 0 .../ValidationTests.cs | 2 +- .../MsieJavaScriptEngine.Test}/packages.config | 0 117 files changed, 36 insertions(+), 29 deletions(-) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ActiveScriptException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ActiveScriptJsEngineBase.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ActiveScriptParseWrapper.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ActiveScriptSiteWrapper.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ChakraActiveScriptJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ClassicActiveScriptJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScript.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptError.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptParse32.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptParse64.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptParseWrapper.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptProperty.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/IActiveScriptSite.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptHResult.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptInfoFlags.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptInterruptFlags.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptItemFlags.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptLanguageVersion.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptProperty.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptState.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptTextFlags.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptThreadState.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/ActiveScript/ScriptTypeLibFlags.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Constants/JsEngineModeName.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Helpers/ComHelpers.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Helpers/JsErrorHelpers.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Helpers/ValidationHelpers.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/IInnerJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsEngineLoadException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsEngineMode.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsEngineSettings.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsContext.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsErrorHelpers.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsNativeFunction.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsPropertyId.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsRuntime.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsScope.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsScriptException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeJsValue.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Edge/EdgeNativeMethods.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/IActiveScriptProfilerCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/IActiveScriptProfilerCallback2.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/IActiveScriptProfilerHeapEnum.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/ChakraIeJsRtJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IDebugApplication32.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IDebugApplication64.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IDebugDocumentHelper32.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IDebugDocumentHelper64.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IProcessDebugManager32.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IProcessDebugManager64.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsContext.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsErrorHelpers.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsNativeFunction.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsPropertyId.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsRuntime.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsScope.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsScriptException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeJsValue.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/IeNativeMethods.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/Ie/ProcessDebugManager.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsBackgroundWorkItemCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsBeforeCollectCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsEngineException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsErrorCode.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsFatalException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsMemoryAllocationCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsMemoryEventType.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsObjectFinalizeCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsRuntimeAttributes.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsRuntimeVersion.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsSourceContext.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsThreadServiceCallback.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsUsageException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/JsValueType.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/ProfilerEventMask.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRt/ProfilerScriptType.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/JsRuntimeException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/MsieJavaScriptEngine.csproj (97%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/MsieJsEngine.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/NotSupportedTypeException.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Properties/AssemblyInfo.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/ES5.js (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/ES5.min.js (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/Strings.Designer.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/Strings.resx (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/Strings.ru-ru.Designer.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/Strings.ru-ru.resx (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/json2.js (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Resources/json2.min.js (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Undefined.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Utilities/SimplisticJsSerializer.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Utilities/StringBuilderExtensions.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Utilities/TypeConverter.cs (100%) rename {MsieJavaScriptEngine => src/MsieJavaScriptEngine}/Utilities/Utils.cs (100%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/A_Auto/CommonTests.cs (87%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/A_Auto/Es5Tests.cs (87%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/B_ChakraEdgeJsRt/CommonTests.cs (86%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/B_ChakraEdgeJsRt/Es5Tests.cs (86%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/C_ChakraIeJsRt/CommonTests.cs (86%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/C_ChakraIeJsRt/Es5Tests.cs (86%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/CommonTestsBase.cs (99%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/D_ChakraActiveScript/CommonTests.cs (85%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/D_ChakraActiveScript/Es5Tests.cs (85%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/E_Classic/CommonTests.cs (87%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/E_Classic/Es5Tests.cs (96%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/Es5TestsBase.cs (99%) rename MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj => test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj (95%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/Properties/AssemblyInfo.cs (90%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/Resources/cube.js (100%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/Resources/power.js (100%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/Resources/square.js (100%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/ValidationTests.cs (97%) rename {MsieJavaScriptEngine.Tests => test/MsieJavaScriptEngine.Test}/packages.config (100%) diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 0b90d7b..ff24ca6 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -1,10 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine", "MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{D672BC49-C454-4975-BD25-A555B9BDD793}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Tests", "MsieJavaScriptEngine.Tests\MsieJavaScriptEngine.Tests.csproj", "{B9D71EDB-31DD-444A-8606-07D873CA6E42}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{7179145C-46AE-47D9-AD3B-DC4A3035A4DF}" ProjectSection(SolutionItems) = preProject .nuget\NuGet.Config = .nuget\NuGet.Config @@ -12,6 +8,14 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{717914 .nuget\NuGet.targets = .nuget\NuGet.targets EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{1ACC225D-6787-47AB-AF34-C6021002390C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{D672BC49-C454-4975-BD25-A555B9BDD793}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{2A0DC227-73C5-4E3A-853A-83007AD56B85}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test", "test\MsieJavaScriptEngine.Test\MsieJavaScriptEngine.Test.csproj", "{B9D71EDB-31DD-444A-8606-07D873CA6E42}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,4 +34,8 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {D672BC49-C454-4975-BD25-A555B9BDD793} = {1ACC225D-6787-47AB-AF34-C6021002390C} + {B9D71EDB-31DD-444A-8606-07D873CA6E42} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + EndGlobalSection EndGlobal diff --git a/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs rename to src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs rename to src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs rename to src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs rename to src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs rename to src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs rename to src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScript.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs diff --git a/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs rename to src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptState.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs diff --git a/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs similarity index 100% rename from MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs rename to src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs diff --git a/MsieJavaScriptEngine/Constants/JsEngineModeName.cs b/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs similarity index 100% rename from MsieJavaScriptEngine/Constants/JsEngineModeName.cs rename to src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs diff --git a/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs similarity index 100% rename from MsieJavaScriptEngine/Helpers/ComHelpers.cs rename to src/MsieJavaScriptEngine/Helpers/ComHelpers.cs diff --git a/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs similarity index 100% rename from MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs rename to src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs diff --git a/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs similarity index 100% rename from MsieJavaScriptEngine/Helpers/ValidationHelpers.cs rename to src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs diff --git a/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/IInnerJsEngine.cs rename to src/MsieJavaScriptEngine/IInnerJsEngine.cs diff --git a/MsieJavaScriptEngine/JsEngineLoadException.cs b/src/MsieJavaScriptEngine/JsEngineLoadException.cs similarity index 100% rename from MsieJavaScriptEngine/JsEngineLoadException.cs rename to src/MsieJavaScriptEngine/JsEngineLoadException.cs diff --git a/MsieJavaScriptEngine/JsEngineMode.cs b/src/MsieJavaScriptEngine/JsEngineMode.cs similarity index 100% rename from MsieJavaScriptEngine/JsEngineMode.cs rename to src/MsieJavaScriptEngine/JsEngineMode.cs diff --git a/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs similarity index 100% rename from MsieJavaScriptEngine/JsEngineSettings.cs rename to src/MsieJavaScriptEngine/JsEngineSettings.cs diff --git a/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs similarity index 100% rename from MsieJavaScriptEngine/JsException.cs rename to src/MsieJavaScriptEngine/JsException.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs diff --git a/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs rename to src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs rename to src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs rename to src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs diff --git a/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs rename to src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs diff --git a/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs rename to src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs diff --git a/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsEngineException.cs rename to src/MsieJavaScriptEngine/JsRt/JsEngineException.cs diff --git a/MsieJavaScriptEngine/JsRt/JsErrorCode.cs b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsErrorCode.cs rename to src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs diff --git a/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsException.cs rename to src/MsieJavaScriptEngine/JsRt/JsException.cs diff --git a/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsFatalException.cs rename to src/MsieJavaScriptEngine/JsRt/JsFatalException.cs diff --git a/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs b/src/MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs rename to src/MsieJavaScriptEngine/JsRt/JsMemoryEventType.cs diff --git a/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs rename to src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs diff --git a/MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs rename to src/MsieJavaScriptEngine/JsRt/JsRuntimeVersion.cs diff --git a/MsieJavaScriptEngine/JsRt/JsSourceContext.cs b/src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsSourceContext.cs rename to src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs diff --git a/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs diff --git a/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsUsageException.cs rename to src/MsieJavaScriptEngine/JsRt/JsUsageException.cs diff --git a/MsieJavaScriptEngine/JsRt/JsValueType.cs b/src/MsieJavaScriptEngine/JsRt/JsValueType.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/JsValueType.cs rename to src/MsieJavaScriptEngine/JsRt/JsValueType.cs diff --git a/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs b/src/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs rename to src/MsieJavaScriptEngine/JsRt/ProfilerEventMask.cs diff --git a/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs b/src/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs similarity index 100% rename from MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs rename to src/MsieJavaScriptEngine/JsRt/ProfilerScriptType.cs diff --git a/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs similarity index 100% rename from MsieJavaScriptEngine/JsRuntimeException.cs rename to src/MsieJavaScriptEngine/JsRuntimeException.cs diff --git a/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj similarity index 97% rename from MsieJavaScriptEngine/MsieJavaScriptEngine.csproj rename to src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 050a41a..dcf4cad 100644 --- a/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -39,7 +39,7 @@ true - ..\MsieJavaScriptEngine.snk + ..\..\MsieJavaScriptEngine.snk @@ -145,11 +145,6 @@ - - - MsieJavaScriptEngine.snk - - @@ -168,10 +163,14 @@ Designer - + + + MsieJavaScriptEngine.snk + + - cd "$(ProjectDir)..\Binaries\Microsoft Ajax Minifier\" + cd "$(ProjectDir)..\..\Binaries\Microsoft Ajax Minifier\" del "$(ProjectDir)Resources\ES5.min.js" AjaxMinifier.exe "$(ProjectDir)Resources\ES5.js" –out "$(ProjectDir)Resources\ES5.min.js" diff --git a/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs similarity index 100% rename from MsieJavaScriptEngine/MsieJsEngine.cs rename to src/MsieJavaScriptEngine/MsieJsEngine.cs diff --git a/MsieJavaScriptEngine/NotSupportedTypeException.cs b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs similarity index 100% rename from MsieJavaScriptEngine/NotSupportedTypeException.cs rename to src/MsieJavaScriptEngine/NotSupportedTypeException.cs diff --git a/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs similarity index 100% rename from MsieJavaScriptEngine/Properties/AssemblyInfo.cs rename to src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs diff --git a/MsieJavaScriptEngine/Resources/ES5.js b/src/MsieJavaScriptEngine/Resources/ES5.js similarity index 100% rename from MsieJavaScriptEngine/Resources/ES5.js rename to src/MsieJavaScriptEngine/Resources/ES5.js diff --git a/MsieJavaScriptEngine/Resources/ES5.min.js b/src/MsieJavaScriptEngine/Resources/ES5.min.js similarity index 100% rename from MsieJavaScriptEngine/Resources/ES5.min.js rename to src/MsieJavaScriptEngine/Resources/ES5.min.js diff --git a/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs similarity index 100% rename from MsieJavaScriptEngine/Resources/Strings.Designer.cs rename to src/MsieJavaScriptEngine/Resources/Strings.Designer.cs diff --git a/MsieJavaScriptEngine/Resources/Strings.resx b/src/MsieJavaScriptEngine/Resources/Strings.resx similarity index 100% rename from MsieJavaScriptEngine/Resources/Strings.resx rename to src/MsieJavaScriptEngine/Resources/Strings.resx diff --git a/MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs similarity index 100% rename from MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs rename to src/MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs diff --git a/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx similarity index 100% rename from MsieJavaScriptEngine/Resources/Strings.ru-ru.resx rename to src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx diff --git a/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js similarity index 100% rename from MsieJavaScriptEngine/Resources/json2.js rename to src/MsieJavaScriptEngine/Resources/json2.js diff --git a/MsieJavaScriptEngine/Resources/json2.min.js b/src/MsieJavaScriptEngine/Resources/json2.min.js similarity index 100% rename from MsieJavaScriptEngine/Resources/json2.min.js rename to src/MsieJavaScriptEngine/Resources/json2.min.js diff --git a/MsieJavaScriptEngine/Undefined.cs b/src/MsieJavaScriptEngine/Undefined.cs similarity index 100% rename from MsieJavaScriptEngine/Undefined.cs rename to src/MsieJavaScriptEngine/Undefined.cs diff --git a/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs b/src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs similarity index 100% rename from MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs rename to src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs diff --git a/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs similarity index 100% rename from MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs rename to src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs diff --git a/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs similarity index 100% rename from MsieJavaScriptEngine/Utilities/TypeConverter.cs rename to src/MsieJavaScriptEngine/Utilities/TypeConverter.cs diff --git a/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs similarity index 100% rename from MsieJavaScriptEngine/Utilities/Utils.cs rename to src/MsieJavaScriptEngine/Utilities/Utils.cs diff --git a/MsieJavaScriptEngine.Tests/A_Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs similarity index 87% rename from MsieJavaScriptEngine.Tests/A_Auto/CommonTests.cs rename to test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs index 5649697..faa803c 100644 --- a/MsieJavaScriptEngine.Tests/A_Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.A_Auto +namespace MsieJavaScriptEngine.Test.A_Auto { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/A_Auto/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs similarity index 87% rename from MsieJavaScriptEngine.Tests/A_Auto/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs index 81563b3..0cfcae6 100644 --- a/MsieJavaScriptEngine.Tests/A_Auto/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.A_Auto +namespace MsieJavaScriptEngine.Test.A_Auto { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs similarity index 86% rename from MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs rename to test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs index fcc70be..0d072c5 100644 --- a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.B_ChakraEdgeJsRt +namespace MsieJavaScriptEngine.Test.B_ChakraEdgeJsRt { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs similarity index 86% rename from MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs index 5128912..7cec7bd 100644 --- a/MsieJavaScriptEngine.Tests/B_ChakraEdgeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.B_ChakraEdgeJsRt +namespace MsieJavaScriptEngine.Test.B_ChakraEdgeJsRt { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs similarity index 86% rename from MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs rename to test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs index c71b6df..9af7410 100644 --- a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.C_ChakraIeJsRt +namespace MsieJavaScriptEngine.Test.C_ChakraIeJsRt { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs similarity index 86% rename from MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs index c0c83e5..e4f2388 100644 --- a/MsieJavaScriptEngine.Tests/C_ChakraIeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.C_ChakraIeJsRt +namespace MsieJavaScriptEngine.Test.C_ChakraIeJsRt { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs similarity index 99% rename from MsieJavaScriptEngine.Tests/CommonTestsBase.cs rename to test/MsieJavaScriptEngine.Test/CommonTestsBase.cs index 1d993d1..a996ce6 100644 --- a/MsieJavaScriptEngine.Tests/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests +namespace MsieJavaScriptEngine.Test { using System; using System.IO; diff --git a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs similarity index 85% rename from MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs rename to test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs index 147e8ea..032c964 100644 --- a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.D_ChakraActiveScript +namespace MsieJavaScriptEngine.Test.D_ChakraActiveScript { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs similarity index 85% rename from MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs index a03cd7c..b1d1910 100644 --- a/MsieJavaScriptEngine.Tests/D_ChakraActiveScript/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.D_ChakraActiveScript +namespace MsieJavaScriptEngine.Test.D_ChakraActiveScript { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs similarity index 87% rename from MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs rename to test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs index 1ca33f7..8df95d6 100644 --- a/MsieJavaScriptEngine.Tests/E_Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.E_Classic +namespace MsieJavaScriptEngine.Test.E_Classic { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs similarity index 96% rename from MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs index 0e106c3..62962ae 100644 --- a/MsieJavaScriptEngine.Tests/E_Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests.E_Classic +namespace MsieJavaScriptEngine.Test.E_Classic { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs similarity index 99% rename from MsieJavaScriptEngine.Tests/Es5TestsBase.cs rename to test/MsieJavaScriptEngine.Test/Es5TestsBase.cs index a8ba428..0dfef22 100644 --- a/MsieJavaScriptEngine.Tests/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests +namespace MsieJavaScriptEngine.Test { using System; diff --git a/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj b/test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj similarity index 95% rename from MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj rename to test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj index dab879f..360e69a 100644 --- a/MsieJavaScriptEngine.Tests/MsieJavaScriptEngine.Tests.csproj +++ b/test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj @@ -7,8 +7,8 @@ {B9D71EDB-31DD-444A-8606-07D873CA6E42} Library Properties - MsieJavaScriptEngine.Tests - MsieJavaScriptEngine.Tests + MsieJavaScriptEngine.Test + MsieJavaScriptEngine.Test v4.0 512 ..\ @@ -66,7 +66,7 @@ - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine diff --git a/MsieJavaScriptEngine.Tests/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs similarity index 90% rename from MsieJavaScriptEngine.Tests/Properties/AssemblyInfo.cs rename to test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs index 4da29f5..95b53ef 100644 --- a/MsieJavaScriptEngine.Tests/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs @@ -1,7 +1,7 @@ using System.Reflection; using System.Runtime.InteropServices; -[assembly: AssemblyTitle("MsieJavaScriptEngine.Tests")] +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] diff --git a/MsieJavaScriptEngine.Tests/Resources/cube.js b/test/MsieJavaScriptEngine.Test/Resources/cube.js similarity index 100% rename from MsieJavaScriptEngine.Tests/Resources/cube.js rename to test/MsieJavaScriptEngine.Test/Resources/cube.js diff --git a/MsieJavaScriptEngine.Tests/Resources/power.js b/test/MsieJavaScriptEngine.Test/Resources/power.js similarity index 100% rename from MsieJavaScriptEngine.Tests/Resources/power.js rename to test/MsieJavaScriptEngine.Test/Resources/power.js diff --git a/MsieJavaScriptEngine.Tests/Resources/square.js b/test/MsieJavaScriptEngine.Test/Resources/square.js similarity index 100% rename from MsieJavaScriptEngine.Tests/Resources/square.js rename to test/MsieJavaScriptEngine.Test/Resources/square.js diff --git a/MsieJavaScriptEngine.Tests/ValidationTests.cs b/test/MsieJavaScriptEngine.Test/ValidationTests.cs similarity index 97% rename from MsieJavaScriptEngine.Tests/ValidationTests.cs rename to test/MsieJavaScriptEngine.Test/ValidationTests.cs index b0ad277..2ceef43 100644 --- a/MsieJavaScriptEngine.Tests/ValidationTests.cs +++ b/test/MsieJavaScriptEngine.Test/ValidationTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Tests +namespace MsieJavaScriptEngine.Test { using NUnit.Framework; diff --git a/MsieJavaScriptEngine.Tests/packages.config b/test/MsieJavaScriptEngine.Test/packages.config similarity index 100% rename from MsieJavaScriptEngine.Tests/packages.config rename to test/MsieJavaScriptEngine.Test/packages.config From 31628c19b5ca0dbef7716ec8ef1857a16b471640 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 27 Nov 2015 21:07:04 +0300 Subject: [PATCH 006/238] Fixed a `ExecutionOfResourceByTypeIsCorrect` and `ExecutionOfResourceByAssemblyIsCorrect` test methods --- test/MsieJavaScriptEngine.Test/CommonTestsBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs index a996ce6..50a814a 100644 --- a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs @@ -149,7 +149,7 @@ public virtual void ExecutionOfFileIsCorrect() public virtual void ExecutionOfResourceByTypeIsCorrect() { // Arrange - const string resourceName = "MsieJavaScriptEngine.Tests.Resources.cube.js"; + const string resourceName = "MsieJavaScriptEngine.Test.Resources.cube.js"; const string input = "cube(5);"; const int targetOutput = 125; @@ -165,7 +165,7 @@ public virtual void ExecutionOfResourceByTypeIsCorrect() public virtual void ExecutionOfResourceByAssemblyIsCorrect() { // Arrange - const string resourceName = "MsieJavaScriptEngine.Tests.Resources.power.js"; + const string resourceName = "MsieJavaScriptEngine.Test.Resources.power.js"; const string input = "power(4, 3);"; const int targetOutput = 64; From ecc8a7395867f1edd09199d5200e30fde3d36df6 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 28 Nov 2015 19:51:40 +0300 Subject: [PATCH 007/238] Made refactoring of tests --- .../A_Auto/CommonTests.cs | 9 +- .../A_Auto/Es5Tests.cs | 7 +- .../B_ChakraEdgeJsRt/CommonTests.cs | 7 +- .../B_ChakraEdgeJsRt/Es5Tests.cs | 7 +- .../C_ChakraIeJsRt/CommonTests.cs | 7 +- .../C_ChakraIeJsRt/Es5Tests.cs | 7 +- .../CommonTestsBase.cs | 320 +++++++++++++----- .../D_ChakraActiveScript/CommonTests.cs | 7 +- .../D_ChakraActiveScript/Es5Tests.cs | 7 +- .../E_Classic/CommonTests.cs | 7 +- .../E_Classic/Es5Tests.cs | 25 +- .../MsieJavaScriptEngine.Test/Es5TestsBase.cs | 255 ++++++++++---- 12 files changed, 466 insertions(+), 199 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs index faa803c..94405cb 100644 --- a/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs @@ -1,20 +1,19 @@ namespace MsieJavaScriptEngine.Test.A_Auto { - using NUnit.Framework; - using MsieJavaScriptEngine; public class CommonTests : CommonTestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.Auto, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs index 0cfcae6..6d392c8 100644 --- a/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs @@ -7,15 +7,16 @@ [TestFixture] public class Es5Tests : Es5TestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.Auto, UseEcmaScript5Polyfill = true, UseJson2Library = true }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs index 0d072c5..c41b613 100644 --- a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs @@ -7,15 +7,16 @@ [TestFixture] public class CommonTests : CommonTestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraEdgeJsRt, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs index 7cec7bd..3d89057 100644 --- a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs @@ -7,15 +7,16 @@ [TestFixture] public class Es5Tests : Es5TestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraEdgeJsRt, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs index 9af7410..53a40f9 100644 --- a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs @@ -7,15 +7,16 @@ [TestFixture] public class CommonTests : CommonTestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraIeJsRt, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs index e4f2388..96bcce7 100644 --- a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs @@ -7,15 +7,16 @@ [TestFixture] public class Es5Tests : Es5TestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraIeJsRt, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs index 50a814a..72caad8 100644 --- a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs @@ -11,10 +11,7 @@ [TestFixture] public abstract class CommonTestsBase { - protected MsieJsEngine _jsEngine; - - [TestFixtureSetUp] - public abstract void SetUp(); + protected abstract MsieJsEngine CreateJsEngine(); #region Evaluation of code @@ -26,7 +23,12 @@ public virtual void EvaluationOfExpressionWithUndefinedResultIsCorrect() var targetOutput = Undefined.Value; // Act - var output = _jsEngine.Evaluate(input); + object output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -40,7 +42,12 @@ public virtual void EvaluationOfExpressionWithNullResultIsCorrect() const object targetOutput = null; // Act - var output = _jsEngine.Evaluate(input); + object output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -57,8 +64,14 @@ public virtual void EvaluationOfExpressionWithBooleanResultIsCorrect() const bool targetOutput2 = false; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + bool output1; + bool output2; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -73,7 +86,12 @@ public virtual void EvaluationOfExpressionWithIntegerResultIsCorrect() const int targetOutput = 36; // Act - var output = _jsEngine.Evaluate(input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -87,7 +105,12 @@ public virtual void EvaluationOfExpressionWithDoubleResultIsCorrect() const double targetOutput = 3.36; // Act - var output = Math.Round(_jsEngine.Evaluate(input), 2); + double output; + + using (var jsEngine = CreateJsEngine()) + { + output = Math.Round(jsEngine.Evaluate(input), 2); + } // Assert Assert.AreEqual(targetOutput, output); @@ -101,7 +124,12 @@ public virtual void EvaluationOfExpressionWithStringResultIsCorrect() const string targetOutput = "Hello, Vasya?"; // Act - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -122,8 +150,13 @@ public virtual void ExecutionOfCodeIsCorrect() const int targetOutput = 16; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.Evaluate(input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -138,8 +171,13 @@ public virtual void ExecutionOfFileIsCorrect() const int targetOutput = 36; // Act - _jsEngine.ExecuteFile(filePath); - var output = _jsEngine.Evaluate(input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.ExecuteFile(filePath); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -154,8 +192,13 @@ public virtual void ExecutionOfResourceByTypeIsCorrect() const int targetOutput = 125; // Act - _jsEngine.ExecuteResource(resourceName, GetType()); - var output = _jsEngine.Evaluate(input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.ExecuteResource(resourceName, GetType()); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -170,8 +213,13 @@ public virtual void ExecutionOfResourceByAssemblyIsCorrect() const int targetOutput = 64; // Act - _jsEngine.ExecuteResource(resourceName, Assembly.GetExecutingAssembly()); - var output = _jsEngine.Evaluate(input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.ExecuteResource(resourceName, Assembly.GetExecutingAssembly()); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -191,8 +239,13 @@ public virtual void CallingOfFunctionWithoutParametersIsCorrect() const string targetOutput = "Hooray!"; // Act - _jsEngine.Execute(functionCode); - var output = (string)_jsEngine.CallFunction("hooray"); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = (string) jsEngine.CallFunction("hooray"); + } // Assert Assert.AreEqual(targetOutput, output); @@ -212,8 +265,13 @@ public virtual void CallingOfFunctionWithUndefinedResultIsCorrect() object input = Undefined.Value; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("testUndefined", input); + object output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("testUndefined", input); + } // Assert Assert.AreEqual(input, output); @@ -233,8 +291,13 @@ public virtual void CallingOfFunctionWithNullResultIsCorrect() const object input = null; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("testNull", input); + object output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("testNull", input); + } // Assert Assert.AreEqual(input, output); @@ -251,8 +314,13 @@ public virtual void CallingOfFunctionWithBooleanResultIsCorrect() const bool targetOutput = true; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("inverse", input); + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("inverse", input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -269,8 +337,13 @@ public virtual void CallingOfFunctionWithIntegerResultIsCorrect() const int targetOutput = -28; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("negate", input); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("negate", input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -287,8 +360,13 @@ public virtual void CallingOfFunctionWithDoubleResultIsCorrect() const double targetOutput = 9.6; // Act - _jsEngine.Execute(functionCode); - var output = Math.Round(_jsEngine.CallFunction("triple", input), 1); + double output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = Math.Round(jsEngine.CallFunction("triple", input), 1); + } // Assert Assert.AreEqual(targetOutput, output); @@ -305,8 +383,13 @@ public virtual void CallingOfFunctionWithStringResultIsCorrect() const string targetOutput = "Hello, Vovan!"; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("greeting", input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("greeting", input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -333,9 +416,14 @@ public virtual void CallingOfFunctionWithManyParametersIsCorrect() }"; // Act - _jsEngine.Execute(functionCode); - var output = (string)_jsEngine.CallFunction("determineArgumentsTypes", Undefined.Value, null, - true, 12, 3.14, "test"); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = (string) jsEngine.CallFunction("determineArgumentsTypes", Undefined.Value, null, + true, 12, 3.14, "test"); + } // Assert Assert.AreEqual("undefined, object, boolean, number, number, string", output); @@ -367,8 +455,13 @@ public virtual void CallingOfFunctionWithManyParametersAndBooleanResultIsCorrect }"; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("and", true, true, false, true); + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("and", true, true, false, true); + } // Assert Assert.AreEqual(false, output); @@ -392,8 +485,13 @@ public virtual void CallingOfFunctionWithManyParametersAndIntegerResultIsCorrect }"; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("sum", 120, 5, 18, 63); + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("sum", 120, 5, 18, 63); + } // Assert Assert.AreEqual(206, output); @@ -417,8 +515,13 @@ public virtual void CallingOfFunctionWithManyParametersAndDoubleResultIsCorrect( }"; // Act - _jsEngine.Execute(functionCode); - var output = Math.Round(_jsEngine.CallFunction("sum", 22000, 8.5, 0.05, 3), 2); + double output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = Math.Round(jsEngine.CallFunction("sum", 22000, 8.5, 0.05, 3), 2); + } // Assert Assert.AreEqual(22011.55, output); @@ -442,8 +545,13 @@ public virtual void CallingOfFunctionWithManyParametersAndStringResultIsCorrect( }"; // Act - _jsEngine.Execute(functionCode); - var output = _jsEngine.CallFunction("concatenate", "Hello", ",", " ", "Petya", "!"); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("concatenate", "Hello", ",", " ", "Petya", "!"); + } // Assert Assert.AreEqual("Hello, Petya!", output); @@ -461,9 +569,15 @@ public virtual void SettingAndGettingVariableWithUndefinedValueIsCorrect() object input = Undefined.Value; // Act - _jsEngine.SetVariableValue(variableName, input); - bool variableExists = _jsEngine.HasVariable(variableName); - var output = _jsEngine.GetVariableValue(variableName); + bool variableExists; + object output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input); + variableExists = jsEngine.HasVariable(variableName); + output = jsEngine.GetVariableValue(variableName); + } // Assert Assert.IsFalse(variableExists); @@ -478,9 +592,15 @@ public virtual void SettingAndGettingVariableWithNullValueIsCorrect() const object input = null; // Act - _jsEngine.SetVariableValue(variableName, input); - bool variableExists = _jsEngine.HasVariable(variableName); - var output = _jsEngine.GetVariableValue(variableName); + bool variableExists; + object output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input); + variableExists = jsEngine.HasVariable(variableName); + output = jsEngine.GetVariableValue(variableName); + } // Assert Assert.IsTrue(variableExists); @@ -499,13 +619,20 @@ public virtual void SettingAndGettingVariableWithBooleanValueIsCorrect() const bool input2 = true; // Act - _jsEngine.SetVariableValue(variableName, input1); - bool variableExists = _jsEngine.HasVariable(variableName); - _jsEngine.Execute(string.Format("{0} = !{0};", variableName)); - var output1 = _jsEngine.GetVariableValue(variableName); + bool variableExists; + bool output1; + bool output2; - _jsEngine.SetVariableValue(variableName, input2); - var output2 = _jsEngine.GetVariableValue(variableName); + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input1); + variableExists = jsEngine.HasVariable(variableName); + jsEngine.Execute(string.Format("{0} = !{0};", variableName)); + output1 = jsEngine.GetVariableValue(variableName); + + jsEngine.SetVariableValue(variableName, input2); + output2 = jsEngine.GetVariableValue(variableName); + } // Assert Assert.IsTrue(variableExists); @@ -526,13 +653,20 @@ public virtual void SettingAndGettingVariableWithIntegerValueIsCorrect() const int input2 = 711; // Act - _jsEngine.SetVariableValue(variableName, input1); - bool variableExists = _jsEngine.HasVariable(variableName); - _jsEngine.Execute(string.Format("{0} += 3;", variableName)); - var output1 = _jsEngine.GetVariableValue(variableName); + bool variableExists; + int output1; + int output2; - _jsEngine.SetVariableValue(variableName, input2); - var output2 = _jsEngine.GetVariableValue(variableName); + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input1); + variableExists = jsEngine.HasVariable(variableName); + jsEngine.Execute(string.Format("{0} += 3;", variableName)); + output1 = jsEngine.GetVariableValue(variableName); + + jsEngine.SetVariableValue(variableName, input2); + output2 = jsEngine.GetVariableValue(variableName); + } // Assert Assert.IsTrue(variableExists); @@ -553,13 +687,20 @@ public virtual void SettingAndGettingVariableWithDoubleValueIsCorrect() const double input2 = 3.50; // Act - _jsEngine.SetVariableValue(variableName, input1); - bool variableExists = _jsEngine.HasVariable(variableName); - _jsEngine.Execute(string.Format("{0} -= 0.03;", variableName)); - var output1 = Math.Round(_jsEngine.GetVariableValue(variableName), 2); + bool variableExists; + double output1; + double output2; - _jsEngine.SetVariableValue(variableName, input2); - var output2 = Math.Round(_jsEngine.GetVariableValue(variableName), 2); + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input1); + variableExists = jsEngine.HasVariable(variableName); + jsEngine.Execute(string.Format("{0} -= 0.03;", variableName)); + output1 = Math.Round(jsEngine.GetVariableValue(variableName), 2); + + jsEngine.SetVariableValue(variableName, input2); + output2 = Math.Round(jsEngine.GetVariableValue(variableName), 2); + } // Assert Assert.IsTrue(variableExists); @@ -580,13 +721,20 @@ public virtual void SettingAndGettingVariableWithStringValueIsCorrect() const string input2 = "Hurrah"; // Act - _jsEngine.SetVariableValue(variableName, input1); - bool variableExists = _jsEngine.HasVariable(variableName); - _jsEngine.Execute(string.Format("{0} += '!';", variableName)); - var output1 = _jsEngine.GetVariableValue(variableName); + bool variableExists; + string output1; + string output2; - _jsEngine.SetVariableValue(variableName, input2); - var output2 = _jsEngine.GetVariableValue(variableName); + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input1); + variableExists = jsEngine.HasVariable(variableName); + jsEngine.Execute(string.Format("{0} += '!';", variableName)); + output1 = jsEngine.GetVariableValue(variableName); + + jsEngine.SetVariableValue(variableName, input2); + output2 = jsEngine.GetVariableValue(variableName); + } // Assert Assert.IsTrue(variableExists); @@ -603,10 +751,16 @@ public virtual void RemovingVariableIsCorrect() const double input = 120.55; // Act - _jsEngine.SetVariableValue(variableName, input); - bool variableBeforeRemovingExists = _jsEngine.HasVariable(variableName); - _jsEngine.RemoveVariable(variableName); - bool variableAfterRemovingExists = _jsEngine.HasVariable(variableName); + bool variableBeforeRemovingExists; + bool variableAfterRemovingExists; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input); + variableBeforeRemovingExists = jsEngine.HasVariable(variableName); + jsEngine.RemoveVariable(variableName); + variableAfterRemovingExists = jsEngine.HasVariable(variableName); + } // Assert Assert.IsTrue(variableBeforeRemovingExists); @@ -614,15 +768,5 @@ public virtual void RemovingVariableIsCorrect() } #endregion - - [TestFixtureTearDown] - public virtual void TearDown() - { - if (_jsEngine != null) - { - _jsEngine.Dispose(); - _jsEngine = null; - } - } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs index 032c964..727e101 100644 --- a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs @@ -7,15 +7,16 @@ [TestFixture] public class CommonTests : CommonTestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraActiveScript, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs index b1d1910..f22b165 100644 --- a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs @@ -7,15 +7,16 @@ [TestFixture] public class Es5Tests : Es5TestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.ChakraActiveScript, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs index 8df95d6..be4d092 100644 --- a/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs @@ -7,15 +7,16 @@ [TestFixture] public class CommonTests : CommonTestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.Classic, UseEcmaScript5Polyfill = false, UseJson2Library = false }); + + return jsEngine; } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs index 62962ae..37c6e77 100644 --- a/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs @@ -7,15 +7,16 @@ [TestFixture] public class Es5Tests : Es5TestsBase { - [TestFixtureSetUp] - public override void SetUp() + protected override MsieJsEngine CreateJsEngine() { - _jsEngine = new MsieJsEngine(new JsEngineSettings + var jsEngine = new MsieJsEngine(new JsEngineSettings { EngineMode = JsEngineMode.Classic, UseEcmaScript5Polyfill = true, UseJson2Library = true }); + + return jsEngine; } #region Object methods @@ -41,12 +42,20 @@ public override void ObjectKeysMethodIsSupported() const string targetOutput4 = "foo"; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); + string output1; + string output2; + string output3; + string output4; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); - _jsEngine.Execute(initCode4); - var output4 = _jsEngine.Evaluate(input4); + jsEngine.Execute(initCode4); + output4 = jsEngine.Evaluate(input4); + } // Assert Assert.AreEqual(targetOutput1, output1); diff --git a/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs index 0dfef22..cb1de6f 100644 --- a/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs @@ -9,10 +9,7 @@ [TestFixture] public abstract class Es5TestsBase { - protected MsieJsEngine _jsEngine; - - [TestFixtureSetUp] - public abstract void SetUp(); + protected abstract MsieJsEngine CreateJsEngine(); #region Array methods @@ -29,10 +26,16 @@ public virtual void ArrayEveryMethodIsSupported() const bool targetOutput2 = false; // Act - _jsEngine.Execute(initCode); + bool output1; + bool output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -53,8 +56,13 @@ public virtual void ArrayFilterMethodIsSupported() const string targetOutput = "Chakra,SpiderMonkey,Jurassic"; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -78,8 +86,13 @@ public virtual void ArrayForEachMethodIsSupported() const string targetOutput = "Chakra;V8;SpiderMonkey;Jurassic"; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.GetVariableValue(resultVariableName); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.GetVariableValue(resultVariableName); + } // Assert Assert.AreEqual(targetOutput, output); @@ -113,15 +126,26 @@ public virtual void ArrayIndexOfMethodIsSupported() const int targetOutput7 = -1; // Act - _jsEngine.Execute(initCode); - - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); - var output4 = _jsEngine.Evaluate(input4); - var output5 = _jsEngine.Evaluate(input5); - var output6 = _jsEngine.Evaluate(input6); - var output7 = _jsEngine.Evaluate(input7); + int output1; + int output2; + int output3; + int output4; + int output5; + int output6; + int output7; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + output4 = jsEngine.Evaluate(input4); + output5 = jsEngine.Evaluate(input5); + output6 = jsEngine.Evaluate(input6); + output7 = jsEngine.Evaluate(input7); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -144,8 +168,14 @@ public virtual void ArrayIsArrayMethodIsSupported() const bool targetOutput2 = true; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + bool output1; + bool output2; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -180,15 +210,26 @@ public virtual void ArrayLastIndexOfMethodIsSupported() const int targetOutput7 = -1; // Act - _jsEngine.Execute(initCode); - - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); - var output4 = _jsEngine.Evaluate(input4); - var output5 = _jsEngine.Evaluate(input5); - var output6 = _jsEngine.Evaluate(input6); - var output7 = _jsEngine.Evaluate(input7); + int output1; + int output2; + int output3; + int output4; + int output5; + int output6; + int output7; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + output4 = jsEngine.Evaluate(input4); + output5 = jsEngine.Evaluate(input5); + output6 = jsEngine.Evaluate(input6); + output7 = jsEngine.Evaluate(input7); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -214,8 +255,13 @@ public virtual void ArrayMapMethodIsSupported() const string targetOutput = "Chakra JS Engine,V8 JS Engine,SpiderMonkey JS Engine,Jurassic JS Engine"; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -236,8 +282,14 @@ public virtual void ArrayReduceMethodIsSupported() const int targetOutput2 = 18; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + int output1; + int output2; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -259,8 +311,14 @@ public virtual void ArrayReduceRightMethodIsSupported() const int targetOutput2 = -8; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + int output1; + int output2; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -277,8 +335,13 @@ public virtual void ArraySomeMethodIsSupported() const bool targetOutput = true; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.Evaluate(input); + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -296,7 +359,12 @@ public virtual void DateNowMethodIsSupported() DateTime targetOutput = DateTime.Now.ToUniversalTime(); // Act - var output = new DateTime(1970, 01, 01).AddMilliseconds(_jsEngine.Evaluate(input)); + DateTime output; + + using (var jsEngine = CreateJsEngine()) + { + output = new DateTime(1970, 01, 01).AddMilliseconds(jsEngine.Evaluate(input)); + } // Assert Assert.IsTrue(Math.Abs((targetOutput - output).TotalMilliseconds) < 100); @@ -310,7 +378,12 @@ public virtual void DateToIsoStringMethodIsSupported() const string targetOutput = "2013-12-10T17:36:24.000Z"; // Act - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -339,10 +412,16 @@ public virtual void FunctionBindIsSupported() const int targetOutput2 = 12; // Act - _jsEngine.Execute(initCode); + int output1; + int output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -362,8 +441,13 @@ public virtual void JsonParseMethodIsSupported() const string targetOutput = "bar"; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -379,8 +463,13 @@ public virtual void JsonStringifyMethodIsSupported() const string targetOutput = "{\"foo\":\"bar\"}"; // Act - _jsEngine.Execute(initCode); - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode); + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); @@ -419,15 +508,23 @@ public virtual void ObjectCreateMethodIsSupported() const string targetOutput3B = "Hello, Vasya!"; // Act - _jsEngine.Execute(initCode1); - var output1 = _jsEngine.Evaluate(input1); + object output1; + object output2; + int output3A; + string output3B; - _jsEngine.Execute(initCode2); - var output2 = _jsEngine.Evaluate(input2); + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(initCode1); + output1 = jsEngine.Evaluate(input1); - _jsEngine.Execute(initCode3); - var output3A = _jsEngine.Evaluate(input3A); - var output3B = _jsEngine.Evaluate(input3B); + jsEngine.Execute(initCode2); + output2 = jsEngine.Evaluate(input2); + + jsEngine.Execute(initCode3); + output3A = jsEngine.Evaluate(input3A); + output3B = jsEngine.Evaluate(input3B); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -458,12 +555,20 @@ public virtual void ObjectKeysMethodIsSupported() const string targetOutput4 = "foo"; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); + string output1; + string output2; + string output3; + string output4; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); - _jsEngine.Execute(initCode4); - var output4 = _jsEngine.Evaluate(input4); + jsEngine.Execute(initCode4); + output4 = jsEngine.Evaluate(input4); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -490,9 +595,16 @@ public virtual void StringSplitMethodIsCorrect() const int targetOutput3 = 7; // Act - var output1 = _jsEngine.Evaluate(input1); - var output2 = _jsEngine.Evaluate(input2); - var output3 = _jsEngine.Evaluate(input3); + int output1; + int output2; + int output3; + + using (var jsEngine = CreateJsEngine()) + { + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + } // Assert Assert.AreEqual(targetOutput1, output1); @@ -508,22 +620,17 @@ public virtual void StringTrimMethodIsSupported() const string targetOutput = "foo"; // Act - var output = _jsEngine.Evaluate(input); + string output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } // Assert Assert.AreEqual(targetOutput, output); } #endregion - - [TestFixtureTearDown] - public virtual void TearDown() - { - if (_jsEngine != null) - { - _jsEngine.Dispose(); - _jsEngine = null; - } - } } } \ No newline at end of file From 47e2f95e7f6e71fc1f863526f5200efeeb8a190d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 30 Nov 2015 18:29:22 +0300 Subject: [PATCH 008/238] Unit tests were divided into separate assemblies --- MsieJavaScriptEngine.sln | 47 +++++++- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 107 +++++++++++++++--- .../Properties/AssemblyInfo.cs | 2 +- .../Resources/Strings.Designer.cs | 15 ++- .../Resources/Strings.resx | 7 +- .../Resources/Strings.ru-ru.resx | 7 +- .../CommonTests.cs | 3 +- .../Es5Tests.cs | 3 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 75 ++++++++++++ .../Properties/AssemblyInfo.cs | 6 +- .../packages.config | 0 .../CommonTests.cs | 3 +- .../Es5Tests.cs | 3 +- ...criptEngine.Test.ChakraActiveScript.csproj | 75 ++++++++++++ .../Properties/AssemblyInfo.cs | 17 +++ .../packages.config | 4 + .../CommonTests.cs | 3 +- .../Es5Tests.cs | 3 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 75 ++++++++++++ .../Properties/AssemblyInfo.cs | 17 +++ .../packages.config | 4 + .../CommonTests.cs | 3 +- .../Es5Tests.cs | 3 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 75 ++++++++++++ .../Properties/AssemblyInfo.cs | 17 +++ .../packages.config | 4 + .../CommonTests.cs | 3 +- .../Es5Tests.cs | 3 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 75 ++++++++++++ .../Properties/AssemblyInfo.cs | 17 +++ .../packages.config | 4 + .../CommonTestsBase.cs | 28 +++-- .../Es5TestsBase.cs | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj} | 29 +---- .../Properties/AssemblyInfo.cs | 17 +++ .../Resources/cube.js | 2 +- .../Resources/power.js | 2 +- .../Resources/square.js | 0 .../ValidationTests.cs | 2 +- .../packages.config | 4 + test/MsieJavaScriptEngine.Test.nunit | 19 ++++ 43 files changed, 707 insertions(+), 82 deletions(-) rename test/{MsieJavaScriptEngine.Test/A_Auto => MsieJavaScriptEngine.Test.Auto}/CommonTests.cs (84%) rename test/{MsieJavaScriptEngine.Test/A_Auto => MsieJavaScriptEngine.Test.Auto}/Es5Tests.cs (86%) create mode 100644 test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Auto}/Properties/AssemblyInfo.cs (68%) rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Auto}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test/D_ChakraActiveScript => MsieJavaScriptEngine.Test.ChakraActiveScript}/CommonTests.cs (84%) rename test/{MsieJavaScriptEngine.Test/D_ChakraActiveScript => MsieJavaScriptEngine.Test.ChakraActiveScript}/Es5Tests.cs (83%) create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config rename test/{MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt => MsieJavaScriptEngine.Test.ChakraEdgeJsRt}/CommonTests.cs (84%) rename test/{MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt => MsieJavaScriptEngine.Test.ChakraEdgeJsRt}/Es5Tests.cs (84%) create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config rename test/{MsieJavaScriptEngine.Test/C_ChakraIeJsRt => MsieJavaScriptEngine.Test.ChakraIeJsRt}/CommonTests.cs (84%) rename test/{MsieJavaScriptEngine.Test/C_ChakraIeJsRt => MsieJavaScriptEngine.Test.ChakraIeJsRt}/Es5Tests.cs (84%) create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config rename test/{MsieJavaScriptEngine.Test/E_Classic => MsieJavaScriptEngine.Test.Classic}/CommonTests.cs (85%) rename test/{MsieJavaScriptEngine.Test/E_Classic => MsieJavaScriptEngine.Test.Classic}/Es5Tests.cs (96%) create mode 100644 test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj create mode 100644 test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs create mode 100644 test/MsieJavaScriptEngine.Test.Classic/packages.config rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/CommonTestsBase.cs (94%) rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/Es5TestsBase.cs (99%) rename test/{MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj => MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj} (77%) create mode 100644 test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/Resources/cube.js (96%) rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/Resources/power.js (98%) rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/Resources/square.js (100%) rename test/{MsieJavaScriptEngine.Test => MsieJavaScriptEngine.Test.Common}/ValidationTests.cs (96%) create mode 100644 test/MsieJavaScriptEngine.Test.Common/packages.config create mode 100644 test/MsieJavaScriptEngine.Test.nunit diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index ff24ca6..21ced9b 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -14,7 +14,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine", "src EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{2A0DC227-73C5-4E3A-853A-83007AD56B85}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test", "test\MsieJavaScriptEngine.Test\MsieJavaScriptEngine.Test.csproj", "{B9D71EDB-31DD-444A-8606-07D873CA6E42}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{A4085B9E-A5D3-4749-BD07-6D1EB7C23820}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.csproj", "{A4874C43-2097-4FDB-882A-0D74E5508BBD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj", "{16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt\MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj", "{7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraActiveScript", "test\MsieJavaScriptEngine.Test.ChakraActiveScript\MsieJavaScriptEngine.Test.ChakraActiveScript.csproj", "{21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -26,16 +36,41 @@ Global {D672BC49-C454-4975-BD25-A555B9BDD793}.Debug|Any CPU.Build.0 = Debug|Any CPU {D672BC49-C454-4975-BD25-A555B9BDD793}.Release|Any CPU.ActiveCfg = Release|Any CPU {D672BC49-C454-4975-BD25-A555B9BDD793}.Release|Any CPU.Build.0 = Release|Any CPU - {B9D71EDB-31DD-444A-8606-07D873CA6E42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9D71EDB-31DD-444A-8606-07D873CA6E42}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9D71EDB-31DD-444A-8606-07D873CA6E42}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9D71EDB-31DD-444A-8606-07D873CA6E42}.Release|Any CPU.Build.0 = Release|Any CPU + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Release|Any CPU.Build.0 = Release|Any CPU + {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Release|Any CPU.Build.0 = Release|Any CPU + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Release|Any CPU.Build.0 = Release|Any CPU + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Release|Any CPU.Build.0 = Release|Any CPU + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Release|Any CPU.Build.0 = Release|Any CPU + {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {D672BC49-C454-4975-BD25-A555B9BDD793} = {1ACC225D-6787-47AB-AF34-C6021002390C} - {B9D71EDB-31DD-444A-8606-07D873CA6E42} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {A4874C43-2097-4FDB-882A-0D74E5508BBD} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {50453B82-ACBF-4E25-9582-1113F274D53E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} EndGlobalSection EndGlobal diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index d7746b4..b4b6249 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -54,7 +54,7 @@ public ChakraEdgeJsRtJsEngine() string errorMessage; if (e.ErrorCode == JsErrorCode.WrongThread) { - errorMessage = Strings.Runtime_JsEnginesChakraJsRtAndActiveScriptConflict; + errorMessage = Strings.Runtime_JsEnginesConflictOnMachine; } else { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 611dc83..1d9f781 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -59,7 +59,7 @@ public ChakraIeJsRtJsEngine() string errorMessage; if (e.ErrorCode == JsErrorCode.WrongThread) { - errorMessage = Strings.Runtime_JsEnginesChakraJsRtAndActiveScriptConflict; + errorMessage = Strings.Runtime_JsEnginesConflictOnMachine; } else { diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 8bdbbbe..f048719 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -5,6 +5,7 @@ using System.Text; using ActiveScript; + using Constants; using Helpers; using JsRt.Edge; using JsRt.Ie; @@ -21,6 +22,16 @@ public sealed class MsieJsEngine : IDisposable /// private IInnerJsEngine _jsEngine; + /// + /// Current JavaScript engine mode + /// + private static JsEngineMode _currentMode; + + /// + /// Synchronizer of JavaScript engines creation + /// + private static readonly object _creationSynchronizer = new object(); + /// /// Flag that object is destroyed /// @@ -79,24 +90,84 @@ public MsieJsEngine(JsEngineSettings settings) } } - switch (processedEngineMode) - { - case JsEngineMode.ChakraEdgeJsRt: - _jsEngine = new ChakraEdgeJsRtJsEngine(); - break; - case JsEngineMode.ChakraIeJsRt: - _jsEngine = new ChakraIeJsRtJsEngine(); - break; - case JsEngineMode.ChakraActiveScript: - _jsEngine = new ChakraActiveScriptJsEngine(); - break; - case JsEngineMode.Classic: - _jsEngine = new ClassicActiveScriptJsEngine(settings.UseEcmaScript5Polyfill, - settings.UseJson2Library); - break; - default: - throw new NotSupportedException( - string.Format(Strings.Runtime_JsEngineModeNotSupported, processedEngineMode)); + lock (_creationSynchronizer) + { + JsEngineMode previousMode = _currentMode; + + switch (processedEngineMode) + { + case JsEngineMode.ChakraEdgeJsRt: + if (previousMode != JsEngineMode.ChakraIeJsRt + && previousMode != JsEngineMode.ChakraActiveScript) + { + _jsEngine = new ChakraEdgeJsRtJsEngine(); + } + else if (previousMode == JsEngineMode.ChakraIeJsRt) + { + throw new JsEngineLoadException( + string.Format( + Strings.Runtime_JsEnginesConflictInProcess, + JsEngineModeName.ChakraEdgeJsRt, + JsEngineModeName.ChakraIeJsRt + ) + ); + } + else if (previousMode == JsEngineMode.ChakraActiveScript) + { + throw new JsEngineLoadException( + string.Format( + Strings.Runtime_JsEnginesConflictInProcess, + JsEngineModeName.ChakraEdgeJsRt, + JsEngineModeName.ChakraActiveScript + ) + ); + } + + break; + case JsEngineMode.ChakraIeJsRt: + if (previousMode != JsEngineMode.ChakraEdgeJsRt) + { + _jsEngine = new ChakraIeJsRtJsEngine(); + } + else + { + throw new JsEngineLoadException( + string.Format( + Strings.Runtime_JsEnginesConflictInProcess, + JsEngineModeName.ChakraIeJsRt, + JsEngineModeName.ChakraEdgeJsRt + ) + ); + } + + break; + case JsEngineMode.ChakraActiveScript: + if (previousMode != JsEngineMode.ChakraEdgeJsRt) + { + _jsEngine = new ChakraActiveScriptJsEngine(); + } + else + { + throw new JsEngineLoadException( + string.Format( + Strings.Runtime_JsEnginesConflictInProcess, + JsEngineModeName.ChakraActiveScript, + JsEngineModeName.ChakraEdgeJsRt + ) + ); + } + + break; + case JsEngineMode.Classic: + _jsEngine = new ClassicActiveScriptJsEngine(settings.UseEcmaScript5Polyfill, + settings.UseJson2Library); + break; + default: + throw new NotSupportedException( + string.Format(Strings.Runtime_JsEngineModeNotSupported, processedEngineMode)); + } + + _currentMode = processedEngineMode; } } diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 443c394..e77adb6 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -5,7 +5,7 @@ [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine for .Net")] +[assembly: AssemblyProduct("MSIE JavaScript Engine")] [assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs index 454eecd..ac76ced 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs @@ -319,11 +319,20 @@ internal static string Runtime_JsEngineModeNotSupported { } /// - /// Looks up a localized string similar to It is prohibited to use the Chakra JsRT and the Chakra ActiveScript on one machine at a time.. + /// Looks up a localized string similar to It is prohibited to use the {0} and {1} engines in one process.. /// - internal static string Runtime_JsEnginesChakraJsRtAndActiveScriptConflict { + internal static string Runtime_JsEnginesConflictInProcess { get { - return ResourceManager.GetString("Runtime_JsEnginesChakraJsRtAndActiveScriptConflict", resourceCulture); + return ResourceManager.GetString("Runtime_JsEnginesConflictInProcess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time.. + /// + internal static string Runtime_JsEnginesConflictOnMachine { + get { + return ResourceManager.GetString("Runtime_JsEnginesConflictOnMachine", resourceCulture); } } diff --git a/src/MsieJavaScriptEngine/Resources/Strings.resx b/src/MsieJavaScriptEngine/Resources/Strings.resx index 6544157..b618989 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.resx @@ -207,8 +207,11 @@ See more details: Selected '{0}' mode of JavaScript engine is not supported! - - It is prohibited to use the Chakra JsRT and the Chakra ActiveScript on one machine at a time. + + It is prohibited to use the {0} and {1} engines in one process. + + + It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time. Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer browser. diff --git a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx index 4d87871..b5940aa 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx @@ -207,8 +207,11 @@ Выбранный вами режим JavaScript-движка "{0}" не поддерживается! - - Запрещается использовать Chakra JsRT и Chakra ActiveScript на одном компьютере одновременно. + + Нельзя использовать {0} и {1} движки в одном процессе. + + + Нельзя использовать Chakra JsRT и Chakra ActiveScript движки на одном компьютере одновременно. Не удалось найти ни один из JavaScript-движков! Возможно, на вашем компьютере не установлен браузер Internet Explorer. diff --git a/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs rename to test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs index 94405cb..4b4a89b 100644 --- a/test/MsieJavaScriptEngine.Test/A_Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs @@ -1,6 +1,7 @@ -namespace MsieJavaScriptEngine.Test.A_Auto +namespace MsieJavaScriptEngine.Test.Auto { using MsieJavaScriptEngine; + using Common; public class CommonTests : CommonTestsBase { diff --git a/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs similarity index 86% rename from test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs index 6d392c8..3d47b65 100644 --- a/test/MsieJavaScriptEngine.Test/A_Auto/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.A_Auto +namespace MsieJavaScriptEngine.Test.Auto { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class Es5Tests : Es5TestsBase diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj new file mode 100644 index 0000000..c8bfbe5 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {A4874C43-2097-4FDB-882A-0D74E5508BBD} + Library + Properties + MsieJavaScriptEngine.Test.Auto + MsieJavaScriptEngine.Test.Auto + v4.0 + 512 + ..\..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + + + + + + + + + + {d672bc49-c454-4975-bd25-a555b9bdd793} + MsieJavaScriptEngine + + + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} + MsieJavaScriptEngine.Test.Common + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs similarity index 68% rename from test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs rename to test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 95b53ef..9d6ba49 100644 --- a/test/MsieJavaScriptEngine.Test/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -1,17 +1,17 @@ using System.Reflection; using System.Runtime.InteropServices; -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test")] +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Auto")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Unit Tests for 'MSIE JavaScript Engine for .Net'")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Auto Mode")] [assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] -[assembly: Guid("37677738-d94d-4df9-b32d-61573ece8990")] +[assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] [assembly: AssemblyVersion("1.5.4.0")] [assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/packages.config b/test/MsieJavaScriptEngine.Test.Auto/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test/packages.config rename to test/MsieJavaScriptEngine.Test.Auto/packages.config diff --git a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs rename to test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 727e101..37a4868 100644 --- a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.D_ChakraActiveScript +namespace MsieJavaScriptEngine.Test.ChakraActiveScript { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class CommonTests : CommonTestsBase diff --git a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs similarity index 83% rename from test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs index f22b165..5e36bbc 100644 --- a/test/MsieJavaScriptEngine.Test/D_ChakraActiveScript/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.D_ChakraActiveScript +namespace MsieJavaScriptEngine.Test.ChakraActiveScript { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class Es5Tests : Es5TestsBase diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj new file mode 100644 index 0000000..398d0d6 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} + Library + Properties + MsieJavaScriptEngine.Test.ChakraActiveScript + MsieJavaScriptEngine.Test.ChakraActiveScript + v4.0 + 512 + ..\..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + + + + + + + + + + + + + {d672bc49-c454-4975-bd25-a555b9bdd793} + MsieJavaScriptEngine + + + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} + MsieJavaScriptEngine.Test.Common + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a33781d --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraActiveScript")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode")] +[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] + +[assembly: AssemblyVersion("1.5.4.0")] +[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config new file mode 100644 index 0000000..512ce05 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs rename to test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index c41b613..cc37d31 100644 --- a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.B_ChakraEdgeJsRt +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class CommonTests : CommonTestsBase diff --git a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs index 3d89057..b025ee3 100644 --- a/test/MsieJavaScriptEngine.Test/B_ChakraEdgeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.B_ChakraEdgeJsRt +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class Es5Tests : Es5TestsBase diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj new file mode 100644 index 0000000..bb1a491 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731} + Library + Properties + MsieJavaScriptEngine.Test.ChakraEdgeJsRt + MsieJavaScriptEngine.Test.ChakraEdgeJsRt + v4.0 + 512 + ..\..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + + + + + + + + + + + + + {d672bc49-c454-4975-bd25-a555b9bdd793} + MsieJavaScriptEngine + + + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} + MsieJavaScriptEngine.Test.Common + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..57fcc4a --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraEdgeJsRt")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode")] +[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] + +[assembly: AssemblyVersion("1.5.4.0")] +[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config new file mode 100644 index 0000000..512ce05 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs rename to test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index 53a40f9..493eee5 100644 --- a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.C_ChakraIeJsRt +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class CommonTests : CommonTestsBase diff --git a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs similarity index 84% rename from test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs index 96bcce7..12ec415 100644 --- a/test/MsieJavaScriptEngine.Test/C_ChakraIeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.C_ChakraIeJsRt +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class Es5Tests : Es5TestsBase diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj new file mode 100644 index 0000000..e165e71 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} + Library + Properties + MsieJavaScriptEngine.Test.ChakraIeJsRt + MsieJavaScriptEngine.Test.ChakraIeJsRt + v4.0 + 512 + ..\..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + + + + + + + + + + + + + {d672bc49-c454-4975-bd25-a555b9bdd793} + MsieJavaScriptEngine + + + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} + MsieJavaScriptEngine.Test.Common + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..69743ca --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraIeJsRt")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode")] +[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] + +[assembly: AssemblyVersion("1.5.4.0")] +[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config new file mode 100644 index 0000000..512ce05 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs similarity index 85% rename from test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs rename to test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index be4d092..5396bd7 100644 --- a/test/MsieJavaScriptEngine.Test/E_Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.E_Classic +namespace MsieJavaScriptEngine.Test.Classic { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class CommonTests : CommonTestsBase diff --git a/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs similarity index 96% rename from test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs rename to test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs index 37c6e77..6b5ed68 100644 --- a/test/MsieJavaScriptEngine.Test/E_Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Test.E_Classic +namespace MsieJavaScriptEngine.Test.Classic { using NUnit.Framework; using MsieJavaScriptEngine; + using Common; [TestFixture] public class Es5Tests : Es5TestsBase diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj new file mode 100644 index 0000000..250e2b7 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {50453B82-ACBF-4E25-9582-1113F274D53E} + Library + Properties + MsieJavaScriptEngine.Test.Classic + MsieJavaScriptEngine.Test.Classic + v4.0 + 512 + ..\..\ + true + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True + + + + + + + + + + + + + + + {d672bc49-c454-4975-bd25-a555b9bdd793} + MsieJavaScriptEngine + + + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} + MsieJavaScriptEngine.Test.Common + + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..b65dae9 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Classic")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Classic Mode")] +[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] + +[assembly: AssemblyVersion("1.5.4.0")] +[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/packages.config b/test/MsieJavaScriptEngine.Test.Classic/packages.config new file mode 100644 index 0000000..512ce05 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs similarity index 94% rename from test/MsieJavaScriptEngine.Test/CommonTestsBase.cs rename to test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 72caad8..f02cc9b 100644 --- a/test/MsieJavaScriptEngine.Test/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.Test +namespace MsieJavaScriptEngine.Test.Common { using System; using System.IO; - using System.Reflection; + using System.Text.RegularExpressions; using NUnit.Framework; @@ -11,6 +11,12 @@ [TestFixture] public abstract class CommonTestsBase { + /// + /// Regular expression for working with the `bin` directory path + /// + private readonly Regex _binDirRegex = new Regex(@"\\bin\\(?:Debug|Release)\\?$", RegexOptions.IgnoreCase); + + protected abstract MsieJsEngine CreateJsEngine(); #region Evaluation of code @@ -166,7 +172,13 @@ public virtual void ExecutionOfCodeIsCorrect() public virtual void ExecutionOfFileIsCorrect() { // Arrange - string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"../../Resources/square.js"); + string relativeFilePath = "MsieJavaScriptEngine.Test.Common/Resources/square.js"; + string appBaseDirPath = AppDomain.CurrentDomain.BaseDirectory; + if (_binDirRegex.IsMatch(appBaseDirPath)) + { + relativeFilePath = Path.Combine("..\\..\\..\\", relativeFilePath); + } + string absoluteFilePath = Path.GetFullPath(Path.Combine(appBaseDirPath, relativeFilePath)); const string input = "square(6);"; const int targetOutput = 36; @@ -175,7 +187,7 @@ public virtual void ExecutionOfFileIsCorrect() using (var jsEngine = CreateJsEngine()) { - jsEngine.ExecuteFile(filePath); + jsEngine.ExecuteFile(absoluteFilePath); output = jsEngine.Evaluate(input); } @@ -187,7 +199,7 @@ public virtual void ExecutionOfFileIsCorrect() public virtual void ExecutionOfResourceByTypeIsCorrect() { // Arrange - const string resourceName = "MsieJavaScriptEngine.Test.Resources.cube.js"; + const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.cube.js"; const string input = "cube(5);"; const int targetOutput = 125; @@ -196,7 +208,7 @@ public virtual void ExecutionOfResourceByTypeIsCorrect() using (var jsEngine = CreateJsEngine()) { - jsEngine.ExecuteResource(resourceName, GetType()); + jsEngine.ExecuteResource(resourceName, typeof(CommonTestsBase)); output = jsEngine.Evaluate(input); } @@ -208,7 +220,7 @@ public virtual void ExecutionOfResourceByTypeIsCorrect() public virtual void ExecutionOfResourceByAssemblyIsCorrect() { // Arrange - const string resourceName = "MsieJavaScriptEngine.Test.Resources.power.js"; + const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.power.js"; const string input = "power(4, 3);"; const int targetOutput = 64; @@ -217,7 +229,7 @@ public virtual void ExecutionOfResourceByAssemblyIsCorrect() using (var jsEngine = CreateJsEngine()) { - jsEngine.ExecuteResource(resourceName, Assembly.GetExecutingAssembly()); + jsEngine.ExecuteResource(resourceName, typeof(CommonTestsBase).Assembly); output = jsEngine.Evaluate(input); } diff --git a/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs similarity index 99% rename from test/MsieJavaScriptEngine.Test/Es5TestsBase.cs rename to test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs index cb1de6f..792ae29 100644 --- a/test/MsieJavaScriptEngine.Test/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Test +namespace MsieJavaScriptEngine.Test.Common { using System; diff --git a/test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj similarity index 77% rename from test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj rename to test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 360e69a..f9955ec 100644 --- a/test/MsieJavaScriptEngine.Test/MsieJavaScriptEngine.Test.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,14 +4,14 @@ Debug AnyCPU - {B9D71EDB-31DD-444A-8606-07D873CA6E42} + {A4085B9E-A5D3-4749-BD07-6D1EB7C23820} Library Properties - MsieJavaScriptEngine.Test - MsieJavaScriptEngine.Test + MsieJavaScriptEngine.Test.Common + MsieJavaScriptEngine.Test.Common v4.0 512 - ..\ + ..\..\ true @@ -33,31 +33,14 @@ - ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + True - - - - Code - - - Code - - - - - Code - - - Code - - - diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dab141e --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,17 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MSIE JavaScript Engine: Common Tests")] +[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] + +[assembly: AssemblyVersion("1.5.4.0")] +[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/Resources/cube.js b/test/MsieJavaScriptEngine.Test.Common/Resources/cube.js similarity index 96% rename from test/MsieJavaScriptEngine.Test/Resources/cube.js rename to test/MsieJavaScriptEngine.Test.Common/Resources/cube.js index 84c6563..8c6f12b 100644 --- a/test/MsieJavaScriptEngine.Test/Resources/cube.js +++ b/test/MsieJavaScriptEngine.Test.Common/Resources/cube.js @@ -1,3 +1,3 @@ function cube(num) { return num * num * num; -} +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test/Resources/power.js b/test/MsieJavaScriptEngine.Test.Common/Resources/power.js similarity index 98% rename from test/MsieJavaScriptEngine.Test/Resources/power.js rename to test/MsieJavaScriptEngine.Test.Common/Resources/power.js index 1d3523d..b1065b7 100644 --- a/test/MsieJavaScriptEngine.Test/Resources/power.js +++ b/test/MsieJavaScriptEngine.Test.Common/Resources/power.js @@ -1,6 +1,6 @@ function power(x, y) { var result = x; - + for (var i = 2; i <= y; i++) { result *= x; } diff --git a/test/MsieJavaScriptEngine.Test/Resources/square.js b/test/MsieJavaScriptEngine.Test.Common/Resources/square.js similarity index 100% rename from test/MsieJavaScriptEngine.Test/Resources/square.js rename to test/MsieJavaScriptEngine.Test.Common/Resources/square.js diff --git a/test/MsieJavaScriptEngine.Test/ValidationTests.cs b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs similarity index 96% rename from test/MsieJavaScriptEngine.Test/ValidationTests.cs rename to test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs index 2ceef43..e108e6b 100644 --- a/test/MsieJavaScriptEngine.Test/ValidationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine.Test +namespace MsieJavaScriptEngine.Test.Common { using NUnit.Framework; diff --git a/test/MsieJavaScriptEngine.Test.Common/packages.config b/test/MsieJavaScriptEngine.Test.Common/packages.config new file mode 100644 index 0000000..512ce05 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.nunit b/test/MsieJavaScriptEngine.Test.nunit new file mode 100644 index 0000000..0cb3fcb --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.nunit @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file From e149667bec4adc351a7072af8283d7bb777bf04a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 3 Dec 2015 14:40:36 +0300 Subject: [PATCH 009/238] Optimized a performance of the `IsSupported` methods --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 56 ++++-- .../ActiveScript/ActiveScriptSiteWrapper.cs | 5 +- .../ChakraActiveScriptJsEngine.cs | 12 +- .../ClassicActiveScriptJsEngine.cs | 12 +- .../Constants/ComErrorCode.cs | 12 ++ src/MsieJavaScriptEngine/Constants/DllName.cs | 12 ++ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 62 ++++-- .../JsRt/Edge/EdgeNativeMethods.cs | 175 ++++++++--------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 75 ++++++-- .../JsRt/Ie/IeNativeMethods.cs | 179 +++++++++--------- .../MsieJavaScriptEngine.csproj | 2 + 11 files changed, 376 insertions(+), 226 deletions(-) create mode 100644 src/MsieJavaScriptEngine/Constants/ComErrorCode.cs create mode 100644 src/MsieJavaScriptEngine/Constants/DllName.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 12a91da..8dc6926 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -6,6 +6,7 @@ using System.Runtime.InteropServices; using System.Windows.Threading; + using Constants; using Helpers; using Resources; using Utilities; @@ -117,27 +118,52 @@ protected ActiveScriptJsEngineBase(string clsid, string engineModeName, string l /// Checks a support of the JavaScript engine on the machine /// /// CLSID of JavaScript engine + /// Flag indicating whether this JavaScript engine is supported + /// Support synchronizer /// Result of check (true - supports; false - does not support) - protected static bool IsSupported(string clsid) + protected static bool IsSupported(string clsid, ref bool? isSupported, ref object supportSynchronizer) { - bool isSupported; - IntPtr pActiveScript = IntPtr.Zero; - - try - { - pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); - isSupported = true; - } - catch + if (isSupported.HasValue) { - isSupported = false; + return isSupported.Value; } - finally + + lock (supportSynchronizer) { - ComHelpers.ReleaseAndEmpty(ref pActiveScript); - } + if (isSupported.HasValue) + { + return isSupported.Value; + } + + IntPtr pActiveScript = IntPtr.Zero; + + try + { + pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); + isSupported = true; + } + catch (COMException e) + { + if (e.ErrorCode == ComErrorCode.ClassNotRegistered) + { + isSupported = false; + } + else + { + isSupported = null; + } + } + catch + { + isSupported = null; + } + finally + { + ComHelpers.ReleaseAndEmpty(ref pActiveScript); + } - return isSupported; + return isSupported.HasValue && isSupported.Value; + } } /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs index 928150e..6ceab30 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs @@ -9,13 +9,12 @@ using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; + using Constants; using Helpers; using Resources; internal class ActiveScriptSiteWrapper : IActiveScriptSite, IDisposable { - private const int TYPE_ERROR_ELEMENT_NOT_FOUND = unchecked((int)(0x8002802B)); - /// /// Instance of native JavaScript engine /// @@ -400,7 +399,7 @@ public void GetItemInfo(string name, ScriptInfoFlags returnMask, out object item item = GetItem(name); if (item == null) { - throw new COMException(string.Format(Strings.Runtime_ItemNotFound, name), TYPE_ERROR_ELEMENT_NOT_FOUND); + throw new COMException(string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); } } else diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 2fdede4..c8b335e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -9,6 +9,16 @@ internal sealed class ChakraActiveScriptJsEngine : ActiveScriptJsEngineBase { private const string CHAKRA_CLSID = "{16d51579-a30b-4c8b-a276-0ff4dc41e755}"; + /// + /// Flag indicating whether this JavaScript engine is supported + /// + private static bool? _isSupported; + + /// + /// Support synchronizer + /// + private static object _supportSynchronizer = new object(); + /// /// Constructs instance of the Chakra ActiveScript JavaScript engine @@ -25,7 +35,7 @@ public ChakraActiveScriptJsEngine() /// Result of check (true - supports; false - does not support) public static bool IsSupported() { - bool isSupported = IsSupported(CHAKRA_CLSID); + bool isSupported = IsSupported(CHAKRA_CLSID, ref _isSupported, ref _supportSynchronizer); return isSupported; } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index ebb18aa..729fa6d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -9,6 +9,16 @@ internal sealed class ClassicActiveScriptJsEngine : ActiveScriptJsEngineBase { private const string CLASSIC_CLSID = "{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}"; + /// + /// Flag indicating whether this JavaScript engine is supported + /// + private static bool? _isSupported; + + /// + /// Support synchronizer + /// + private static object _supportSynchronizer = new object(); + /// /// Constructs instance of the Classic MSIE JavaScript engine @@ -27,7 +37,7 @@ public ClassicActiveScriptJsEngine(bool useEcmaScript5Polyfill, bool useJson2Lib /// Result of check (true - supports; false - does not support) public static bool IsSupported() { - bool isSupported = IsSupported(CLASSIC_CLSID); + bool isSupported = IsSupported(CLASSIC_CLSID, ref _isSupported, ref _supportSynchronizer); return isSupported; } diff --git a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs new file mode 100644 index 0000000..1da41b0 --- /dev/null +++ b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs @@ -0,0 +1,12 @@ +namespace MsieJavaScriptEngine.Constants +{ + /// + /// COM error codes + /// + internal static class ComErrorCode + { + public const int ElementNotFound = unchecked((int)(0x8002802B)); + + public const int ClassNotRegistered = unchecked((int)(0x80040154)); + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/DllName.cs b/src/MsieJavaScriptEngine/Constants/DllName.cs new file mode 100644 index 0000000..3aca275 --- /dev/null +++ b/src/MsieJavaScriptEngine/Constants/DllName.cs @@ -0,0 +1,12 @@ +namespace MsieJavaScriptEngine.Constants +{ + /// + /// DLL names + /// + internal static class DllName + { + public const string JScript9 = "jscript9.dll"; + + public const string Chakra = "chakra.dll"; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index b4b6249..b3de605 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -29,9 +29,19 @@ internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine private readonly EdgeJsContext _jsContext; /// - /// Synchronizer + /// Flag indicating whether this JavaScript engine is supported /// - private readonly object _synchronizer = new object(); + private static bool? _isSupported; + + /// + /// Support synchronizer + /// + private static readonly object _supportSynchronizer = new object(); + + /// + /// Run synchronizer + /// + private readonly object _runSynchronizer = new object(); /// /// Flag that object is destroyed @@ -96,21 +106,43 @@ private static EdgeJsRuntime CreateJsRuntime() /// Result of check (true - supports; false - does not support) public static bool IsSupported() { - bool isSupported; + if (_isSupported.HasValue) + { + return _isSupported.Value; + } - try + lock (_supportSynchronizer) { - using (CreateJsRuntime()) + if (_isSupported.HasValue) { - isSupported = true; + return _isSupported.Value; } - } - catch - { - isSupported = false; - } - return isSupported; + try + { + using (CreateJsRuntime()) + { + _isSupported = true; + } + } + catch (DllNotFoundException e) + { + if (e.Message.IndexOf("'" + DllName.Chakra + "'", StringComparison.OrdinalIgnoreCase) != -1) + { + _isSupported = false; + } + else + { + _isSupported = null; + } + } + catch + { + _isSupported = null; + } + + return _isSupported.HasValue && _isSupported.Value; + } } /// @@ -264,7 +296,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( private void InvokeScript(Action action) { - lock (_synchronizer) + lock (_runSynchronizer) using (new EdgeJsScope(_jsContext)) { try @@ -280,7 +312,7 @@ private void InvokeScript(Action action) private T InvokeScript(Func func) { - lock (_synchronizer) + lock (_runSynchronizer) using (new EdgeJsScope(_jsContext)) { try @@ -301,7 +333,7 @@ private T InvokeScript(Func func) /// managed objects contained in fields of class private void Dispose(bool disposing) { - lock (_synchronizer) + lock (_runSynchronizer) { if (!_disposed) { diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 5fac1cd..6b3b217 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.InteropServices; + using Constants; using JsRt; /// @@ -10,265 +11,265 @@ /// internal static class EdgeNativeMethods { - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisposeRuntime(EdgeJsRuntime handle); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(EdgeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(EdgeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport("chakra.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); - [DllImport("chakra.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRelease(EdgeJsValue reference, out uint count); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(EdgeJsRuntime runtime, out EdgeJsContext newContext); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetCurrentContext(out EdgeJsContext currentContext); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetCurrentContext(EdgeJsContext context); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntime(EdgeJsContext context, out EdgeJsRuntime runtime); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetNullValue(out EdgeJsValue nullValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetTrueValue(out EdgeJsValue trueValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetFalseValue(out EdgeJsValue falseValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out EdgeJsValue booleanValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBooleanToBool(EdgeJsValue booleanValue, out bool boolValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToBoolean(EdgeJsValue value, out EdgeJsValue booleanValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetValueType(EdgeJsValue value, out JsValueType type); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out EdgeJsValue value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIntToNumber(int intValue, out EdgeJsValue value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPrototype(EdgeJsValue obj, out EdgeJsValue prototypeObject); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetPrototype(EdgeJsValue obj, EdgeJsValue prototypeObject); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExtensionAllowed(EdgeJsValue obj, out bool value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStrictEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasExternalData(EdgeJsValue obj, out bool value); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExternalData(EdgeJsValue obj, out IntPtr externalData); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetExternalData(EdgeJsValue obj, IntPtr externalData); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRangeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateReferenceError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateSyntaxError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateTypeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateURIError(EdgeJsValue message, out EdgeJsValue error); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetAndClearException(out EdgeJsValue exception); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetException(EdgeJsValue exception); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStopProfiling(int reason); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - [DllImport("chakra.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 1d9f781..80ab1ba 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -34,9 +34,19 @@ internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine private readonly IeJsContext _jsContext; /// - /// Synchronizer + /// Flag indicating whether this JavaScript engine is supported /// - private readonly object _synchronizer = new object(); + private static bool? _isSupported; + + /// + /// Support synchronizer + /// + private static readonly object _supportSynchronizer = new object(); + + /// + /// Run synchronizer + /// + private readonly object _runSynchronizer = new object(); /// /// Flag that object is destroyed @@ -104,21 +114,56 @@ private static IeJsRuntime CreateJsRuntime() /// Result of check (true - supports; false - does not support) public static bool IsSupported() { - bool isSupported; + if (_isSupported.HasValue) + { + return _isSupported.Value; + } - try + lock (_supportSynchronizer) { - using (CreateJsRuntime()) + if (_isSupported.HasValue) { - isSupported = true; + return _isSupported.Value; } - } - catch - { - isSupported = false; - } - return isSupported; + try + { + using (CreateJsRuntime()) + { + _isSupported = true; + } + } + catch (DllNotFoundException e) + { + if (e.Message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1) + { + _isSupported = false; + } + else + { + _isSupported = null; + } + } + catch (EntryPointNotFoundException e) + { + string message = e.Message; + if (message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1 + && message.IndexOf("'JsCreateRuntime'", StringComparison.OrdinalIgnoreCase) != -1) + { + _isSupported = false; + } + else + { + _isSupported = null; + } + } + catch + { + _isSupported = null; + } + + return _isSupported.HasValue && _isSupported.Value; + } } /// @@ -272,7 +317,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( private void InvokeScript(Action action) { - lock (_synchronizer) + lock (_runSynchronizer) using (new IeJsScope(_jsContext)) { try @@ -288,7 +333,7 @@ private void InvokeScript(Action action) private T InvokeScript(Func func) { - lock (_synchronizer) + lock (_runSynchronizer) using (new IeJsScope(_jsContext)) { try @@ -309,7 +354,7 @@ private T InvokeScript(Func func) /// managed objects contained in fields of class private void Dispose(bool disposing) { - lock (_synchronizer) + lock (_runSynchronizer) { if (!_disposed) { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index f4e5806..43885fd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.InteropServices; + using Constants; using JsRt; /// @@ -10,271 +11,271 @@ /// internal static class IeNativeMethods { - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisposeRuntime(IeJsRuntime handle); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(IeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(IeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetCurrentContext(IeJsContext context); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntime(IeJsContext context, out IeJsRuntime runtime); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetNullValue(out IeJsValue nullValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetTrueValue(out IeJsValue trueValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetFalseValue(out IeJsValue falseValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out IeJsValue booleanValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBooleanToBool(IeJsValue booleanValue, out bool boolValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToBoolean(IeJsValue value, out IeJsValue booleanValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetValueType(IeJsValue value, out JsValueType type); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out IeJsValue value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIntToNumber(int intValue, out IeJsValue value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsNumberToDouble(IeJsValue value, out double doubleValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToNumber(IeJsValue value, out IeJsValue numberValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPrototype(IeJsValue obj, out IeJsValue prototypeObject); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetPrototype(IeJsValue obj, IeJsValue prototypeObject); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExtensionAllowed(IeJsValue obj, out bool value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteIndexedProperty(IeJsValue obj, IeJsValue index); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStrictEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasExternalData(IeJsValue obj, out bool value); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExternalData(IeJsValue obj, out IntPtr externalData); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetExternalData(IeJsValue obj, IntPtr externalData); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRangeError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateReferenceError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateSyntaxError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateTypeError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateURIError(IeJsValue message, out IeJsValue error); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetAndClearException(out IeJsValue exception); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetException(IeJsValue exception); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisableRuntimeExecution(IeJsRuntime runtime); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnableRuntimeExecution(IeJsRuntime runtime); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStopProfiling(int reason); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - [DllImport("jscript9.dll", CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index dcf4cad..be57d64 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -65,6 +65,8 @@ + + From de4035186834297542c5a8240a702f8192587c5d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 3 Dec 2015 21:18:30 +0300 Subject: [PATCH 010/238] Version 1.6.0 --- CHANGELOG.md | 4 ++ NuGet/MsieJavaScriptEngine.nuspec | 57 ++++++++++--------- NuGet/build-package.cmd | 2 +- NuGet/readme.txt | 12 ++-- README.md | 15 +++-- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/AssemblyInfo.cs | 4 +- 12 files changed, 64 insertions(+), 54 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de8d0e3..fa2fa13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## December 3, 2015 - v1.6.0 + * Added support of “Edge” JsRT version of Chakra JavaScript engine + * `ChakraJsRt` mode was renamed to `ChakraIeJsRt` + ## June 29, 2015 - v1.5.5 * Fixed an error, that occurs on computers with IE 6 * Removed `Obsolete` attribute from parameterless constructor diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 7a6db9d..66c9ad7 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -1,31 +1,32 @@  - - MsieJavaScriptEngine - 1.5.6 - MSIE JavaScript Engine for .NET - Andrey Taritsyn - Andrey Taritsyn - http://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/LICENSE.md - http://github.com/Taritsyn/MsieJavaScriptEngine - http://i.imgur.com/cbiHK.png - false - This project is a .NET wrapper for working with the Internet Explorer's JavaScript engines (JsRT version of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). - This project is a .NET wrapper for working with the Internet Explorer's JavaScript engines (JsRT version of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Source code of the `ChakraJsRtJsEngine` was synchronized with the Chakra Sample Hosts version of July 11, 2015. - Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru - en-US - JavaScript ECMAScript MSIE IE Chakra - - - - - - - - - - - - + + MsieJavaScriptEngine + 1.6.0 + MSIE JavaScript Engine for .NET + Andrey Taritsyn + Andrey Taritsyn + http://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/LICENSE.md + http://github.com/Taritsyn/MsieJavaScriptEngine + http://i.imgur.com/cbiHK.png + false + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). + 1. Added support of “Edge” JsRT version of Chakra JavaScript engine; +2. `ChakraJsRt` mode was renamed to `ChakraIeJsRt`. + Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru + en-US + JavaScript ECMAScript MSIE IE Edge Chakra + + + + + + + + + + + + \ No newline at end of file diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index bc8f7b6..9b71b05 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -1,2 +1,2 @@ -\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe ..\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj /p:Configuration=Release +\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe ..\src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj /p:Configuration=Release ..\.nuget\nuget.exe pack MsieJavaScriptEngine.nuspec \ No newline at end of file diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 861ad8d..5cc198f 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET 1.5.6 + README file for MSIE JavaScript Engine for .NET v1.6.0 ---------------------------------------------------------------------- @@ -11,9 +11,9 @@ =========== DESCRIPTION =========== - This project is a .NET wrapper for working with the Internet Explorer's - JavaScript engines (JsRT version of Chakra, ActiveScript version of - Chakra and Classic JavaScript Engine). + This library is a .NET wrapper for working with the JavaScript engines + of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript + version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). @@ -21,8 +21,8 @@ ============= RELEASE NOTES ============= - Source code of the `ChakraJsRtJsEngine` was synchronized with the - Chakra Sample Hosts version of July 11, 2015. + 1. Added support of “Edge” JsRT version of Chakra JavaScript engine; + 2. `ChakraJsRt` mode was renamed to `ChakraIeJsRt`. ============ PROJECT SITE diff --git a/README.md b/README.md index 7a91260..57d04ee 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,16 @@ MSIE JavaScript Engine for .NET ![MSIE JS Engine Logo](http://i.imgur.com/T3K5q.png) -This project is a .NET wrapper for working with the Internet Explorer's JavaScript engines (JsRT version of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). +This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee) and [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host). -MSIE JavaScript Engine requires a installation of Internet Explorer on the machine and can work in 4 modes, that are defined in the `MsieJavaScriptEngine.JsEngineMode` enumeration: +MSIE JavaScript Engine requires a installation of Internet Explorer or Edge on the machine and can work in 5 modes, that are defined in the `MsieJavaScriptEngine.JsEngineMode` enumeration: * `Auto`. Automatically selects the most modern JavaScript engine from available on the machine. * `Classic`. Classic MSIE JavaScript engine (supports ECMAScript 3 with possibility of using the ECMAScript 5 Polyfill and the JSON2 library). Requires Internet Explorer 6 or higher on the machine. * `ChakraActiveScript`. ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 9 or higher on the machine. - * `ChakraJsRt`. JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or higher on the machine. Detailed information about JsRT you can read in the [Paul Vick's blog](http://www.panopticoncentral.net/category/javascript/). + * `ChakraIeJsRt`. “Legacy” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or higher on the machine. + * `ChakraEdgeJsRt`. “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Microsoft Edge on the machine. The supported .NET types are as follows: @@ -40,8 +41,12 @@ Consider a simple example of usage of the MSIE JavaScript Engine: { try { - using (var jsEngine = new MsieJsEngine(engineMode: JsEngineMode.Auto, - useEcmaScript5Polyfill: false, useJson2Library: false)) + using (var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.Auto, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + })) { const string expression = "7 * 8 - 20"; var result = jsEngine.Evaluate(expression); diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index e77adb6..2169cb3 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.5.6.0")] -[assembly: AssemblyFileVersion("1.5.6.0")] +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 9d6ba49..aac50a5 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index a33781d..787dd75 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index 57fcc4a..ad9ccef 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 69743ca..543a7e4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index b65dae9..a3b5adb 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index dab141e..4edb66a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("1.5.4.0")] -[assembly: AssemblyFileVersion("1.5.4.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.6.0.0")] +[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file From 52aefc2a3940713ae809a2bb6e7635597bb3639d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 4 Dec 2015 13:31:45 +0300 Subject: [PATCH 011/238] README.md: Updated example of usage --- README.md | 116 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 57d04ee..3e92b07 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,12 @@ MSIE JavaScript Engine for .NET This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee) and [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host). -MSIE JavaScript Engine requires a installation of Internet Explorer or Edge on the machine and can work in 5 modes, that are defined in the `MsieJavaScriptEngine.JsEngineMode` enumeration: +MSIE JavaScript Engine requires a installation of Internet Explorer or Edge on the machine and can work in 5 modes, that are defined in the JsEngineMode enumeration: * `Auto`. Automatically selects the most modern JavaScript engine from available on the machine. * `Classic`. Classic MSIE JavaScript engine (supports ECMAScript 3 with possibility of using the ECMAScript 5 Polyfill and the JSON2 library). Requires Internet Explorer 6 or higher on the machine. * `ChakraActiveScript`. ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 9 or higher on the machine. - * `ChakraIeJsRt`. “Legacy” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or higher on the machine. + * `ChakraIeJsRt`. “IE” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or Microsoft Edge on the machine. * `ChakraEdgeJsRt`. “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Microsoft Edge on the machine. The supported .NET types are as follows: @@ -28,61 +28,85 @@ This library can be installed through NuGet - [http://nuget.org/packages/MsieJav ## Usage Consider a simple example of usage of the MSIE JavaScript Engine: - namespace MsieJavaScriptEngine.Example.Console - { - using System; +```csharp +namespace MsieJavaScriptEngine.Example.Console +{ + using System; - using MsieJavaScriptEngine; - using MsieJavaScriptEngine.Helpers; + using MsieJavaScriptEngine; + using MsieJavaScriptEngine.Helpers; - class Program + class Program + { + static void Main(string[] args) { - static void Main(string[] args) + try { - try - { - using (var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Auto, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - })) - { - const string expression = "7 * 8 - 20"; - var result = jsEngine.Evaluate(expression); - - Console.WriteLine("{0} = {1}", expression, result); - } - } - catch (JsEngineLoadException e) + using (var jsEngine = new MsieJsEngine()) { - Console.WriteLine("During loading of JavaScript engine an error occurred."); - Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.Format(e)); - } - catch (JsRuntimeException e) - { - Console.WriteLine("During execution of JavaScript code an error occurred."); - Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.Format(e)); - } + const string expression = "7 * 8 - 20"; + var result = jsEngine.Evaluate(expression); - Console.ReadLine(); + Console.WriteLine("{0} = {1}", expression, result); + } } + catch (JsEngineLoadException e) + { + Console.WriteLine("During loading of JavaScript engine an error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.Format(e)); + } + catch (JsRuntimeException e) + { + Console.WriteLine("During execution of JavaScript code an error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.Format(e)); + } + + Console.ReadLine(); } } +} +``` -First we create an instance of the `MsieJsEngine` class and pass the following parameters to the constructor: - - 1. `engineMode` - JavaScript engine mode; - 2. `useEcmaScript5Polyfill` - flag for whether to use the ECMAScript 5 Polyfill; - 3. `useJson2Library` - flag for whether to use the [JSON2](http://github.com/douglascrockford/JSON-js) library. - -The values of constructor parameters in the above code correspond to the default values. - +First we create an instance of the MsieJsEngine class. Then we evaluate a JavaScript expression by using of the `Evaluate` method and output its result to the console. +In addition, we provide handling of the following exception types: JsEngineLoadException and JsRuntimeException. + +Also, when you create an instance of the MsieJsEngine class, then you can pass the JavaScript engine settings via the constructor. +Consider in detail properties of the JsEngineSettings class: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property nameData typeDefault valueDescription
    EngineModeJsEngineMode enumerationAutoJavaScript engine mode.
    UseEcmaScript5PolyfillBooleanfalseFlag for whether to use the ECMAScript 5 Polyfill.
    UseJson2LibraryBooleanfalseFlag for whether to use the JSON2 library
    -In addition, we provide handling of the following exception types: `JsEngineLoadException` and `JsRuntimeException`. ## Release History See the [changelog](CHANGELOG.md). @@ -92,7 +116,7 @@ See the [changelog](CHANGELOG.md). ## Credits * [SassAndCoffee.JavaScript](http://github.com/xpaulbettsx/SassAndCoffee) - [License: Microsoft Public License (Ms-PL)](http://github.com/paulcbetts/SassAndCoffee/blob/master/COPYING) Part of the code of this library served as the basis for the ActiveScript version of Chakra and Classic JavaScript Engine. - * [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) - [License: Apache License 2.0 (Apache)](http://github.com/panopticoncentral/chakra-host/blob/master/LICENSE) C# example from this project served as the basis for the JsRT version of Chakra. + * [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) - [License: Apache License 2.0 (Apache)](http://github.com/panopticoncentral/chakra-host/blob/master/LICENSE) C# example from this project served as the basis for the JsRT versions of Chakra. * [ECMAScript 5 Polyfill](http://nuget.org/packages/ES5) and [MDN JavaScript Polyfills](http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference) - Adds support for many of the new functions in ECMAScript 5 to downlevel browsers. * [Cross-Browser Split](http://blog.stevenlevithan.com/archives/cross-browser-split) - Adds ECMAScript compliant and uniform cross-browser split method. * [JSON2 library](http://github.com/douglascrockford/JSON-js) - Adds support of the JSON object from ECMAScript 5 to downlevel browsers. From 5d96d1fa4fea341a7bab067c9d43c08eae7cc8ae Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 4 Dec 2015 13:43:33 +0300 Subject: [PATCH 012/238] CHANGELOG.md: Added information about version 1.5.6 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa2fa13..ecc2a9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ Change log ## December 3, 2015 - v1.6.0 * Added support of “Edge” JsRT version of Chakra JavaScript engine * `ChakraJsRt` mode was renamed to `ChakraIeJsRt` + +## July 23, 2015 - v1.5.6 + * Source code of the `ChakraJsRtJsEngine` was synchronized with the Chakra Sample Hosts version of July 11, 2015 ## June 29, 2015 - v1.5.5 * Fixed an error, that occurs on computers with IE 6 From 83d2db8db87d9c0dcc71efbd0c1f774d4fda1057 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 10 Dec 2015 21:22:12 +0300 Subject: [PATCH 013/238] Changed descriptions of the `ChakraIeJsRt` mode. --- src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs | 2 +- src/MsieJavaScriptEngine/JsEngineMode.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs b/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs index 1966229..e3599aa 100644 --- a/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs +++ b/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs @@ -16,7 +16,7 @@ internal static class JsEngineModeName public const string ChakraActiveScript = "Chakra ActiveScript"; /// - /// Name of Chakra “Legacy” JsRT mode + /// Name of Chakra “IE” JsRT mode /// public const string ChakraIeJsRt = "Chakra IE JsRT"; diff --git a/src/MsieJavaScriptEngine/JsEngineMode.cs b/src/MsieJavaScriptEngine/JsEngineMode.cs index c343cc9..495b99d 100644 --- a/src/MsieJavaScriptEngine/JsEngineMode.cs +++ b/src/MsieJavaScriptEngine/JsEngineMode.cs @@ -24,8 +24,8 @@ public enum JsEngineMode ChakraActiveScript, /// - /// “Legacy” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). - /// Requires Internet Explorer 11 or higher on the machine. + /// “IE” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). + /// Requires Internet Explorer 11 or Microsoft Edge on the machine. /// ChakraIeJsRt, From f770c93b234ba2bcdfa27e0cfcf44e47b8f3d3d9 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 4 Jan 2016 21:49:40 +0300 Subject: [PATCH 014/238] Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code) --- MsieJavaScriptEngine.sln | 14 + .../ActiveScript/ActiveScriptJsEngineBase.cs | 99 ++-- .../ActiveScript/ActiveScriptSiteWrapper.cs | 74 +-- .../ChakraActiveScriptJsEngine.cs | 2 +- .../ClassicActiveScriptJsEngine.cs | 2 +- .../ActiveScript/IActiveScriptSite.cs | 14 +- .../Constants/JsEngineModeName.cs | 28 - .../Helpers/JsEngineModeHelpers.cs | 32 ++ .../Helpers/TypeMappingHelpers.cs | 90 ++++ .../Helpers/ValidationHelpers.cs | 12 + src/MsieJavaScriptEngine/HostObject.cs | 182 +++++++ src/MsieJavaScriptEngine/IInnerJsEngine.cs | 8 + .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 75 ++- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 77 ++- .../MsieJavaScriptEngine.csproj | 4 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 58 ++- .../Resources/Strings.Designer.cs | 18 + .../Resources/Strings.resx | 6 + .../Resources/Strings.ru-ru.resx | 6 + .../Utilities/TypeConverter.cs | 38 ++ .../InteropTests.cs | 23 + .../MsieJavaScriptEngine.Test.Auto.csproj | 1 + .../InteropTests.cs | 23 + ...criptEngine.Test.ChakraActiveScript.csproj | 1 + .../InteropTests.cs | 23 + ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 1 + .../InteropTests.cs | 23 + ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 1 + .../InteropTests.cs | 23 + .../MsieJavaScriptEngine.Test.Classic.csproj | 1 + .../CommonTestsBase.cs | 21 +- .../FileSystemTestsBase.cs | 28 + .../Interop/Date.cs | 34 ++ .../Interop/FileManager.cs | 20 + .../Interop/Person.cs | 28 + .../Interop/Product.cs | 8 + .../Interop/Temperature.cs | 105 ++++ .../InteropTestsBase.cs | 490 ++++++++++++++++++ .../MsieJavaScriptEngine.Test.Common.csproj | 9 + test/SharedFiles/link.txt | 1 + .../Resources => SharedFiles}/square.js | 0 41 files changed, 1542 insertions(+), 161 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs create mode 100644 src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs create mode 100644 src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs create mode 100644 src/MsieJavaScriptEngine/HostObject.cs create mode 100644 test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs create mode 100644 test/SharedFiles/link.txt rename test/{MsieJavaScriptEngine.Test.Common/Resources => SharedFiles}/square.js (100%) diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 21ced9b..07ef20e 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -26,6 +26,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.C EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.ConsoleTests", "test\MsieJavaScriptEngine.ConsoleTests\MsieJavaScriptEngine.ConsoleTests.csproj", "{AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{76F4C14E-54ED-42AC-84F7-2072B14ED59E}" + ProjectSection(SolutionItems) = preProject + test\SharedFiles\link.txt = test\SharedFiles\link.txt + test\SharedFiles\square.js = test\SharedFiles\square.js + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -60,6 +68,10 @@ Global {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.Build.0 = Debug|Any CPU {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.ActiveCfg = Release|Any CPU {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.Build.0 = Release|Any CPU + {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -72,5 +84,7 @@ Global {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} {50453B82-ACBF-4E25-9582-1113F274D53E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} + {76F4C14E-54ED-42AC-84F7-2072B14ED59E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} EndGlobalSection EndGlobal diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 8dc6926..5cf3ec6 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -41,6 +41,11 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine ///
    private ActiveScriptSiteWrapper _activeScriptSite; + /// + /// JavaScript engine mode + /// + private readonly JsEngineMode _engineMode; + /// /// Name of JavaScript engine mode /// @@ -61,15 +66,16 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine /// Constructs instance of the ActiveScript JavaScript engine ///
    /// CLSID of JavaScript engine - /// Name of JavaScript engine mode + /// JavaScript engine mode /// Lowest supported version of Internet Explorer /// Version of script language /// Flag for whether to use the ECMAScript 5 Polyfill /// Flag for whether to use the JSON2 library - protected ActiveScriptJsEngineBase(string clsid, string engineModeName, string lowerIeVersion, + protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string lowerIeVersion, ScriptLanguageVersion languageVersion, bool useEcmaScript5Polyfill, bool useJson2Library) { - _engineModeName = engineModeName; + _engineMode = engineMode; + _engineModeName = JsEngineModeHelpers.GetModeName(engineMode); _pActiveScript = IntPtr.Zero; try @@ -167,43 +173,43 @@ protected static bool IsSupported(string clsid, ref bool? isSupported, ref objec } /// - /// Executes a mapping from the host type to a script type + /// Makes a mapping of value from the host type to a script type /// /// The source value /// The mapped value - private static object MapToScriptType(object value) + private object MapToScriptType(object value) { - if (value == null) - { - return DBNull.Value; - } - - if (value is Undefined) - { - return null; - } + return TypeMappingHelpers.MapToScriptType(value, _engineMode); + } - return value; + /// + /// Makes a mapping of array items from the host type to a script type + /// + /// The source array + /// The mapped array + private object[] MapToScriptType(object[] args) + { + return TypeMappingHelpers.MapToScriptType(args, _engineMode); } /// - /// Executes a mapping from the script type to a host type + /// Makes a mapping of value from the script type to a host type /// /// The source value /// The mapped value - private static object MapToHostType(object value) + private object MapToHostType(object value) { - if (value == null) - { - return Undefined.Value; - } - - if (value is DBNull) - { - return null; - } + return TypeMappingHelpers.MapToHostType(value); + } - return value; + /// + /// Makes a mapping of array itemp from the script type to a host type + /// + /// The source array + /// The mapped array + private object[] MapToHostType(object[] args) + { + return TypeMappingHelpers.MapToHostType(args); } private JsRuntimeException ConvertActiveScriptExceptionToJsRuntimeException( @@ -367,16 +373,7 @@ public void Execute(string code) public object CallFunction(string functionName, params object[] args) { - int argumentCount = args.Length; - var processedArgs = new object[argumentCount]; - - if (argumentCount > 0) - { - for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) - { - processedArgs[argumentIndex] = MapToScriptType(args[argumentIndex]); - } - } + var processedArgs = MapToScriptType(args); object result = InvokeScript(() => { @@ -435,6 +432,34 @@ public void RemoveVariable(string variableName) InvokeScript(() => _activeScriptSite.DeleteProperty(variableName)); } + public void EmbedHostObject(string itemName, object value) + { + InvokeScript(() => + { + var processedValue = MapToScriptType(value); + object oldValue = _activeScriptSite.GetItem(itemName); + _activeScriptSite.SetItem(itemName, processedValue); + + try + { + _activeScript.AddNamedItem(itemName, ScriptItemFlags.IsVisible | ScriptItemFlags.GlobalMembers); + } + catch (Exception) + { + if (oldValue != null) + { + _activeScriptSite.SetItem(itemName, oldValue); + } + else + { + _activeScriptSite.RemoveItem(itemName); + } + + throw; + } + }); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs index 6ceab30..cb2e430 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs @@ -35,6 +35,11 @@ internal class ActiveScriptSiteWrapper : IActiveScriptSite, IDisposable ///
    private Dictionary _siteItems = new Dictionary(); + /// + /// Synchronizer + /// + private readonly object _synchronizer = new object(); + /// /// Last ActiveScript exception /// @@ -124,9 +129,9 @@ private void InitScriptDispatch() ///
    /// The name associated with the item, as specified in the /// IActiveScript.AddNamedItem method - private object GetItem(string name) + public object GetItem(string name) { - lock (_siteItems) + lock (_synchronizer) { object result; @@ -134,22 +139,19 @@ private object GetItem(string name) } } - /// - /// Allows the scripting engine to obtain information about an item added with the - /// IActiveScript.AddNamedItem method. Gets the COM ITypeInfo - /// - /// The name associated with the item, as specified in the - /// IActiveScript.AddNamedItem method - private IntPtr GetTypeInfo(string name) + public void SetItem(string name, object value) { - lock (_siteItems) + lock (_synchronizer) { - if (!_siteItems.ContainsKey(name)) - { - return IntPtr.Zero; - } + _siteItems[name] = value; + } + } - return Marshal.GetITypeInfoForType(_siteItems[name].GetType()); + public void RemoveItem(string name) + { + lock (_synchronizer) + { + _siteItems.Remove(name); } } @@ -330,10 +332,13 @@ private void Dispose(bool disposing) _lastException = null; - if (_siteItems != null) + lock (_synchronizer) { - _siteItems.Clear(); - _siteItems = null; + if (_siteItems != null) + { + _siteItems.Clear(); + _siteItems = null; + } } if (_dispatch != null) @@ -372,19 +377,19 @@ public void GetLcid(out int lcid) ///
    /// The name associated with the item, as specified in the /// IActiveScript.AddNamedItem method - /// A bit mask specifying what information about the item should be + /// A bit mask specifying what information about the item should be /// returned. The scripting engine should request the minimum amount of information possible /// because some of the return parameters (for example, ITypeInfo) can take considerable /// time to load or generate - /// A variable that receives a pointer to the IUnknown interface associated + /// A variable that receives a pointer to the IUnknown interface associated /// with the given item. The scripting engine can use the IUnknown.QueryInterface method to - /// obtain the IDispatch interface for the item. This parameter receives null if returnMask + /// obtain the IDispatch interface for the item. This parameter receives null if mask /// does not include the ScriptInfo.IUnknown value. Also, it receives null if there is no /// object associated with the item name; this mechanism is used to create a simple class when /// the named item was added with the ScriptItem.CodeOnly flag set in the /// IActiveScript.AddNamedItem method. /// A variable that receives a pointer to the ITypeInfo interface - /// associated with the item. This parameter receives null if returnMask does not include the + /// associated with the item. This parameter receives null if mask does not include the /// ScriptInfo.ITypeInfo value, or if type information is not available for this item. If type /// information is not available, the object cannot source events, and name binding must be /// realized with the IDispatch.GetIDsOfNames method. Note that the ITypeInfo interface @@ -392,28 +397,23 @@ public void GetLcid(out int lcid) /// multiple interfaces and event interfaces. If the item supports the IProvideMultipleTypeInfo /// interface, the ITypeInfo interface retrieved is the same as the index zero ITypeInfo that /// would be obtained using the IProvideMultipleTypeInfo.GetInfoOfIndex method. - public void GetItemInfo(string name, ScriptInfoFlags returnMask, out object item, out IntPtr pTypeInfo) + public void GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr pUnkItem, ref IntPtr pTypeInfo) { - if ((returnMask & ScriptInfoFlags.IUnknown) > 0) + object item = GetItem(name); + if (item == null) { - item = GetItem(name); - if (item == null) - { - throw new COMException(string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); - } - } - else - { - item = null; + throw new COMException( + string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); } - if ((returnMask & ScriptInfoFlags.ITypeInfo) > 0) + if (mask.HasFlag(ScriptInfoFlags.IUnknown)) { - pTypeInfo = GetTypeInfo(name); + pUnkItem = Marshal.GetIDispatchForObject(item); } - else + + if (mask.HasFlag(ScriptInfoFlags.ITypeInfo)) { - pTypeInfo = IntPtr.Zero; + pTypeInfo = Marshal.GetITypeInfoForType(item.GetType()); } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index c8b335e..54a2829 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -24,7 +24,7 @@ internal sealed class ChakraActiveScriptJsEngine : ActiveScriptJsEngineBase /// Constructs instance of the Chakra ActiveScript JavaScript engine ///
    public ChakraActiveScriptJsEngine() - : base(CHAKRA_CLSID, JsEngineModeName.ChakraActiveScript, "9", + : base(CHAKRA_CLSID, JsEngineMode.ChakraActiveScript, "9", ScriptLanguageVersion.EcmaScript5, false, false) { } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index 729fa6d..245cdd1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -26,7 +26,7 @@ internal sealed class ClassicActiveScriptJsEngine : ActiveScriptJsEngineBase /// Flag for whether to use the ECMAScript 5 Polyfill /// Flag for whether to use the JSON2 library public ClassicActiveScriptJsEngine(bool useEcmaScript5Polyfill, bool useJson2Library) - : base(CLASSIC_CLSID, JsEngineModeName.Classic, "6", + : base(CLASSIC_CLSID, JsEngineMode.Classic, "6", ScriptLanguageVersion.None, useEcmaScript5Polyfill, useJson2Library) { } diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index 692a545..65301ea 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -34,19 +34,19 @@ void GetLcid( ///
    /// The name associated with the item, as specified in the /// IActiveScript.AddNamedItem method - /// A bit mask specifying what information about the item should be + /// A bit mask specifying what information about the item should be /// returned. The scripting engine should request the minimum amount of information possible /// because some of the return parameters (for example, ITypeInfo) can take considerable /// time to load or generate. - /// A variable that receives a pointer to the IUnknown interface associated + /// A variable that receives a pointer to the IUnknown interface associated /// with the given item. The scripting engine can use the IUnknown.QueryInterface method to - /// obtain the IDispatch interface for the item. This parameter receives null if returnMask + /// obtain the IDispatch interface for the item. This parameter receives null if mask /// does not include the ScriptInfo.IUnknown value. Also, it receives null if there is no /// object associated with the item name; this mechanism is used to create a simple class when /// the named item was added with the ScriptItem.CodeOnly flag set in the /// IActiveScript.AddNamedItem method. /// A variable that receives a pointer to the ITypeInfo interface - /// associated with the item. This parameter receives null if returnMask does not include the + /// associated with the item. This parameter receives null if mask does not include the /// ScriptInfo.ITypeInfo value, or if type information is not available for this item. If type /// information is not available, the object cannot source events, and name binding must be /// realized with the IDispatch.GetIDsOfNames method. Note that the ITypeInfo interface @@ -56,9 +56,9 @@ void GetLcid( /// would be obtained using the IProvideMultipleTypeInfo.GetInfoOfIndex method. void GetItemInfo( [In] [MarshalAs(UnmanagedType.LPWStr)] string name, - [In] ScriptInfoFlags returnMask, - [Out] [MarshalAs(UnmanagedType.IUnknown)] out object item, - [Out] out IntPtr pTypeInfo); + [In] ScriptInfoFlags mask, + [In] [Out] ref IntPtr pUnkItem, + [In] [Out] ref IntPtr pTypeInfo); /// /// Retrieves a host-defined string that uniquely identifies the current document version. If diff --git a/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs b/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs deleted file mode 100644 index e3599aa..0000000 --- a/src/MsieJavaScriptEngine/Constants/JsEngineModeName.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace MsieJavaScriptEngine.Constants -{ - /// - /// JavaScript engine mode names - /// - internal static class JsEngineModeName - { - /// - /// Name of Classic mode - /// - public const string Classic = "Classic"; - - /// - /// Name of Chakra ActiveScript mode - /// - public const string ChakraActiveScript = "Chakra ActiveScript"; - - /// - /// Name of Chakra “IE” JsRT mode - /// - public const string ChakraIeJsRt = "Chakra IE JsRT"; - - /// - /// Name of Chakra “Edge” JsRT mode - /// - public const string ChakraEdgeJsRt = "Chakra Edge JsRT"; - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs new file mode 100644 index 0000000..6aa48a9 --- /dev/null +++ b/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs @@ -0,0 +1,32 @@ +namespace MsieJavaScriptEngine.Helpers +{ + using System; + + internal static class JsEngineModeHelpers + { + public static string GetModeName(JsEngineMode mode) + { + string modeName; + + switch (mode) + { + case JsEngineMode.Classic: + modeName = "Classic"; + break; + case JsEngineMode.ChakraActiveScript: + modeName = "Chakra ActiveScript"; + break; + case JsEngineMode.ChakraIeJsRt: + modeName = "Chakra IE JsRT"; + break; + case JsEngineMode.ChakraEdgeJsRt: + modeName = "Chakra Edge JsRT"; + break; + default: + throw new NotSupportedException(); + } + + return modeName; + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs new file mode 100644 index 0000000..0f94505 --- /dev/null +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -0,0 +1,90 @@ +namespace MsieJavaScriptEngine.Helpers +{ + using System; + using System.Linq; + + using Utilities; + + /// + /// Type mapping helpers + /// + internal static class TypeMappingHelpers + { + /// + /// Makes a mapping of value from the host type to a script type + /// + /// The source value + /// JavaScript engine mode + /// The mapped value + public static object MapToScriptType(object value, JsEngineMode engineMode) + { + if (value == null) + { + return DBNull.Value; + } + + if (value is Undefined) + { + return null; + } + + if (TypeConverter.IsPrimitiveType(value.GetType())) + { + return value; + } + + var result = new HostObject(value, engineMode); + + return result; + } + + /// + /// Makes a mapping of array items from the host type to a script type + /// + /// The source array + /// JavaScript engine mode + /// The mapped array + public static object[] MapToScriptType(object[] args, JsEngineMode engineMode) + { + return args.Select(arg => MapToScriptType(arg, engineMode)).ToArray(); + } + + /// + /// Makes a mapping of value from the script type to a host type + /// + /// The source value + /// The mapped value + public static object MapToHostType(object value) + { + if (value == null) + { + return Undefined.Value; + } + + if (value is DBNull) + { + return null; + } + + if (TypeConverter.IsPrimitiveType(value.GetType())) + { + return value; + } + + var hostObj = value as HostObject; + object result = hostObj != null ? hostObj.Target : value; + + return result; + } + + /// + /// Makes a mapping of array itemp from the script type to a host type + /// + /// The source array + /// The mapped array + public static object[] MapToHostType(object[] args) + { + return args.Select(MapToHostType).ToArray(); + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs index f15ffe4..de10b6c 100644 --- a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs @@ -4,6 +4,8 @@ using System.Linq; using System.Text.RegularExpressions; + using Utilities; + /// /// Validation helpers /// @@ -35,6 +37,16 @@ public static bool IsSupportedType(Type type) return result; } + /// + /// Checks whether .NET type is primitive + /// + /// .NET type + /// Result of check (true - is primitive; false - is not primitive) + public static bool IsPrimitiveType(Type type) + { + return TypeConverter.IsPrimitiveType(type); + } + /// /// Checks a format of the name /// diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs new file mode 100644 index 0000000..44b8688 --- /dev/null +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -0,0 +1,182 @@ +namespace MsieJavaScriptEngine +{ + using System; + using System.Globalization; + using System.Linq; + using System.Reflection; + + using Helpers; + + /// + /// Wrapper for object, that implements interface + /// + internal class HostObject : IReflect + { + /// + /// Target object + /// + private readonly object _target; + + /// + /// Target type + /// + private readonly Type _type; + + /// + /// JavaScript engine mode + /// + private readonly JsEngineMode _engineMode; + + /// + /// List of fields + /// + private readonly FieldInfo[] _fields; + + /// + /// List of properties + /// + private readonly PropertyInfo[] _properties; + + /// + /// List of methods + /// + private readonly MethodInfo[] _methods; + + /// + /// Gets a target object + /// + public object Target + { + get { return _target; } + } + + + /// + /// Constructs an instance of the wrapper for object, that implements interface + /// + /// Target object + /// JavaScript engine mode + public HostObject(object target, JsEngineMode engineMode) + { + _target = target; + _type = target.GetType(); + _engineMode = engineMode; + + var defaultBindingFlags = BindingFlags.Instance | BindingFlags.Public; + _fields = _type.GetFields(defaultBindingFlags); + _properties = _type.GetProperties(defaultBindingFlags); + _methods = _type.GetMethods(defaultBindingFlags); + } + + #region IReflect implementation + + Type IReflect.UnderlyingSystemType + { + get { throw new NotImplementedException(); } + } + + + FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) + { + FieldInfo field = _fields.SingleOrDefault(f => f.Name == name); + + return field; + } + + FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) + { + return _fields; + } + + MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) + { + throw new NotImplementedException(); + } + + MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) + { + throw new NotImplementedException(); + } + + MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) + { + MethodInfo method = _methods.SingleOrDefault(m => m.Name == name); + + return method; + } + + MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException(); + } + + MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) + { + return _methods; + } + + PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) + { + return _properties; + } + + PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) + { + PropertyInfo property = _properties.SingleOrDefault(p => p.Name == name); + + return property; + } + + PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, + Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException(); + } + + object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + object result; + object processedTarget = TypeMappingHelpers.MapToHostType(target); + object[] processedArgs = TypeMappingHelpers.MapToHostType(args); + + var del = processedTarget as Delegate; + if (del != null) + { + if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0) + { + processedArgs = processedArgs.Skip(1).ToArray(); + } + + result = del.DynamicInvoke(processedArgs); + } + else + { + BindingFlags processedInvokeAttr = invokeAttr; + if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) + || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) + && !_properties.Any(p => p.Name == name) + && _fields.Any(p => p.Name == name)) + { + if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) + { + processedInvokeAttr &= ~BindingFlags.GetProperty; + processedInvokeAttr |= BindingFlags.GetField; + } + else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) + { + processedInvokeAttr &= ~BindingFlags.PutDispProperty; + processedInvokeAttr |= BindingFlags.SetField; + } + } + + result = _type.InvokeMember(name, processedInvokeAttr, binder, processedTarget, + processedArgs, modifiers, culture, namedParameters); + } + + return TypeMappingHelpers.MapToScriptType(result, _engineMode); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index 5be4678..205494d 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -60,5 +60,13 @@ internal interface IInnerJsEngine : IDisposable /// /// Name of variable void RemoveVariable(string variableName); + + /// + /// Embeds a host object to script code + /// + /// The name for the new global variable or function that will represent the object + /// The object to expose + /// Allows to embed instances of simple classes (or structures) and delegates. + void EmbedHostObject(string itemName, object value); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index b3de605..7a0efd2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -2,9 +2,11 @@ { using System; using System.Globalization; + using System.Linq; using System.Text; using Constants; + using Helpers; using Resources; using Utilities; @@ -13,10 +15,15 @@ /// internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine { + /// + /// JavaScript engine mode + /// + private readonly JsEngineMode _engineMode; + /// /// Name of JavaScript engine mode /// - const string ENGINE_MODE_NAME = JsEngineModeName.ChakraEdgeJsRt; + private readonly string _engineModeName; /// /// Instance of JavaScript runtime @@ -54,6 +61,9 @@ internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine /// public ChakraEdgeJsRtJsEngine() { + _engineMode = JsEngineMode.ChakraEdgeJsRt; + _engineModeName = JsEngineModeHelpers.GetModeName(_engineMode); + try { _jsRuntime = CreateJsRuntime(); @@ -71,12 +81,12 @@ public ChakraEdgeJsRtJsEngine() errorMessage = string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message); } - throw new JsEngineLoadException(errorMessage, ENGINE_MODE_NAME); + throw new JsEngineLoadException(errorMessage, _engineModeName); } catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message), ENGINE_MODE_NAME); + string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); } } @@ -146,11 +156,11 @@ public static bool IsSupported() } /// - /// Executes a mapping from the host type to a script type + /// Makes a mapping of value from the host type to a script type /// /// The source value /// The mapped value - private static EdgeJsValue MapToScriptType(object value) + private EdgeJsValue MapToScriptType(object value) { if (value == null) { @@ -175,16 +185,28 @@ private static EdgeJsValue MapToScriptType(object value) case TypeCode.String: return EdgeJsValue.FromString((string)value); default: - return EdgeJsValue.FromObject(value); + object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? + new HostObject(value, _engineMode) : value; + return EdgeJsValue.FromObject(processedValue); } } /// - /// Executes a mapping from the script type to a host type + /// Makes a mapping of array items from the host type to a script type + /// + /// The source array + /// The mapped array + private EdgeJsValue[] MapToScriptType(object[] args) + { + return args.Select(MapToScriptType).ToArray(); + } + + /// + /// Makes a mapping of value from the script type to a host type /// /// The source value /// The mapped value - private static object MapToHostType(EdgeJsValue value) + private object MapToHostType(EdgeJsValue value) { JsValueType valueType = value.ValueType; EdgeJsValue processedValue; @@ -215,7 +237,17 @@ private static object MapToHostType(EdgeJsValue value) case JsValueType.Error: case JsValueType.Array: processedValue = value.ConvertToObject(); - result = processedValue.ToObject(); + object obj = processedValue.ToObject(); + + if (!TypeConverter.IsPrimitiveType(obj.GetType())) + { + var hostObj = obj as HostObject; + result = hostObj != null ? hostObj.Target : obj; + } + else + { + result = obj; + } break; default: throw new ArgumentOutOfRangeException(); @@ -224,6 +256,16 @@ private static object MapToHostType(EdgeJsValue value) return result; } + /// + /// Makes a mapping of array items from the script type to a host type + /// + /// The source array + /// The mapped array + private object[] MapToHostType(EdgeJsValue[] args) + { + return args.Select(MapToHostType).ToArray(); + } + private JsRuntimeException ConvertJsExceptionToJsRuntimeException( JsException jsException) { @@ -281,7 +323,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( category = "Fatal error"; } - var jsEngineException = new JsRuntimeException(message, ENGINE_MODE_NAME) + var jsEngineException = new JsRuntimeException(message, _engineModeName) { ErrorCode = ((uint)jsException.ErrorCode).ToString(CultureInfo.InvariantCulture), Category = category, @@ -348,7 +390,7 @@ private void Dispose(bool disposing) public string Mode { - get { return ENGINE_MODE_NAME; } + get { return _engineModeName; } } public object Evaluate(string expression) @@ -460,6 +502,17 @@ public void RemoveVariable(string variableName) }); } + public void EmbedHostObject(string itemName, object value) + { + InvokeScript(() => + { + EdgeJsValue processedValue = MapToScriptType(value); + EdgeJsPropertyId itemId = EdgeJsPropertyId.FromString(itemName); + + EdgeJsValue.GlobalObject.SetProperty(itemId, processedValue, true); + }); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 80ab1ba..47bee62 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -2,9 +2,11 @@ { using System; using System.Globalization; + using System.Linq; using System.Text; using Constants; + using Helpers; using Resources; using Utilities; @@ -13,10 +15,15 @@ /// internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine { + /// + /// JavaScript engine mode + /// + private readonly JsEngineMode _engineMode; + /// /// Name of JavaScript engine mode /// - const string ENGINE_MODE_NAME = JsEngineModeName.ChakraIeJsRt; + private readonly string _engineModeName; /// /// Lowest supported version of Internet Explorer @@ -59,6 +66,9 @@ internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine /// public ChakraIeJsRtJsEngine() { + _engineMode = JsEngineMode.ChakraIeJsRt; + _engineModeName = JsEngineModeHelpers.GetModeName(_engineMode); + try { _jsRuntime = CreateJsRuntime(); @@ -74,16 +84,16 @@ public ChakraIeJsRtJsEngine() else { errorMessage = string.Format(Strings.Runtime_IeJsEngineNotLoaded, - ENGINE_MODE_NAME, LOWER_IE_VERSION, e.Message); + _engineModeName, LOWER_IE_VERSION, e.Message); } - throw new JsEngineLoadException(errorMessage, ENGINE_MODE_NAME); + throw new JsEngineLoadException(errorMessage, _engineModeName); } catch (Exception e) { throw new JsEngineLoadException( string.Format(Strings.Runtime_IeJsEngineNotLoaded, - ENGINE_MODE_NAME, LOWER_IE_VERSION, e.Message), ENGINE_MODE_NAME); + _engineModeName, LOWER_IE_VERSION, e.Message), _engineModeName); } } @@ -167,11 +177,11 @@ public static bool IsSupported() } /// - /// Executes a mapping from the host type to a script type + /// Makes a mapping of value from the host type to a script type /// /// The source value /// The mapped value - private static IeJsValue MapToScriptType(object value) + private IeJsValue MapToScriptType(object value) { if (value == null) { @@ -196,16 +206,28 @@ private static IeJsValue MapToScriptType(object value) case TypeCode.String: return IeJsValue.FromString((string)value); default: - return IeJsValue.FromObject(value); + object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? + new HostObject(value, _engineMode) : value; + return IeJsValue.FromObject(processedValue); } } /// - /// Executes a mapping from the script type to a host type + /// Makes a mapping of array items from the host type to a script type + /// + /// The source array + /// The mapped array + private IeJsValue[] MapToScriptType(object[] args) + { + return args.Select(MapToScriptType).ToArray(); + } + + /// + /// Makes a mapping of value from the script type to a host type /// /// The source value /// The mapped value - private static object MapToHostType(IeJsValue value) + private object MapToHostType(IeJsValue value) { JsValueType valueType = value.ValueType; IeJsValue processedValue; @@ -236,7 +258,17 @@ private static object MapToHostType(IeJsValue value) case JsValueType.Error: case JsValueType.Array: processedValue = value.ConvertToObject(); - result = processedValue.ToObject(); + object obj = processedValue.ToObject(); + + if (!TypeConverter.IsPrimitiveType(obj.GetType())) + { + var hostObj = obj as HostObject; + result = hostObj != null ? hostObj.Target : obj; + } + else + { + result = obj; + } break; default: throw new ArgumentOutOfRangeException(); @@ -245,6 +277,16 @@ private static object MapToHostType(IeJsValue value) return result; } + /// + /// Makes a mapping of array itemp from the script type to a host type + /// + /// The source array + /// The mapped array + private object[] MapToHostType(IeJsValue[] args) + { + return args.Select(MapToHostType).ToArray(); + } + private JsRuntimeException ConvertJsExceptionToJsRuntimeException( JsException jsException) { @@ -302,7 +344,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( category = "Fatal error"; } - var jsEngineException = new JsRuntimeException(message, ENGINE_MODE_NAME) + var jsEngineException = new JsRuntimeException(message, _engineModeName) { ErrorCode = ((uint)jsException.ErrorCode).ToString(CultureInfo.InvariantCulture), Category = category, @@ -369,7 +411,7 @@ private void Dispose(bool disposing) public string Mode { - get { return ENGINE_MODE_NAME; } + get { return _engineModeName; } } public object Evaluate(string expression) @@ -481,6 +523,17 @@ public void RemoveVariable(string variableName) }); } + public void EmbedHostObject(string itemName, object value) + { + InvokeScript(() => + { + IeJsValue processedValue = MapToScriptType(value); + IeJsPropertyId itemId = IeJsPropertyId.FromString(itemName); + + IeJsValue.GlobalObject.SetProperty(itemId, processedValue, true); + }); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index be57d64..7310e2b 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -67,10 +67,12 @@ - + + + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index f048719..4b4eda6 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -5,7 +5,6 @@ using System.Text; using ActiveScript; - using Constants; using Helpers; using JsRt.Edge; using JsRt.Ie; @@ -107,8 +106,8 @@ public MsieJsEngine(JsEngineSettings settings) throw new JsEngineLoadException( string.Format( Strings.Runtime_JsEnginesConflictInProcess, - JsEngineModeName.ChakraEdgeJsRt, - JsEngineModeName.ChakraIeJsRt + JsEngineModeHelpers.GetModeName(processedEngineMode), + JsEngineModeHelpers.GetModeName(previousMode) ) ); } @@ -117,8 +116,8 @@ public MsieJsEngine(JsEngineSettings settings) throw new JsEngineLoadException( string.Format( Strings.Runtime_JsEnginesConflictInProcess, - JsEngineModeName.ChakraEdgeJsRt, - JsEngineModeName.ChakraActiveScript + JsEngineModeHelpers.GetModeName(processedEngineMode), + JsEngineModeHelpers.GetModeName(previousMode) ) ); } @@ -134,8 +133,8 @@ public MsieJsEngine(JsEngineSettings settings) throw new JsEngineLoadException( string.Format( Strings.Runtime_JsEnginesConflictInProcess, - JsEngineModeName.ChakraIeJsRt, - JsEngineModeName.ChakraEdgeJsRt + JsEngineModeHelpers.GetModeName(processedEngineMode), + JsEngineModeHelpers.GetModeName(previousMode) ) ); } @@ -151,8 +150,8 @@ public MsieJsEngine(JsEngineSettings settings) throw new JsEngineLoadException( string.Format( Strings.Runtime_JsEnginesConflictInProcess, - JsEngineModeName.ChakraActiveScript, - JsEngineModeName.ChakraEdgeJsRt + JsEngineModeHelpers.GetModeName(processedEngineMode), + JsEngineModeHelpers.GetModeName(previousMode) ) ); } @@ -629,6 +628,47 @@ public void RemoveVariable(string variableName) _jsEngine.RemoveVariable(variableName); } + /// + /// Embeds a host object to script code + /// + /// The name for the new global variable or function that will represent the object + /// The object to expose + /// Allows to embed instances of simple classes (or structures) and delegates. + public void EmbedHostObject(string itemName, object value) + { + VerifyNotDisposed(); + + if (string.IsNullOrWhiteSpace(itemName)) + { + throw new ArgumentException( + string.Format(Strings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + } + + if (!ValidationHelpers.CheckNameFormat(itemName)) + { + throw new FormatException( + string.Format(Strings.Runtime_InvalidScriptItemNameFormat, itemName)); + } + + if (value != null) + { + Type itemType = value.GetType(); + + if (ValidationHelpers.IsPrimitiveType(itemType) + || itemType == typeof (Undefined)) + { + throw new NotSupportedTypeException( + string.Format(Strings.Runtime_EmbeddedHostObjectTypeNotSupported, itemType.FullName)); + } + } + else + { + throw new ArgumentNullException("value", string.Format(Strings.Common_ArgumentIsNull, "value")); + } + + _jsEngine.EmbedHostObject(itemName, value); + } + #region IDisposable implementation /// diff --git a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs index ac76ced..d0b7699 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs @@ -225,6 +225,15 @@ internal static string Runtime_EdgeJsEngineNotLoaded { } } + /// + /// Looks up a localized string similar to The embedded host object '{0}' has a type `{1}`, which is not supported.. + /// + internal static string Runtime_EmbeddedHostObjectTypeNotSupported { + get { + return ResourceManager.GetString("Runtime_EmbeddedHostObjectTypeNotSupported", resourceCulture); + } + } + /// /// Looks up a localized string similar to The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language.. /// @@ -291,6 +300,15 @@ internal static string Runtime_InvalidPropertyNameFormat { } } + /// + /// Looks up a localized string similar to The script item name '{0}' has incorrect format.. + /// + internal static string Runtime_InvalidScriptItemNameFormat { + get { + return ResourceManager.GetString("Runtime_InvalidScriptItemNameFormat", resourceCulture); + } + } + /// /// Looks up a localized string similar to The variable name '{0}' has incorrect format.. /// diff --git a/src/MsieJavaScriptEngine/Resources/Strings.resx b/src/MsieJavaScriptEngine/Resources/Strings.resx index b618989..a41d230 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.resx @@ -174,6 +174,9 @@ See more details: {0} + + The embedded host object '{0}' has a type `{1}`, which is not supported. + The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language. @@ -198,6 +201,9 @@ See more details: Property name '{0}' has incorrect format. + + The script item name '{0}' has incorrect format. + The variable name '{0}' has incorrect format. diff --git a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx index b5940aa..bde2624 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx @@ -174,6 +174,9 @@ {0} + + Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! + Имя функции "{0}" запрещено, т.к. входит в список зарезервированных слов JavaScript! @@ -198,6 +201,9 @@ Имя свойства "{0}" имеет некорректный формат! + + Имя скриптового элемента "{0}" имеет некорректный формат! + Имя переменной "{0}" имеет некорректный формат! diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index f8a2466..4c85817 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -3,6 +3,7 @@ using System; using System.ComponentModel; using System.Globalization; + using System.Linq; using OriginalTypeConverter = System.ComponentModel.TypeConverter; using Resources; @@ -12,6 +13,18 @@ /// public static class TypeConverter { + /// + /// List of primitive type codes + /// + private static readonly TypeCode[] _primitiveTypeCodes = new[] + { + TypeCode.Boolean, + TypeCode.SByte, TypeCode.Byte, + TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, + TypeCode.Single, TypeCode.Double, TypeCode.Decimal, + TypeCode.Char, TypeCode.String + }; + /// /// Converts the specified value to the specified type /// @@ -70,6 +83,31 @@ public static bool TryConvertToType(object value, Type targetType, out object co return result; } + /// + /// Checks whether .NET type is primitive + /// + /// .NET type + /// Result of check (true - is primitive; false - is not primitive) + internal static bool IsPrimitiveType(Type type) + { + TypeCode typeCode = Type.GetTypeCode(type); + bool result = IsPrimitiveType(typeCode); + + return result; + } + + /// + /// Checks whether .NET type is primitive + /// + /// .NET type code + /// Result of check (true - is primitive; false - is not primitive) + internal static bool IsPrimitiveType(TypeCode typeCode) + { + bool result = _primitiveTypeCodes.Contains(typeCode); + + return result; + } + private static bool ConvertObjectToType(object obj, Type type, bool throwOnError, out object convertedObject) { diff --git a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs new file mode 100644 index 0000000..712c3fc --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs @@ -0,0 +1,23 @@ +namespace MsieJavaScriptEngine.Test.Auto +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Common; + + [TestFixture] + public class InteropTests : InteropTestsBase + { + protected override MsieJsEngine CreateJsEngine() + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.Auto, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index c8bfbe5..5fb2f25 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -42,6 +42,7 @@ + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs new file mode 100644 index 0000000..8c89810 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -0,0 +1,23 @@ +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Common; + + [TestFixture] + public class InteropTests : InteropTestsBase + { + protected override MsieJsEngine CreateJsEngine() + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 398d0d6..52f8f64 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -42,6 +42,7 @@ + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs new file mode 100644 index 0000000..f687602 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -0,0 +1,23 @@ +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Common; + + [TestFixture] + public class InteropTests : InteropTestsBase + { + protected override MsieJsEngine CreateJsEngine() + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index bb1a491..bc7ae77 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -42,6 +42,7 @@ + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs new file mode 100644 index 0000000..6474b23 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -0,0 +1,23 @@ +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Common; + + [TestFixture] + public class InteropTests : InteropTestsBase + { + protected override MsieJsEngine CreateJsEngine() + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index e165e71..d1a6d53 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -42,6 +42,7 @@ + diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs new file mode 100644 index 0000000..2b008ad --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -0,0 +1,23 @@ +namespace MsieJavaScriptEngine.Test.Classic +{ + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Common; + + [TestFixture] + public class InteropTests : InteropTestsBase + { + protected override MsieJsEngine CreateJsEngine() + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.Classic, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 250e2b7..ac8ffed 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -42,6 +42,7 @@ + diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index f02cc9b..8073e06 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -2,21 +2,14 @@ { using System; using System.IO; - using System.Text.RegularExpressions; using NUnit.Framework; using MsieJavaScriptEngine; [TestFixture] - public abstract class CommonTestsBase + public abstract class CommonTestsBase : FileSystemTestsBase { - /// - /// Regular expression for working with the `bin` directory path - /// - private readonly Regex _binDirRegex = new Regex(@"\\bin\\(?:Debug|Release)\\?$", RegexOptions.IgnoreCase); - - protected abstract MsieJsEngine CreateJsEngine(); #region Evaluation of code @@ -172,13 +165,7 @@ public virtual void ExecutionOfCodeIsCorrect() public virtual void ExecutionOfFileIsCorrect() { // Arrange - string relativeFilePath = "MsieJavaScriptEngine.Test.Common/Resources/square.js"; - string appBaseDirPath = AppDomain.CurrentDomain.BaseDirectory; - if (_binDirRegex.IsMatch(appBaseDirPath)) - { - relativeFilePath = Path.Combine("..\\..\\..\\", relativeFilePath); - } - string absoluteFilePath = Path.GetFullPath(Path.Combine(appBaseDirPath, relativeFilePath)); + string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/square.js")); const string input = "square(6);"; const int targetOutput = 36; @@ -187,7 +174,7 @@ public virtual void ExecutionOfFileIsCorrect() using (var jsEngine = CreateJsEngine()) { - jsEngine.ExecuteFile(absoluteFilePath); + jsEngine.ExecuteFile(filePath); output = jsEngine.Evaluate(input); } @@ -532,7 +519,7 @@ public virtual void CallingOfFunctionWithManyParametersAndDoubleResultIsCorrect( using (var jsEngine = CreateJsEngine()) { jsEngine.Execute(functionCode); - output = Math.Round(jsEngine.CallFunction("sum", 22000, 8.5, 0.05, 3), 2); + output = jsEngine.CallFunction("sum", 22000, 8.5, 0.05, 3); } // Assert diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs new file mode 100644 index 0000000..04c9ac9 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -0,0 +1,28 @@ +namespace MsieJavaScriptEngine.Test.Common +{ + using System; + using System.IO; + using System.Text.RegularExpressions; + + public abstract class FileSystemTestsBase + { + /// + /// Regular expression for working with the `bin` directory path + /// + private readonly Regex _binDirRegex = new Regex(@"\\bin\\(?:Debug|Release)\\?$", RegexOptions.IgnoreCase); + + protected string _baseDirectoryPath; + + + protected FileSystemTestsBase() + { + string baseDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; + if (_binDirRegex.IsMatch(baseDirectoryPath)) + { + baseDirectoryPath = Path.Combine(baseDirectoryPath, @"..\..\..\"); + } + + _baseDirectoryPath = baseDirectoryPath; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs new file mode 100644 index 0000000..73da9de --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs @@ -0,0 +1,34 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public struct Date + { + private static readonly int[] _cumulativeDays = { 0, 31, 59, 90, 120, 151, 181, + 212, 243, 273, 304, 334 }; + + public int Year; + public int Month; + public int Day; + + + public Date(int year, int month, int day) + { + Year = year; + Month = month; + Day = day; + } + + + public static bool IsLeapYear(int year) + { + return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); + } + + public int GetDayOfYear() + { + return _cumulativeDays[Month - 1] + + Day + + (Month > 2 && IsLeapYear(Year) ? 1 : 0) + ; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs new file mode 100644 index 0000000..a61aec7 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs @@ -0,0 +1,20 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + using System; + using System.IO; + + public sealed class FileManager + { + public string ReadFile(string path) + { + if (path == null) + { + throw new ArgumentNullException("path"); + } + + string content = File.ReadAllText(path); + + return content; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs new file mode 100644 index 0000000..294a17c --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs @@ -0,0 +1,28 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public sealed class Person + { + public string FirstName + { + get; + set; + } + + public string LastName + { + get; + set; + } + + + public Person() + : this(string.Empty, string.Empty) + { } + + public Person(string firstName, string lastName) + { + FirstName = firstName; + LastName = lastName; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs new file mode 100644 index 0000000..e86e463 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs @@ -0,0 +1,8 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public sealed class Product + { + public string Name; + public double Price; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs new file mode 100644 index 0000000..fc67995 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs @@ -0,0 +1,105 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + using System; + + public struct Temperature + { + double _celsius; + + public double Celsius + { + get + { + return _celsius; + } + set + { + _celsius = value; + } + } + + public double Kelvin + { + get + { + return _celsius + 273.15; + } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException(); + } + + _celsius = value - 273.15; + } + } + + public double Fahrenheit + { + get + { + return 9 * _celsius / 5 + 32; + } + set + { + _celsius = 5 * (value - 32) / 9; + } + } + + public Temperature(double degree, TemperatureUnits units) + { + _celsius = 0; + + switch (units) + { + case TemperatureUnits.Celsius: + Celsius = degree; + break; + case TemperatureUnits.Kelvin: + Kelvin = degree; + break; + case TemperatureUnits.Fahrenheit: + Fahrenheit = degree; + break; + default: + throw new NotSupportedException(); + } + } + + public override string ToString() + { + return ToString(TemperatureUnits.Celsius); + } + + public string ToString(TemperatureUnits units) + { + string formattedValue; + + switch (units) + { + case TemperatureUnits.Celsius: + formattedValue = String.Format("{0}\u00B0 C", Celsius); + break; + case TemperatureUnits.Kelvin: + formattedValue = String.Format("{0}\u00B0 K", Kelvin); + break; + case TemperatureUnits.Fahrenheit: + formattedValue = String.Format("{0}\u00B0 F", Fahrenheit); + break; + default: + formattedValue = string.Empty; + break; + } + + return formattedValue; + } + } + + public enum TemperatureUnits + { + Celsius, + Kelvin, + Fahrenheit + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs new file mode 100644 index 0000000..cdbae5c --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -0,0 +1,490 @@ +namespace MsieJavaScriptEngine.Test.Common +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.IO; + using System.Linq; + + using NUnit.Framework; + + using MsieJavaScriptEngine; + using Interop; + + [TestFixture] + public abstract class InteropTestsBase : FileSystemTestsBase + { + protected abstract MsieJsEngine CreateJsEngine(); + + #region Embedding of objects + + #region Objects with fields + + [Test] + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithFieldsIsCorrect() + { + // Arrange + var date = new Date(2015, 12, 29); + const string updateCode = "date.Day += 2;"; + + const string input1 = "date.Year"; + const int targetOutput1 = 2015; + + const string input2 = "date.Month"; + const int targetOutput2 = 12; + + const string input3 = "date.Day"; + const int targetOutput3 = 31; + + // Act + int output1; + int output2; + int output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("date", date); + jsEngine.Execute(updateCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFieldsIsCorrect() + { + // Arrange + var product = new Product + { + Name = "Red T-shirt", + Price = 995.00 + }; + + const string updateCode = "product.Price *= 1.15;"; + + const string input1 = "product.Name"; + const string targetOutput1 = "Red T-shirt"; + + const string input2 = "product.Price"; + const double targetOutput2 = 1144.25; + + // Act + string output1; + double output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("product", product); + jsEngine.Execute(updateCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + } + + #endregion + + #region Objects with properties + + [Test] + public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithPropertiesIsCorrect() + { + // Arrange + var timeSpan = new TimeSpan(4840780000000); + + const string input1 = "timeSpan.Days"; + const int targetOutput1 = 5; + + const string input2 = "timeSpan.Hours"; + const int targetOutput2 = 14; + + const string input3 = "timeSpan.Minutes"; + const int targetOutput3 = 27; + + const string input4 = "timeSpan.Seconds"; + const int targetOutput4 = 58; + + // Act + int output1; + int output2; + int output3; + int output4; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("timeSpan", timeSpan); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + output4 = jsEngine.Evaluate(input4); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + Assert.AreEqual(targetOutput4, output4); + } + + [Test] + public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithPropertiesIsCorrect() + { + // Arrange + var uri = new Uri("https://github.com/Taritsyn/MsieJavaScriptEngine"); + + const string input1 = "uri.Scheme"; + const string targetOutput1 = "https"; + + const string input2 = "uri.Host"; + const string targetOutput2 = "github.com"; + + const string input3 = "uri.PathAndQuery"; + const string targetOutput3 = "/Taritsyn/MsieJavaScriptEngine"; + + // Act + string output1; + string output2; + string output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("uri", uri); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithPropertiesIsCorrect() + { + // Arrange + var temperature = new Temperature(-17.3, TemperatureUnits.Celsius); + + const string input1 = "temperature.Celsius"; + const double targetOutput1 = -17.3; + + const string input2 = "temperature.Kelvin"; + const double targetOutput2 = 255.85; + + const string input3 = "temperature.Fahrenheit"; + const double targetOutput3 = 0.86; + + // Act + double output1; + double output2; + double output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("temperature", temperature); + + output1 = Math.Round(jsEngine.Evaluate(input1), 2); + output2 = Math.Round(jsEngine.Evaluate(input2), 2); + output3 = Math.Round(jsEngine.Evaluate(input3), 2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorrect() + { + // Arrange + var person = new Person("Vanya", "Ivanov"); + const string updateCode = "person.LastName = person.LastName.substr(0, 5) + 'ff';"; + + const string input1 = "person.FirstName"; + const string targetOutput1 = "Vanya"; + + const string input2 = "person.LastName"; + const string targetOutput2 = "Ivanoff"; + + // Act + string output1; + string output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("person", person); + jsEngine.Execute(updateCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + } + + #endregion + + #region Objects with methods + + [Test] + public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithMethodsIsCorrect() + { + // Arrange + var color = Color.FromArgb(84, 139, 212); + + const string input1 = "color.GetHue()"; + const double targetOutput1 = 214.21875d; + + const string input2 = "color.GetSaturation()"; + const double targetOutput2 = 0.59813079999999996d; + + const string input3 = "color.GetBrightness()"; + const double targetOutput3 = 0.58039220000000002d; + + // Act + double output1; + double output2; + double output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("color", color); + + output1 = Math.Round(jsEngine.Evaluate(input1), 7); + output2 = Math.Round(jsEngine.Evaluate(input2), 7); + output3 = Math.Round(jsEngine.Evaluate(input3), 7); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + [Test] + public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithMethodIsCorrect() + { + // Arrange + var random = new Random(); + + const string input = "random.Next(1, 3)"; + IEnumerable targetOutput = Enumerable.Range(1, 3); + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("random", random); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.IsTrue(targetOutput.Contains(output)); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethodIsCorrect() + { + // Arrange + var programmerDayDate = new Date(2015, 9, 13); + + const string input = "programmerDay.GetDayOfYear()"; + const int targetOutput = 256; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("programmerDay", programmerDayDate); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect() + { + // Arrange + var fileManager = new FileManager(); + string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/link.txt")); + + string input = string.Format("fileManager.ReadFile('{0}')", filePath.Replace(@"\", @"\\")); + const string targetOutput = "http://www.panopticoncentral.net/2015/09/09/the-two-faces-of-jsrt-in-windows-10/"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("fileManager", fileManager); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Delegates + + [Test] + public virtual void EmbeddingOfInstanceOfDelegateWithoutParametersIsCorrect() + { + // Arrange + var generateRandomStringFunc = new Func(() => + { + const string symbolString = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + int symbolStringLength = symbolString.Length; + Random randomizer = new Random(); + string result = string.Empty; + + for (int i = 0; i < 20; i++) + { + int randomNumber = randomizer.Next(symbolStringLength); + string randomSymbol = symbolString.Substring(randomNumber, 1); + + result += randomSymbol; + } + + return result; + }); + + const string input = "generateRandomString()"; + const int targetOutputLength = 20; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("generateRandomString", generateRandomStringFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.IsNotNullOrEmpty(output); + Assert.IsTrue(output.Length == targetOutputLength); + } + + [Test] + public virtual void EmbeddingOfInstanceOfDelegateWithOneParameterIsCorrect() + { + // Arrange + var squareFunc = new Func(a => a * a); + + const string input = "square(7)"; + const int targetOutput = 49; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("square", squareFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfInstanceOfDelegateWithTwoParametersIsCorrect() + { + // Arrange + var sumFunc = new Func((a, b) => a + b); + + const string input = "sum(3.14, 2.20)"; + const double targetOutput = 5.34; + + // Act + double output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("sum", sumFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Integration + + [Test] + public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCorrect() + { + // Arrange + var informaticsDayDate = new Date(2015, 12, 4); + var addDaysFunc = new Func((value, numberOfDays) => + { + var originalDateTime = new DateTime(value.Year, value.Month, value.Day); + DateTime changedDateTime = originalDateTime.AddDays(numberOfDays); + + return new Date(changedDateTime.Year, changedDateTime.Month, changedDateTime.Day); + }); + + const string updateCode = @"var webmasterDay = addDays(informaticsDay, -244); +var sysadminDay = addDays(webmasterDay, 118);"; + + const string input1 = "sysadminDay.Year"; + const int targetOutput1 = 2015; + + const string input2 = "sysadminDay.Month"; + const int targetOutput2 = 7; + + const string input3 = "sysadminDay.Day"; + const int targetOutput3 = 31; + + // Act + int output1; + int output2; + int output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("informaticsDay", informaticsDayDate); + jsEngine.EmbedHostObject("addDays", addDaysFunc); + jsEngine.Execute(updateCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f9955ec..b506e69 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -38,11 +38,19 @@ + + + + + + + + @@ -57,6 +65,7 @@ + diff --git a/test/SharedFiles/link.txt b/test/SharedFiles/link.txt new file mode 100644 index 0000000..c8b66f7 --- /dev/null +++ b/test/SharedFiles/link.txt @@ -0,0 +1 @@ +http://www.panopticoncentral.net/2015/09/09/the-two-faces-of-jsrt-in-windows-10/ \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Resources/square.js b/test/SharedFiles/square.js similarity index 100% rename from test/MsieJavaScriptEngine.Test.Common/Resources/square.js rename to test/SharedFiles/square.js From 95d040b62344283be854c0fe233769d20f87100f Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 4 Jan 2016 21:54:06 +0300 Subject: [PATCH 015/238] MsieJavaScriptEngine.sln: Removed unnecessary project --- MsieJavaScriptEngine.sln | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 07ef20e..fa8361b 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -14,6 +14,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine", "src EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{2A0DC227-73C5-4E3A-853A-83007AD56B85}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{76F4C14E-54ED-42AC-84F7-2072B14ED59E}" + ProjectSection(SolutionItems) = preProject + test\SharedFiles\link.txt = test\SharedFiles\link.txt + test\SharedFiles\square.js = test\SharedFiles\square.js + EndProjectSection +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{A4085B9E-A5D3-4749-BD07-6D1EB7C23820}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.csproj", "{A4874C43-2097-4FDB-882A-0D74E5508BBD}" @@ -26,14 +32,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.C EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.ConsoleTests", "test\MsieJavaScriptEngine.ConsoleTests\MsieJavaScriptEngine.ConsoleTests.csproj", "{AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{76F4C14E-54ED-42AC-84F7-2072B14ED59E}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\link.txt = test\SharedFiles\link.txt - test\SharedFiles\square.js = test\SharedFiles\square.js - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -68,10 +66,6 @@ Global {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.Build.0 = Debug|Any CPU {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.ActiveCfg = Release|Any CPU {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.Build.0 = Release|Any CPU - {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -84,7 +78,6 @@ Global {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} {50453B82-ACBF-4E25-9582-1113F274D53E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {AFB5ABDF-4F9B-455B-BDA0-CC03D5597FE5} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} {76F4C14E-54ED-42AC-84F7-2072B14ED59E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} EndGlobalSection EndGlobal From b115280b3e5c69ab00bd9b72c9b095a2bd691a5e Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 5 Jan 2016 14:57:09 +0300 Subject: [PATCH 016/238] Improved implementation of the `CallFunction` method for Chakra JsRT modes --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 37 ++-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 37 ++-- .../MsieJavaScriptEngine.csproj | 1 - .../Utilities/SimplisticJsSerializer.cs | 175 ------------------ 4 files changed, 28 insertions(+), 222 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 7a0efd2..d34af70 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -3,7 +3,6 @@ using System; using System.Globalization; using System.Linq; - using System.Text; using Constants; using Helpers; @@ -412,34 +411,26 @@ public void Execute(string code) public object CallFunction(string functionName, params object[] args) { - string serializedArguments = string.Empty; - int argumentCount = args.Length; - - if (argumentCount == 1) - { - object value = args[0]; - serializedArguments = SimplisticJsSerializer.Serialize(value); - } - else if (argumentCount > 1) + object result = InvokeScript(() => { - var serializedArgumentsBuilder = new StringBuilder(); + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId functionId = EdgeJsPropertyId.FromString(functionName); - for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) { - object value = args[argumentIndex]; - string serializedValue = SimplisticJsSerializer.Serialize(value); - - if (argumentIndex > 0) - { - serializedArgumentsBuilder.Append(", "); - } - serializedArgumentsBuilder.Append(serializedValue); + throw new JsRuntimeException( + string.Format(Strings.Runtime_FunctionNotExist, functionName)); } - serializedArguments = serializedArgumentsBuilder.ToString(); - } + var processedArgs = MapToScriptType(args); + var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - object result = Evaluate(string.Format("{0}({1});", functionName, serializedArguments)); + EdgeJsValue functionValue = globalObj.GetProperty(functionId); + EdgeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + + return MapToHostType(resultValue); + }); return result; } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 47bee62..a36f769 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -3,7 +3,6 @@ using System; using System.Globalization; using System.Linq; - using System.Text; using Constants; using Helpers; @@ -433,34 +432,26 @@ public void Execute(string code) public object CallFunction(string functionName, params object[] args) { - string serializedArguments = string.Empty; - int argumentCount = args.Length; - - if (argumentCount == 1) - { - object value = args[0]; - serializedArguments = SimplisticJsSerializer.Serialize(value); - } - else if (argumentCount > 1) + object result = InvokeScript(() => { - var serializedArgumentsBuilder = new StringBuilder(); + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId functionId = IeJsPropertyId.FromString(functionName); - for (int argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) { - object value = args[argumentIndex]; - string serializedValue = SimplisticJsSerializer.Serialize(value); - - if (argumentIndex > 0) - { - serializedArgumentsBuilder.Append(", "); - } - serializedArgumentsBuilder.Append(serializedValue); + throw new JsRuntimeException( + string.Format(Strings.Runtime_FunctionNotExist, functionName)); } - serializedArguments = serializedArgumentsBuilder.ToString(); - } + var processedArgs = MapToScriptType(args); + var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - object result = Evaluate(string.Format("{0}({1});", functionName, serializedArguments)); + IeJsValue functionValue = globalObj.GetProperty(functionId); + IeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + + return MapToHostType(resultValue); + }); return result; } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 7310e2b..f2aafb8 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -99,7 +99,6 @@ - diff --git a/src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs b/src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs deleted file mode 100644 index 01a7d12..0000000 --- a/src/MsieJavaScriptEngine/Utilities/SimplisticJsSerializer.cs +++ /dev/null @@ -1,175 +0,0 @@ -namespace MsieJavaScriptEngine.Utilities -{ - using System; - using System.Globalization; - using System.Text; - - using Resources; - - /// - /// Simplistic JavaScript serializer - /// - internal static class SimplisticJsSerializer - { - private static bool JsEncodeAmpersand - { - get { return true; } - } - - - /// - /// Converts a value to JavaScript string - /// - /// The value to serialize - /// The serialized JavaScript string - public static string Serialize(object value) - { - if (value == null) - { - return "null"; - } - - if (value is Undefined) - { - return "undefined"; - } - - string serializedValue; - Type type = value.GetType(); - TypeCode typeCode = Type.GetTypeCode(type); - - switch (typeCode) - { - case TypeCode.Boolean: - serializedValue = SerializeBoolean((bool)value); - break; - case TypeCode.Int32: - var convertible = value as IConvertible; - serializedValue = (convertible != null) ? - convertible.ToString(CultureInfo.InvariantCulture) : value.ToString(); - break; - case TypeCode.Double: - serializedValue = ((double)value).ToString("r", CultureInfo.InvariantCulture); - break; - case TypeCode.String: - serializedValue = SerializeString((string)value); - break; - default: - throw new NotSupportedException(string.Format(Strings.Common_CannotSerializeType, type)); - } - - return serializedValue; - } - - private static string SerializeBoolean(bool value) - { - string serializedValue = value ? "true" : "false"; - - return serializedValue; - } - - private static string SerializeString(string value) - { - string serializedValue = '"' + JsStringEncode(value) + '"'; - - return serializedValue; - } - - private static string JsStringEncode(string value) - { - if (string.IsNullOrEmpty(value)) - { - return string.Empty; - } - - StringBuilder sb = null; - int charCount = value.Length; - - int startIndex = 0; - int count = 0; - - for (int charIndex = 0; charIndex < charCount; ++charIndex) - { - char charValue = value[charIndex]; - - if (CharRequiresJsEncoding(charValue)) - { - if (sb == null) - { - sb = new StringBuilder(value.Length + 5); - } - - if (count > 0) - { - sb.Append(value, startIndex, count); - } - - startIndex = charIndex + 1; - count = 0; - - switch (charValue) - { - case '\b': - sb.Append("\\b"); - break; - case '\t': - sb.Append("\\t"); - break; - case '\n': - sb.Append("\\n"); - break; - case '\f': - sb.Append("\\f"); - break; - case '\r': - sb.Append("\\r"); - break; - case '"': - sb.Append("\\\""); - break; - case '\\': - sb.Append("\\\\"); - break; - default: - AppendCharAsJsUnicode(sb, charValue); - break; - } - } - else - { - ++count; - } - } - - if (sb == null) - { - return value; - } - - if (count > 0) - { - sb.Append(value, startIndex, count); - } - - return sb.ToString(); - } - - private static bool CharRequiresJsEncoding(char charValue) - { - if (charValue >= 32 && charValue != 34 && (charValue != 92 && charValue != 39) - && (charValue != 60 && charValue != 62 && (charValue != 38 || !JsEncodeAmpersand)) - && (charValue != 133 && charValue != 8232)) - { - return (charValue == 8233); - } - - return true; - } - - private static void AppendCharAsJsUnicode(StringBuilder sb, char charValue) - { - sb.Append("\\u"); - sb.Append(((int)charValue).ToString("x4", CultureInfo.InvariantCulture)); - } - } -} \ No newline at end of file From c3642d124172f3be3841a8167bc8fb571e0be1ed Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 5 Jan 2016 19:32:59 +0300 Subject: [PATCH 017/238] Version 1.7.0 Alpha 1 --- CHANGELOG.md | 4 ++++ LICENSE.md | 2 +- NuGet/MsieJavaScriptEngine.nuspec | 8 ++++---- NuGet/readme.txt | 10 ++++++---- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- .../Properties/AssemblyInfo.cs | 6 +++--- 11 files changed, 36 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecc2a9f..3761c34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## January 5, 2016 - v1.7.0 Alpha 1 + * Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code) + * Improved implementation of the `CallFunction` method for Chakra JsRT modes + ## December 3, 2015 - v1.6.0 * Added support of “Edge” JsRT version of Chakra JavaScript engine * `ChakraJsRt` mode was renamed to `ChakraIeJsRt` diff --git a/LICENSE.md b/LICENSE.md index 498cb6d..6cfac88 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru +Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru Microsoft Public License (Ms-PL) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 66c9ad7..a3fdb76 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.6.0 + 1.7.0-alpha1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,9 +12,9 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added support of “Edge” JsRT version of Chakra JavaScript engine; -2. `ChakraJsRt` mode was renamed to `ChakraIeJsRt`. - Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru + 1. Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code); +2. Improved implementation of the `CallFunction` method for Chakra JsRT modes. + Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 5cc198f..2092543 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,11 +1,11 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.6.0 + README file for MSIE JavaScript Engine for .NET v1.7.0 Alpha 1 ---------------------------------------------------------------------- - Copyright (c) 2012-2015 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru =========== @@ -21,8 +21,10 @@ ============= RELEASE NOTES ============= - 1. Added support of “Edge” JsRT version of Chakra JavaScript engine; - 2. `ChakraJsRt` mode was renamed to `ChakraIeJsRt`. + 1. Added the `EmbedHostObject` method (embeds a instance of simple + class, structure or delegate to script code); + 2. Improved implementation of the `CallFunction` method for Chakra + JsRT modes. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 2169cb3..dc94e48 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -6,14 +6,14 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index aac50a5..f9cd7f2 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Auto Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index 787dd75..e9611bf 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index ad9ccef..a09ae3f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 543a7e4..6dbe669 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index a3b5adb..dda7ff8 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Classic Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index 4edb66a..a1d5e5b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Common Tests")] -[assembly: AssemblyCopyright("Copyright © 2012-2015 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("1.6.0.0")] -[assembly: AssemblyFileVersion("1.6.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("1.7.0.0")] +[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file From a97b6d3896e842d070b5acc0150e98af39f55b94 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 16 Jan 2016 18:59:41 +0300 Subject: [PATCH 018/238] 1. Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code; 2. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`). --- src/MsieJavaScriptEngine/JsEngineSettings.cs | 11 +++ .../JsRt/ChakraJsRtJsEngineBase.cs | 87 +++++++++++++++++++ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 55 ++++++------ .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 70 +++++++++------ .../MsieJavaScriptEngine.csproj | 1 + src/MsieJavaScriptEngine/MsieJsEngine.cs | 4 +- 6 files changed, 174 insertions(+), 54 deletions(-) create mode 100644 src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs diff --git a/src/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs index 40cc371..4102a28 100644 --- a/src/MsieJavaScriptEngine/JsEngineSettings.cs +++ b/src/MsieJavaScriptEngine/JsEngineSettings.cs @@ -5,6 +5,16 @@ /// public sealed class JsEngineSettings { + /// + /// Gets or sets a flag for whether to enable script debugging features + /// (only works in the ChakraIeJsRt and ChakraEdgeJsRt modes) + /// + public bool EnableDebugging + { + get; + set; + } + /// /// Gets or sets a JavaScript engine mode /// @@ -38,6 +48,7 @@ public bool UseJson2Library /// public JsEngineSettings() { + EnableDebugging = false; EngineMode = JsEngineMode.Auto; UseEcmaScript5Polyfill = false; UseJson2Library = false; diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs new file mode 100644 index 0000000..f0c17d9 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -0,0 +1,87 @@ +namespace MsieJavaScriptEngine.JsRt +{ + using Helpers; + + /// + /// Base class of the Chakra JsRT JavaScript engine + /// + internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine + { + /// + /// JavaScript engine mode + /// + protected readonly JsEngineMode _engineMode; + + /// + /// Name of JavaScript engine mode + /// + protected readonly string _engineModeName; + + /// + /// Flag for whether to enable script debugging features + /// + protected readonly bool _enableDebugging; + + /// + /// Flag indicating whether debugging started + /// + private bool _debuggingStarted; + + + /// + /// Constructs instance of the Chakra JsRT JavaScript engine + /// + /// JavaScript engine mode + /// Flag for whether to enable script debugging features + protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging) + { + _engineMode = engineMode; + _engineModeName = JsEngineModeHelpers.GetModeName(engineMode); + _enableDebugging = enableDebugging; + } + + + /// + /// Starts debugging + /// + protected void StartDebugging() + { + if (!_debuggingStarted) + { + InnerStartDebugging(); + _debuggingStarted = true; + } + } + + protected abstract void InnerStartDebugging(); + + #region IInnerJsEngine implementation + + public abstract string Mode { get; } + + + public abstract object Evaluate(string expression); + + public abstract void Execute(string code); + + public abstract object CallFunction(string functionName, params object[] args); + + public abstract bool HasVariable(string variableName); + + public abstract object GetVariableValue(string variableName); + + public abstract void SetVariableValue(string variableName, object value); + + public abstract void RemoveVariable(string variableName); + + public abstract void EmbedHostObject(string itemName, object value); + + #endregion + + #region IDisposable implementation + + public abstract void Dispose(); + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index d34af70..f014f31 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -5,25 +5,14 @@ using System.Linq; using Constants; - using Helpers; using Resources; using Utilities; /// /// “Edge” JsRT version of Chakra JavaScript engine /// - internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine + internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase { - /// - /// JavaScript engine mode - /// - private readonly JsEngineMode _engineMode; - - /// - /// Name of JavaScript engine mode - /// - private readonly string _engineModeName; - /// /// Instance of JavaScript runtime /// @@ -58,11 +47,10 @@ internal sealed class ChakraEdgeJsRtJsEngine : IInnerJsEngine /// /// Constructs instance of the Chakra “Edge” JsRT JavaScript engine /// - public ChakraEdgeJsRtJsEngine() + /// Flag for whether to enable script debugging features + public ChakraEdgeJsRtJsEngine(bool enableDebugging) + : base(JsEngineMode.ChakraEdgeJsRt, enableDebugging) { - _engineMode = JsEngineMode.ChakraEdgeJsRt; - _engineModeName = JsEngineModeHelpers.GetModeName(_engineMode); - try { _jsRuntime = CreateJsRuntime(); @@ -335,11 +323,21 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( return jsEngineException; } + protected override void InnerStartDebugging() + { + EdgeJsContext.StartDebugging(); + } + private void InvokeScript(Action action) { lock (_runSynchronizer) using (new EdgeJsScope(_jsContext)) { + if (_enableDebugging) + { + StartDebugging(); + } + try { action(); @@ -356,6 +354,11 @@ private T InvokeScript(Func func) lock (_runSynchronizer) using (new EdgeJsScope(_jsContext)) { + if (_enableDebugging) + { + StartDebugging(); + } + try { return func(); @@ -387,12 +390,12 @@ private void Dispose(bool disposing) #region IInnerJsEngine implementation - public string Mode + public override string Mode { get { return _engineModeName; } } - public object Evaluate(string expression) + public override object Evaluate(string expression) { object result = InvokeScript(() => { @@ -404,12 +407,12 @@ public object Evaluate(string expression) return result; } - public void Execute(string code) + public override void Execute(string code) { InvokeScript(() => EdgeJsContext.RunScript(code)); } - public object CallFunction(string functionName, params object[] args) + public override object CallFunction(string functionName, params object[] args) { object result = InvokeScript(() => { @@ -435,7 +438,7 @@ public object CallFunction(string functionName, params object[] args) return result; } - public bool HasVariable(string variableName) + public override bool HasVariable(string variableName) { bool result = InvokeScript(() => { @@ -455,7 +458,7 @@ public bool HasVariable(string variableName) return result; } - public object GetVariableValue(string variableName) + public override object GetVariableValue(string variableName) { object result = InvokeScript(() => { @@ -468,7 +471,7 @@ public object GetVariableValue(string variableName) return result; } - public void SetVariableValue(string variableName, object value) + public override void SetVariableValue(string variableName, object value) { InvokeScript(() => { @@ -479,7 +482,7 @@ public void SetVariableValue(string variableName, object value) }); } - public void RemoveVariable(string variableName) + public override void RemoveVariable(string variableName) { InvokeScript(() => { @@ -493,7 +496,7 @@ public void RemoveVariable(string variableName) }); } - public void EmbedHostObject(string itemName, object value) + public override void EmbedHostObject(string itemName, object value) { InvokeScript(() => { @@ -511,7 +514,7 @@ public void EmbedHostObject(string itemName, object value) /// /// Destroys object /// - public void Dispose() + public override void Dispose() { Dispose(true /* disposing */); GC.SuppressFinalize(this); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index a36f769..f65ebae 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -5,25 +5,14 @@ using System.Linq; using Constants; - using Helpers; using Resources; using Utilities; /// /// “IE” JsRT version of Chakra JavaScript engine /// - internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine + internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase { - /// - /// JavaScript engine mode - /// - private readonly JsEngineMode _engineMode; - - /// - /// Name of JavaScript engine mode - /// - private readonly string _engineModeName; - /// /// Lowest supported version of Internet Explorer /// @@ -63,11 +52,10 @@ internal sealed class ChakraIeJsRtJsEngine : IInnerJsEngine /// /// Constructs instance of the Chakra “IE” JsRT JavaScript engine /// - public ChakraIeJsRtJsEngine() + /// Flag for whether to enable script debugging features + public ChakraIeJsRtJsEngine(bool enableDebugging) + : base(JsEngineMode.ChakraIeJsRt, enableDebugging) { - _engineMode = JsEngineMode.ChakraIeJsRt; - _engineModeName = JsEngineModeHelpers.GetModeName(_engineMode); - try { _jsRuntime = CreateJsRuntime(); @@ -356,11 +344,36 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( return jsEngineException; } + protected override void InnerStartDebugging() + { + if (Environment.Is64BitProcess) + { + var processDebugManager64 = (IProcessDebugManager64)new ProcessDebugManager(); + IDebugApplication64 debugApplication64; + processDebugManager64.GetDefaultApplication(out debugApplication64); + + IeJsContext.StartDebugging(debugApplication64); + } + else + { + var processDebugManager32 = (IProcessDebugManager32)new ProcessDebugManager(); + IDebugApplication32 debugApplication32; + processDebugManager32.GetDefaultApplication(out debugApplication32); + + IeJsContext.StartDebugging(debugApplication32); + } + } + private void InvokeScript(Action action) { lock (_runSynchronizer) using (new IeJsScope(_jsContext)) { + if (_enableDebugging) + { + StartDebugging(); + } + try { action(); @@ -377,6 +390,11 @@ private T InvokeScript(Func func) lock (_runSynchronizer) using (new IeJsScope(_jsContext)) { + if (_enableDebugging) + { + StartDebugging(); + } + try { return func(); @@ -408,12 +426,12 @@ private void Dispose(bool disposing) #region IInnerJsEngine implementation - public string Mode + public override string Mode { get { return _engineModeName; } } - public object Evaluate(string expression) + public override object Evaluate(string expression) { object result = InvokeScript(() => { @@ -425,12 +443,12 @@ public object Evaluate(string expression) return result; } - public void Execute(string code) + public override void Execute(string code) { InvokeScript(() => IeJsContext.RunScript(code)); } - public object CallFunction(string functionName, params object[] args) + public override object CallFunction(string functionName, params object[] args) { object result = InvokeScript(() => { @@ -456,7 +474,7 @@ public object CallFunction(string functionName, params object[] args) return result; } - public bool HasVariable(string variableName) + public override bool HasVariable(string variableName) { bool result = InvokeScript(() => { @@ -476,7 +494,7 @@ public bool HasVariable(string variableName) return result; } - public object GetVariableValue(string variableName) + public override object GetVariableValue(string variableName) { object result = InvokeScript(() => { @@ -489,7 +507,7 @@ public object GetVariableValue(string variableName) return result; } - public void SetVariableValue(string variableName, object value) + public override void SetVariableValue(string variableName, object value) { InvokeScript(() => { @@ -500,7 +518,7 @@ public void SetVariableValue(string variableName, object value) }); } - public void RemoveVariable(string variableName) + public override void RemoveVariable(string variableName) { InvokeScript(() => { @@ -514,7 +532,7 @@ public void RemoveVariable(string variableName) }); } - public void EmbedHostObject(string itemName, object value) + public override void EmbedHostObject(string itemName, object value) { InvokeScript(() => { @@ -532,7 +550,7 @@ public void EmbedHostObject(string itemName, object value) /// /// Destroys object /// - public void Dispose() + public override void Dispose() { Dispose(true /* disposing */); GC.SuppressFinalize(this); diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index f2aafb8..514cbf7 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -75,6 +75,7 @@ + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 4b4eda6..7102273 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -99,7 +99,7 @@ public MsieJsEngine(JsEngineSettings settings) if (previousMode != JsEngineMode.ChakraIeJsRt && previousMode != JsEngineMode.ChakraActiveScript) { - _jsEngine = new ChakraEdgeJsRtJsEngine(); + _jsEngine = new ChakraEdgeJsRtJsEngine(settings.EnableDebugging); } else if (previousMode == JsEngineMode.ChakraIeJsRt) { @@ -126,7 +126,7 @@ public MsieJsEngine(JsEngineSettings settings) case JsEngineMode.ChakraIeJsRt: if (previousMode != JsEngineMode.ChakraEdgeJsRt) { - _jsEngine = new ChakraIeJsRtJsEngine(); + _jsEngine = new ChakraIeJsRtJsEngine(settings.EnableDebugging); } else { From 6c288c37f7450f7c4a525e540ddbfdf4474c2f10 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 16 Jan 2016 19:41:06 +0300 Subject: [PATCH 019/238] Version 1.7.0 Alpha 2 --- CHANGELOG.md | 4 ++++ NuGet/MsieJavaScriptEngine.nuspec | 6 +++--- NuGet/readme.txt | 11 ++++++----- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3761c34..2c08fca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## January 16, 2016 - v1.7.0 Alpha 2 + * Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. + * In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`) + ## January 5, 2016 - v1.7.0 Alpha 1 * Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code) * Improved implementation of the `CallFunction` method for Chakra JsRT modes diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index a3fdb76..135e8b8 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.0-alpha1 + 1.7.0-alpha2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,8 +12,8 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code); -2. Improved implementation of the `CallFunction` method for Chakra JsRT modes. + 1. Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. +2. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`). Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 2092543..d523cbf 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.0 Alpha 1 + README file for MSIE JavaScript Engine for .NET v1.7.0 Alpha 2 ---------------------------------------------------------------------- @@ -21,10 +21,11 @@ ============= RELEASE NOTES ============= - 1. Added the `EmbedHostObject` method (embeds a instance of simple - class, structure or delegate to script code); - 2. Improved implementation of the `CallFunction` method for Chakra - JsRT modes. + 1. Added a possibility to debug in Visual Studio by adding the + `debugger` statement to script code. This feature only works in the + `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. + 2. In JavaScript engine settings was added one new property - + `EnableDebugging` (default `false`). ============ PROJECT SITE From 3d8246f702d8f6309d9a7003ad6e2f74227b47a4 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 26 Feb 2016 18:50:22 +0300 Subject: [PATCH 020/238] Added the `EmbedHostType` method (embeds a host type to script code) --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 456 +++++++++++++--- .../ActiveScript/ActiveScriptSiteWrapper.cs | 494 ------------------ .../Constants/SpecialMemberName.cs | 10 + src/MsieJavaScriptEngine/HostItemBase.cs | 184 +++++++ src/MsieJavaScriptEngine/HostObject.cs | 156 +----- src/MsieJavaScriptEngine/HostType.cs | 54 ++ src/MsieJavaScriptEngine/IInnerJsEngine.cs | 11 + .../JsRt/ChakraJsRtJsEngineBase.cs | 4 + .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 11 + .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 11 + .../MsieJavaScriptEngine.csproj | 4 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 44 +- .../Resources/Strings.Designer.cs | 9 + .../Resources/Strings.resx | 3 + .../Resources/Strings.ru-ru.resx | 3 + .../Interop/Base64Encoder.cs | 16 + .../Interop/BundleTable.cs | 19 + .../Interop/Date.cs | 13 + .../Interop/Person.cs | 6 + .../Interop/Point3D.cs | 25 + .../Interop/PredefinedStrings.cs | 9 + .../Interop/SimpleSingleton.cs | 17 + .../InteropTestsBase.cs | 481 +++++++++++++++++ .../MsieJavaScriptEngine.Test.Common.csproj | 5 + 24 files changed, 1356 insertions(+), 689 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs create mode 100644 src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs create mode 100644 src/MsieJavaScriptEngine/HostItemBase.cs create mode 100644 src/MsieJavaScriptEngine/HostType.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/BundleTable.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Point3D.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/PredefinedStrings.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 5cf3ec6..ee02f2e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -1,11 +1,15 @@ namespace MsieJavaScriptEngine.ActiveScript { using System; + using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Runtime.InteropServices; + using System.Runtime.InteropServices.Expando; using System.Windows.Threading; + using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; + using Constants; using Helpers; using Resources; @@ -14,7 +18,7 @@ /// /// Base class of the ActiveScript JavaScript engine /// - internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine + internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine, IActiveScriptSite { ///
    /// Name of resource, which contains a ECMAScript 5 Polyfill @@ -37,9 +41,29 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine private IActiveScript _activeScript; /// - /// Instance of site for the ActiveScript engine + /// Instance of ActiveScriptParseWrapper + /// + private IActiveScriptParseWrapper _activeScriptParse; + + /// + /// Instance of script dispatch + /// + private IExpando _dispatch; + + /// + /// List of host items /// - private ActiveScriptSiteWrapper _activeScriptSite; + private Dictionary _hostItems = new Dictionary(); + + /// + /// Host-defined document version string + /// + private readonly string _documentVersion; + + /// + /// Last ActiveScript exception + /// + private ActiveScriptException _lastException; /// /// JavaScript engine mode @@ -63,7 +87,7 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine /// - /// Constructs instance of the ActiveScript JavaScript engine + /// Constructs an instance of the ActiveScript JavaScript engine /// /// CLSID of JavaScript engine /// JavaScript engine mode @@ -95,10 +119,10 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string var activeScriptProperty = _activeScript as IActiveScriptProperty; if (activeScriptProperty != null) { - object scriptLanguageVersion = (int) languageVersion; - uint result = activeScriptProperty.SetProperty((uint) ScriptProperty.InvokeVersioning, + object scriptLanguageVersion = (int)languageVersion; + uint result = activeScriptProperty.SetProperty((uint)ScriptProperty.InvokeVersioning, IntPtr.Zero, ref scriptLanguageVersion); - if (result != (uint) ScriptHResult.Ok) + if (result != (uint)ScriptHResult.Ok) { throw new JsEngineLoadException( string.Format(Strings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); @@ -106,7 +130,14 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string } } - _activeScriptSite = new ActiveScriptSiteWrapper(_pActiveScript, _activeScript); + _activeScriptParse = new ActiveScriptParseWrapper(_pActiveScript, _activeScript); + _activeScriptParse.InitNew(); + + _activeScript.SetScriptSite(this); + _activeScript.SetScriptState(ScriptState.Started); + + InitScriptDispatch(); + _documentVersion = DateTime.UtcNow.ToString("o"); LoadResources(useEcmaScript5Polyfill, useJson2Library); } @@ -203,7 +234,7 @@ private object MapToHostType(object value) } /// - /// Makes a mapping of array itemp from the script type to a host type + /// Makes a mapping of array items from the script type to a host type /// /// The source array /// The mapped array @@ -229,6 +260,49 @@ private JsRuntimeException ConvertActiveScriptExceptionToJsRuntimeException( return jsEngineException; } + /// + /// Initializes a script dispatch + /// + private void InitScriptDispatch() + { + IExpando dispatch = null; + object obj; + + _activeScript.GetScriptDispatch(null, out obj); + + if (obj != null && obj.GetType().IsCOMObject) + { + dispatch = obj as IExpando; + } + + if (dispatch == null) + { + throw new InvalidOperationException(Strings.Runtime_ActiveScriptDispatcherNotInitialized); + } + + _dispatch = dispatch; + } + + /// + /// Gets and resets a last exception. Returns null for none. + /// + private ActiveScriptException GetAndResetLastException() + { + ActiveScriptException temp = _lastException; + _lastException = null; + + return temp; + } + + private void ThrowError() + { + ActiveScriptException last = GetAndResetLastException(); + if (last != null) + { + throw last; + } + } + private void InvokeScript(Action action) { try @@ -273,6 +347,139 @@ private T InvokeScript(Func func) } } + /// + /// Executes a script text + /// + /// Script text + /// Flag that script text needs to run as an expression + /// Result of the execution + private object InnerExecute(string code, bool isExpression) + { + object result; + + try + { + result = _activeScriptParse.ParseScriptText(code, null, null, null, IntPtr.Zero, + 0, isExpression ? ScriptTextFlags.IsExpression : ScriptTextFlags.IsVisible); + } + catch + { + ThrowError(); + throw; + } + + // Check for parse error + ThrowError(); + + return result; + } + + /// + /// Calls a function + /// + /// Function name + /// Function arguments + /// Result of the function execution + private object InnerCallFunction(string functionName, params object[] args) + { + object result; + + try + { + result = _dispatch.InvokeMember(functionName, BindingFlags.InvokeMethod, + null, _dispatch, args, null, CultureInfo.InvariantCulture, null); + } + catch + { + ThrowError(); + throw; + } + + return result; + } + + /// + /// Gets a value of variable + /// + /// Name of variable + /// Value of variable + private object InnerGetVariableValue(string variableName) + { + object variableValue; + + try + { + variableValue = _dispatch.InvokeMember(variableName, BindingFlags.GetProperty, + null, _dispatch, new object[0], null, + CultureInfo.InvariantCulture, null); + } + catch + { + ThrowError(); + throw; + } + + return variableValue; + } + + /// + /// Sets a value to variable + /// + /// Name of variable + /// Value of variable + private void InnerSetVariableValue(string variableName, object value) + { + object[] args = { value }; + + try + { + _dispatch.InvokeMember(variableName, BindingFlags.SetProperty, null, _dispatch, + args, null, CultureInfo.InvariantCulture, null); + } + catch (MissingMemberException) + { + _dispatch.AddProperty(variableName); + _dispatch.InvokeMember(variableName, BindingFlags.SetProperty, null, _dispatch, + args, null, CultureInfo.InvariantCulture, null); + } + catch + { + ThrowError(); + throw; + } + } + + private void EmbedHostItem(string itemName, object value) + { + InvokeScript(() => + { + object oldValue = null; + if (_hostItems.ContainsKey(itemName)) + { + oldValue = _hostItems[itemName]; + } + _hostItems[itemName] = value; + + try + { + _activeScript.AddNamedItem(itemName, ScriptItemFlags.IsVisible | ScriptItemFlags.GlobalMembers); + } + catch (Exception) + { + if (oldValue != null) + { + _hostItems[itemName] = oldValue; + } + else + { + _hostItems.Remove(itemName); + } + + throw; + } + }); + } + /// /// Loads a resources /// @@ -323,31 +530,156 @@ private void ExecuteResource(string resourceName, Type type) /// managed objects contained in fields of class private void Dispose(bool disposing) { - _dispatcher.Invoke(DispatcherPriority.Input, (Action)InnerDispose); + _dispatcher.Invoke(DispatcherPriority.Input, (Action)(() => + { + if (!_disposed) + { + _disposed = true; + + if (_dispatch != null) + { + ComHelpers.ReleaseComObject(ref _dispatch, !disposing); + _dispatch = null; + } + + if (_activeScriptParse != null) + { + _activeScriptParse.Dispose(); + _activeScriptParse = null; + } + + if (_activeScript != null) + { + _activeScript.Close(); + _activeScript = null; + } + + ComHelpers.ReleaseAndEmpty(ref _pActiveScript); + + if (_hostItems != null) + { + _hostItems.Clear(); + _hostItems = null; + } + + _lastException = null; + } + })); + } + + #region IActiveScriptSite implementation + + /// + /// Retrieves the locale identifier associated with the host's user interface. The scripting + /// engine uses the identifier to ensure that error strings and other user-interface elements + /// generated by the engine appear in the appropriate language. + /// + /// A variable that receives the locale identifier for user-interface + /// elements displayed by the scripting engine + void IActiveScriptSite.GetLcid(out int lcid) + { + lcid = CultureInfo.CurrentCulture.LCID; } - private void InnerDispose() + /// + /// Allows the scripting engine to obtain information about an item added with the + /// IActiveScript.AddNamedItem method + /// + /// The name associated with the item, as specified in the + /// IActiveScript.AddNamedItem method + /// A bit mask specifying what information about the item should be + /// returned. The scripting engine should request the minimum amount of information possible + /// because some of the return parameters (for example, ITypeInfo) can take considerable + /// time to load or generate + /// A variable that receives a pointer to the IUnknown interface associated + /// with the given item. The scripting engine can use the IUnknown.QueryInterface method to + /// obtain the IDispatch interface for the item. This parameter receives null if mask + /// does not include the ScriptInfo.IUnknown value. Also, it receives null if there is no + /// object associated with the item name; this mechanism is used to create a simple class when + /// the named item was added with the ScriptItem.CodeOnly flag set in the + /// IActiveScript.AddNamedItem method. + /// A variable that receives a pointer to the ITypeInfo interface + /// associated with the item. This parameter receives null if mask does not include the + /// ScriptInfo.ITypeInfo value, or if type information is not available for this item. If type + /// information is not available, the object cannot source events, and name binding must be + /// realized with the IDispatch.GetIDsOfNames method. Note that the ITypeInfo interface + /// retrieved describes the item's coclass (TKIND_COCLASS) because the object may support + /// multiple interfaces and event interfaces. If the item supports the IProvideMultipleTypeInfo + /// interface, the ITypeInfo interface retrieved is the same as the index zero ITypeInfo that + /// would be obtained using the IProvideMultipleTypeInfo.GetInfoOfIndex method. + void IActiveScriptSite.GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr pUnkItem, ref IntPtr pTypeInfo) { - if (!_disposed) + object item = _hostItems[name]; + if (item == null) { - _disposed = true; - - if (_activeScriptSite != null) - { - _activeScriptSite.Dispose(); - _activeScriptSite = null; - } + throw new COMException( + string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); + } - if (_activeScript != null) - { - _activeScript.Close(); - _activeScript = null; - } + if (mask.HasFlag(ScriptInfoFlags.IUnknown)) + { + pUnkItem = Marshal.GetIDispatchForObject(item); + } - ComHelpers.ReleaseAndEmpty(ref _pActiveScript); + if (mask.HasFlag(ScriptInfoFlags.ITypeInfo)) + { + pTypeInfo = Marshal.GetITypeInfoForType(item.GetType()); } } + /// + /// Retrieves a host-defined string that uniquely identifies the current document version. If + /// the related document has changed outside the scope of Windows Script (as in the case of an + /// HTML page being edited with Notepad), the scripting engine can save this along with its + /// persisted state, forcing a recompile the next time the script is loaded. + /// + /// The host-defined document version string + void IActiveScriptSite.GetDocVersionString(out string version) + { + version = _documentVersion; + } + + /// + /// Informs the host that the script has completed execution + /// + /// A variable that contains the script result, or null if the script + /// produced no result + /// Contains exception information generated when the script + /// terminated, or null if no exception was generated + void IActiveScriptSite.OnScriptTerminate(object result, EXCEPINFO exceptionInfo) + { } + + /// + /// Informs the host that the scripting engine has changed states + /// + /// Indicates the new script state + void IActiveScriptSite.OnStateChange(ScriptState scriptState) + { } + + /// + /// Informs the host that an execution error occurred while the engine was running the script. + /// + /// A host can use this interface to obtain information about the + /// execution error + void IActiveScriptSite.OnScriptError(IActiveScriptError scriptError) + { + _lastException = ActiveScriptException.Create(scriptError); + } + + /// + /// Informs the host that the scripting engine has begun executing the script code + /// + void IActiveScriptSite.OnEnterScript() + { } + + /// + /// Informs the host that the scripting engine has returned from executing script code + /// + void IActiveScriptSite.OnLeaveScript() + { } + + #endregion + #region IInnerJsEngine implementation public string Mode @@ -357,7 +689,7 @@ public string Mode public object Evaluate(string expression) { - object result = InvokeScript(() => _activeScriptSite.ExecuteScriptText(expression, true)); + object result = InvokeScript(() => InnerExecute(expression, true)); result = MapToHostType(result); return result; @@ -367,19 +699,19 @@ public void Execute(string code) { InvokeScript(() => { - _activeScriptSite.ExecuteScriptText(code, false); + InnerExecute(code, false); }); } public object CallFunction(string functionName, params object[] args) { - var processedArgs = MapToScriptType(args); + object[] processedArgs = MapToScriptType(args); object result = InvokeScript(() => { try { - return _activeScriptSite.CallFunction(functionName, processedArgs); + return InnerCallFunction(functionName, processedArgs); } catch (MissingMemberException) { @@ -395,18 +727,33 @@ public object CallFunction(string functionName, params object[] args) public bool HasVariable(string variableName) { - var variableExist = InvokeScript(() => _activeScriptSite.HasProperty(variableName)); + bool result = InvokeScript(() => + { + bool variableExist; - return variableExist; + try + { + object variableValue = InnerGetVariableValue(variableName); + variableExist = variableValue != null; + } + catch (MissingMemberException) + { + variableExist = false; + } + + return variableExist; + }); + + return result; } public object GetVariableValue(string variableName) { - object variableValue = InvokeScript(() => + object result = InvokeScript(() => { try { - return _activeScriptSite.GetProperty(variableName); + return InnerGetVariableValue(variableName); } catch (MissingMemberException) { @@ -415,7 +762,7 @@ public object GetVariableValue(string variableName) } }); - object result = MapToHostType(variableValue); + result = MapToHostType(result); return result; } @@ -423,43 +770,34 @@ public object GetVariableValue(string variableName) public void SetVariableValue(string variableName, object value) { object processedValue = MapToScriptType(value); - - InvokeScript(() => _activeScriptSite.SetProperty(variableName, processedValue)); + InvokeScript(() => InnerSetVariableValue(variableName, processedValue)); } public void RemoveVariable(string variableName) - { - InvokeScript(() => _activeScriptSite.DeleteProperty(variableName)); - } - - public void EmbedHostObject(string itemName, object value) { InvokeScript(() => { - var processedValue = MapToScriptType(value); - object oldValue = _activeScriptSite.GetItem(itemName); - _activeScriptSite.SetItem(itemName, processedValue); + InnerSetVariableValue(variableName, null); - try + if (_hostItems.ContainsKey(variableName)) { - _activeScript.AddNamedItem(itemName, ScriptItemFlags.IsVisible | ScriptItemFlags.GlobalMembers); - } - catch (Exception) - { - if (oldValue != null) - { - _activeScriptSite.SetItem(itemName, oldValue); - } - else - { - _activeScriptSite.RemoveItem(itemName); - } - - throw; + _hostItems.Remove(variableName); } }); } + public void EmbedHostObject(string itemName, object value) + { + object processedValue = MapToScriptType(value); + EmbedHostItem(itemName, processedValue); + } + + public void EmbedHostType(string itemName, Type type) + { + var typeValue = new HostType(type, _engineMode); + EmbedHostItem(itemName, typeValue); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs deleted file mode 100644 index cb2e430..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptSiteWrapper.cs +++ /dev/null @@ -1,494 +0,0 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Collections.Generic; - using System.Globalization; - using System.Reflection; - using System.Runtime.InteropServices; - using System.Runtime.InteropServices.Expando; - - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; - - using Constants; - using Helpers; - using Resources; - - internal class ActiveScriptSiteWrapper : IActiveScriptSite, IDisposable - { - /// - /// Instance of native JavaScript engine - /// - private IActiveScript _activeScript; - - /// - /// Instance of ActiveScriptParseWrapper - /// - private IActiveScriptParseWrapper _activeScriptParse; - - /// - /// Instance of script dispatch - /// - private IExpando _dispatch; - - /// - /// List of site items - /// - private Dictionary _siteItems = new Dictionary(); - - /// - /// Synchronizer - /// - private readonly object _synchronizer = new object(); - - /// - /// Last ActiveScript exception - /// - private ActiveScriptException _lastException; - - /// - /// Flag that object is destroyed - /// - private bool _disposed; - - /// - /// Gets or sets a host-defined document version string - /// - public string DocumentVersion - { - get; - protected set; - } - - - /// - /// Constructs instance of - /// - /// Pointer to an instance of native JavaScript engine - /// Instance of native JavaScript engine - public ActiveScriptSiteWrapper(IntPtr pActiveScript, IActiveScript activeScript) - : this(pActiveScript, activeScript, DateTime.UtcNow.ToString("o")) - { } - - /// - /// Constructs instance of - /// - /// Pointer to an instance of native JavaScript engine - /// Instance of native JavaScript engine - /// Host-defined document version string - public ActiveScriptSiteWrapper(IntPtr pActiveScript, IActiveScript activeScript, - string documentVersion) - { - _activeScript = activeScript; - - _activeScriptParse = new ActiveScriptParseWrapper(pActiveScript, _activeScript); - _activeScriptParse.InitNew(); - - _activeScript.SetScriptSite(this); - _activeScript.SetScriptState(ScriptState.Started); - - InitScriptDispatch(); - - DocumentVersion = documentVersion; - } - - /// - /// Destructs instance of - /// - ~ActiveScriptSiteWrapper() - { - Dispose(false); - } - - - /// - /// Initializes a script dispatch - /// - private void InitScriptDispatch() - { - IExpando dispatch = null; - object obj; - - _activeScript.GetScriptDispatch(null, out obj); - - if (obj != null && obj.GetType().IsCOMObject) - { - dispatch = obj as IExpando; - } - - if (dispatch == null) - { - throw new InvalidOperationException(Strings.Runtime_ActiveScriptDispatcherNotInitialized); - } - - _dispatch = dispatch; - } - - /// - /// Allows the scripting engine to obtain information about an item added with the - /// IActiveScript.AddNamedItem method - /// - /// The name associated with the item, as specified in the - /// IActiveScript.AddNamedItem method - public object GetItem(string name) - { - lock (_synchronizer) - { - object result; - - return _siteItems.TryGetValue(name, out result) ? result : null; - } - } - - public void SetItem(string name, object value) - { - lock (_synchronizer) - { - _siteItems[name] = value; - } - } - - public void RemoveItem(string name) - { - lock (_synchronizer) - { - _siteItems.Remove(name); - } - } - - /// - /// Gets and resets a last exception. Returns null for none. - /// - private ActiveScriptException GetAndResetLastException() - { - var temp = _lastException; - _lastException = null; - - return temp; - } - - private void ThrowError() - { - var last = GetAndResetLastException(); - if (last != null) - { - throw last; - } - } - - /// - /// Executes a script text - /// - /// Script text - /// Flag that script text needs to run as an expression - /// Result of the execution - public object ExecuteScriptText(string code, bool isExpression) - { - object result; - - try - { - result = _activeScriptParse.ParseScriptText(code, null, null, null, IntPtr.Zero, - 0, isExpression ? ScriptTextFlags.IsExpression : ScriptTextFlags.IsVisible); - } - catch - { - ThrowError(); - throw; - } - - // Check for parse error - ThrowError(); - - return result; - } - - /// - /// Calls a function - /// - /// Function name - /// Function arguments - /// Result of the function execution - public object CallFunction(string functionName, params object[] args) - { - object result; - try - { - result = _dispatch.InvokeMember(functionName, BindingFlags.InvokeMethod, - null, _dispatch, args, null, CultureInfo.InvariantCulture, null); - } - catch - { - ThrowError(); - throw; - } - - return result; - } - - /// - /// Сhecks for the existence of a global object property - /// - /// Name of property - /// Result of check (true - exists; false - not exists) - public bool HasProperty(string propertyName) - { - bool propertyExist; - - try - { - object propertyValue = GetProperty(propertyName); - propertyExist = (propertyValue != null); - } - catch (MissingMemberException) - { - propertyExist = false; - } - catch - { - ThrowError(); - throw; - } - - return propertyExist; - } - - /// - /// Gets a value of global object property - /// - /// Name of property - /// Value of property - public object GetProperty(string propertyName) - { - object propertyValue; - - try - { - propertyValue = _dispatch.InvokeMember(propertyName, BindingFlags.GetProperty, - null, _dispatch, new object[0], null, - CultureInfo.InvariantCulture, null); - } - catch - { - ThrowError(); - throw; - } - - return propertyValue; - } - - /// - /// Sets a value to global object property - /// - /// Name of property - /// Value of property - public void SetProperty(string propertyName, object value) - { - var marshaledArgs = new[] { value }; - try - { - _dispatch.InvokeMember(propertyName, BindingFlags.SetProperty, null, _dispatch, - marshaledArgs, null, CultureInfo.InvariantCulture, null); - } - catch (MissingMemberException) - { - _dispatch.AddProperty(propertyName); - _dispatch.InvokeMember(propertyName, BindingFlags.SetProperty, null, _dispatch, - marshaledArgs, null, CultureInfo.InvariantCulture, null); - } - catch - { - ThrowError(); - throw; - } - } - - /// - /// Removes a global object property - /// - /// Name of property - public void DeleteProperty(string propertyName) - { - try - { - SetProperty(propertyName, null); - } - catch - { - ThrowError(); - throw; - } - } - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) - { - if (!_disposed) - { - _disposed = true; - - _lastException = null; - - lock (_synchronizer) - { - if (_siteItems != null) - { - _siteItems.Clear(); - _siteItems = null; - } - } - - if (_dispatch != null) - { - ComHelpers.ReleaseComObject(ref _dispatch, !disposing); - _dispatch = null; - } - - if (_activeScriptParse != null) - { - _activeScriptParse.Dispose(); - _activeScriptParse = null; - } - - _activeScript = null; - } - } - - #region IActiveScriptSite implementation - - /// - /// Retrieves the locale identifier associated with the host's user interface. The scripting - /// engine uses the identifier to ensure that error strings and other user-interface elements - /// generated by the engine appear in the appropriate language. - /// - /// A variable that receives the locale identifier for user-interface - /// elements displayed by the scripting engine - public void GetLcid(out int lcid) - { - lcid = CultureInfo.CurrentCulture.LCID; - } - - /// - /// Allows the scripting engine to obtain information about an item added with the - /// IActiveScript.AddNamedItem method - /// - /// The name associated with the item, as specified in the - /// IActiveScript.AddNamedItem method - /// A bit mask specifying what information about the item should be - /// returned. The scripting engine should request the minimum amount of information possible - /// because some of the return parameters (for example, ITypeInfo) can take considerable - /// time to load or generate - /// A variable that receives a pointer to the IUnknown interface associated - /// with the given item. The scripting engine can use the IUnknown.QueryInterface method to - /// obtain the IDispatch interface for the item. This parameter receives null if mask - /// does not include the ScriptInfo.IUnknown value. Also, it receives null if there is no - /// object associated with the item name; this mechanism is used to create a simple class when - /// the named item was added with the ScriptItem.CodeOnly flag set in the - /// IActiveScript.AddNamedItem method. - /// A variable that receives a pointer to the ITypeInfo interface - /// associated with the item. This parameter receives null if mask does not include the - /// ScriptInfo.ITypeInfo value, or if type information is not available for this item. If type - /// information is not available, the object cannot source events, and name binding must be - /// realized with the IDispatch.GetIDsOfNames method. Note that the ITypeInfo interface - /// retrieved describes the item's coclass (TKIND_COCLASS) because the object may support - /// multiple interfaces and event interfaces. If the item supports the IProvideMultipleTypeInfo - /// interface, the ITypeInfo interface retrieved is the same as the index zero ITypeInfo that - /// would be obtained using the IProvideMultipleTypeInfo.GetInfoOfIndex method. - public void GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr pUnkItem, ref IntPtr pTypeInfo) - { - object item = GetItem(name); - if (item == null) - { - throw new COMException( - string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); - } - - if (mask.HasFlag(ScriptInfoFlags.IUnknown)) - { - pUnkItem = Marshal.GetIDispatchForObject(item); - } - - if (mask.HasFlag(ScriptInfoFlags.ITypeInfo)) - { - pTypeInfo = Marshal.GetITypeInfoForType(item.GetType()); - } - } - - /// - /// Retrieves a host-defined string that uniquely identifies the current document version. If - /// the related document has changed outside the scope of Windows Script (as in the case of an - /// HTML page being edited with Notepad), the scripting engine can save this along with its - /// persisted state, forcing a recompile the next time the script is loaded. - /// - /// The host-defined document version string - public void GetDocVersionString(out string version) - { - version = DocumentVersion; - } - - /// - /// Informs the host that the script has completed execution - /// - /// A variable that contains the script result, or null if the script - /// produced no result - /// Contains exception information generated when the script - /// terminated, or null if no exception was generated - public virtual void OnScriptTerminate(object result, EXCEPINFO exceptionInfo) - { } - - /// - /// Informs the host that the scripting engine has changed states - /// - /// Indicates the new script state - public virtual void OnStateChange(ScriptState scriptState) - { } - - /// - /// Informs the host that an execution error occurred while the engine was running the script. - /// - /// A host can use this interface to obtain information about the - /// execution error - public void OnScriptError(IActiveScriptError scriptError) - { - _lastException = ActiveScriptException.Create(scriptError); - OnScriptError(_lastException); - } - - /// - /// Informs the host that an execution error occurred while the engine was running the script - /// - /// The exception - protected virtual void OnScriptError(ActiveScriptException exception) - { } - - /// - /// Informs the host that the scripting engine has begun executing the script code - /// - public virtual void OnEnterScript() - { } - - /// - /// Informs the host that the scripting engine has returned from executing script code - /// - public virtual void OnLeaveScript() - { } - - #endregion - - #region IDisposable implementation - - /// - /// Destroys object - /// - public void Dispose() - { - Dispose(true /* disposing */); - GC.SuppressFinalize(this); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs new file mode 100644 index 0000000..5415c70 --- /dev/null +++ b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.Constants +{ + /// + /// Special member names + /// + internal static class SpecialMemberName + { + public const string Default = "[DISPID=0]"; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs new file mode 100644 index 0000000..ad1970f --- /dev/null +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -0,0 +1,184 @@ +namespace MsieJavaScriptEngine +{ + using System; + using System.Globalization; + using System.Linq; + using System.Reflection; + + /// + /// Base class of item, that implements interface + /// + internal abstract class HostItemBase : IReflect + { + /// + /// Target type + /// + protected readonly Type _type; + + /// + /// Target object + /// + protected readonly object _target; + + /// + /// JavaScript engine mode + /// + protected readonly JsEngineMode _engineMode; + + /// + /// List of fields + /// + private readonly FieldInfo[] _fields; + + /// + /// List of properties + /// + private readonly PropertyInfo[] _properties; + + /// + /// List of methods + /// + private readonly MethodInfo[] _methods; + + /// + /// Gets a target object + /// + public object Target + { + get { return _target; } + } + + + /// + /// Constructs an instance of the wrapper for item, that implements interface + /// + /// Target type + /// Target object + /// JavaScript engine mode + /// Flag for whether to allow access to members of the instance + protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool instance) + { + _type = type; + _target = target; + _engineMode = engineMode; + + BindingFlags bindingFlags = BindingFlags.Public; + if (instance) + { + bindingFlags |= BindingFlags.Instance; + } + else + { + bindingFlags |= BindingFlags.Static; + } + + _fields = _type.GetFields(bindingFlags); + _properties = _type.GetProperties(bindingFlags); + _methods = _type.GetMethods(bindingFlags); + } + + + protected abstract object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters); + + protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + BindingFlags processedInvokeAttr = invokeAttr; + if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) + || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) + && !_properties.Any(p => p.Name == name) + && _fields.Any(p => p.Name == name)) + { + if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) + { + processedInvokeAttr &= ~BindingFlags.GetProperty; + processedInvokeAttr |= BindingFlags.GetField; + } + else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) + { + processedInvokeAttr &= ~BindingFlags.PutDispProperty; + processedInvokeAttr |= BindingFlags.SetField; + } + } + + object result = _type.InvokeMember(name, processedInvokeAttr, binder, target, + args, modifiers, culture, namedParameters); + + return result; + } + + #region IReflect implementation + + Type IReflect.UnderlyingSystemType + { + get { throw new NotImplementedException(); } + } + + + FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) + { + FieldInfo field = _fields.SingleOrDefault(f => f.Name == name); + + return field; + } + + FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) + { + return _fields; + } + + MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) + { + throw new NotImplementedException(); + } + + MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) + { + throw new NotImplementedException(); + } + + MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) + { + MethodInfo method = _methods.SingleOrDefault(m => m.Name == name); + + return method; + } + + MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException(); + } + + MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) + { + return _methods; + } + + PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) + { + return _properties; + } + + PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) + { + PropertyInfo property = _properties.SingleOrDefault(p => p.Name == name); + + return property; + } + + PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, + Type returnType, Type[] types, ParameterModifier[] modifiers) + { + throw new NotImplementedException(); + } + + object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + return InnerInvokeMember(name, invokeAttr, binder,target, args, modifiers, culture, namedParameters); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 44b8688..1c19248 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -5,172 +5,60 @@ using System.Linq; using System.Reflection; + using Constants; using Helpers; /// /// Wrapper for object, that implements interface /// - internal class HostObject : IReflect + internal sealed class HostObject : HostItemBase { - /// - /// Target object - /// - private readonly object _target; - - /// - /// Target type - /// - private readonly Type _type; - - /// - /// JavaScript engine mode - /// - private readonly JsEngineMode _engineMode; - - /// - /// List of fields - /// - private readonly FieldInfo[] _fields; - - /// - /// List of properties - /// - private readonly PropertyInfo[] _properties; - - /// - /// List of methods - /// - private readonly MethodInfo[] _methods; - - /// - /// Gets a target object - /// - public object Target - { - get { return _target; } - } - - /// /// Constructs an instance of the wrapper for object, that implements interface /// /// Target object /// JavaScript engine mode public HostObject(object target, JsEngineMode engineMode) - { - _target = target; - _type = target.GetType(); - _engineMode = engineMode; - - var defaultBindingFlags = BindingFlags.Instance | BindingFlags.Public; - _fields = _type.GetFields(defaultBindingFlags); - _properties = _type.GetProperties(defaultBindingFlags); - _methods = _type.GetMethods(defaultBindingFlags); - } - - #region IReflect implementation - - Type IReflect.UnderlyingSystemType - { - get { throw new NotImplementedException(); } - } + : base(target.GetType(), target, engineMode, true) + { } - FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) + private object InvokeDelegate(Delegate del, object[] args) { - FieldInfo field = _fields.SingleOrDefault(f => f.Name == name); - - return field; - } - - FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) - { - return _fields; - } - - MemberInfo[] IReflect.GetMember(string name, BindingFlags bindingAttr) - { - throw new NotImplementedException(); - } - - MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) - { - throw new NotImplementedException(); - } - - MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) - { - MethodInfo method = _methods.SingleOrDefault(m => m.Name == name); - - return method; - } - - MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) - { - throw new NotImplementedException(); - } + if (del == null) + { + throw new ArgumentNullException("del"); + } - MethodInfo[] IReflect.GetMethods(BindingFlags bindingAttr) - { - return _methods; - } + object[] processedArgs = args; - PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) - { - return _properties; - } + if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0) + { + processedArgs = processedArgs.Skip(1).ToArray(); + } - PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) - { - PropertyInfo property = _properties.SingleOrDefault(p => p.Name == name); + object result = del.DynamicInvoke(processedArgs); - return property; + return result; } - PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, - Type returnType, Type[] types, ParameterModifier[] modifiers) - { - throw new NotImplementedException(); - } + #region HostItemBase implementation - object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + protected override object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { object result; object processedTarget = TypeMappingHelpers.MapToHostType(target); object[] processedArgs = TypeMappingHelpers.MapToHostType(args); - var del = processedTarget as Delegate; - if (del != null) + if (name == SpecialMemberName.Default && processedTarget is Delegate) { - if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0) - { - processedArgs = processedArgs.Skip(1).ToArray(); - } - - result = del.DynamicInvoke(processedArgs); + var del = (Delegate)processedTarget; + result = InvokeDelegate(del, processedArgs); } else { - BindingFlags processedInvokeAttr = invokeAttr; - if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) - || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - && !_properties.Any(p => p.Name == name) - && _fields.Any(p => p.Name == name)) - { - if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) - { - processedInvokeAttr &= ~BindingFlags.GetProperty; - processedInvokeAttr |= BindingFlags.GetField; - } - else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - { - processedInvokeAttr &= ~BindingFlags.PutDispProperty; - processedInvokeAttr |= BindingFlags.SetField; - } - } - - result = _type.InvokeMember(name, processedInvokeAttr, binder, processedTarget, + result = InvokeStandardMember(name, invokeAttr, binder, processedTarget, processedArgs, modifiers, culture, namedParameters); } diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs new file mode 100644 index 0000000..4cdbf31 --- /dev/null +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -0,0 +1,54 @@ +namespace MsieJavaScriptEngine +{ + using System; + using System.Globalization; + using System.Linq; + using System.Reflection; + + using Constants; + using Helpers; + + /// + /// Wrapper for type, that implements interface + /// + internal sealed class HostType : HostItemBase + { + /// + /// Constructs an instance of the wrapper for type, that implements interface + /// + /// Target type + /// JavaScript engine mode + public HostType(Type type, JsEngineMode engineMode) + : base(type, null, engineMode, false) + { } + + + #region HostItemBase implementation + + protected override object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, + object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + { + object[] processedArgs = TypeMappingHelpers.MapToHostType(args); + object result; + + if (name == SpecialMemberName.Default && invokeAttr.HasFlag(BindingFlags.CreateInstance)) + { + if (_engineMode != JsEngineMode.Classic && processedArgs.Length > 0) + { + processedArgs = processedArgs.Skip(1).ToArray(); + } + + result = Activator.CreateInstance(_type, processedArgs); + } + else + { + result = InvokeStandardMember(name, invokeAttr, binder, target, + processedArgs, modifiers, culture, namedParameters); + } + + return TypeMappingHelpers.MapToScriptType(result, _engineMode); + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index 205494d..a733dc1 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -68,5 +68,16 @@ internal interface IInnerJsEngine : IDisposable /// The object to expose /// Allows to embed instances of simple classes (or structures) and delegates. void EmbedHostObject(string itemName, object value); + + /// + /// Embeds a host type to script code + /// + /// The name for the new global variable that will represent the type + /// The type to expose + /// + /// Host types are exposed to script code in the form of objects whose properties and + /// methods are bound to the type's static members. + /// + void EmbedHostType(string itemName, Type type); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index f0c17d9..ca92f4e 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -1,5 +1,7 @@ namespace MsieJavaScriptEngine.JsRt { + using System; + using Helpers; /// @@ -76,6 +78,8 @@ protected void StartDebugging() public abstract void EmbedHostObject(string itemName, object value); + public abstract void EmbedHostType(string itemName, Type type); + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index f014f31..a63bbb2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -507,6 +507,17 @@ public override void EmbedHostObject(string itemName, object value) }); } + public override void EmbedHostType(string itemName, Type type) + { + InvokeScript(() => + { + EdgeJsValue typeValue = EdgeJsValue.FromObject(new HostType(type, _engineMode)); + EdgeJsPropertyId itemId = EdgeJsPropertyId.FromString(itemName); + + EdgeJsValue.GlobalObject.SetProperty(itemId, typeValue, true); + }); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index f65ebae..1696b76 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -543,6 +543,17 @@ public override void EmbedHostObject(string itemName, object value) }); } + public override void EmbedHostType(string itemName, Type type) + { + InvokeScript(() => + { + IeJsValue typeValue = IeJsValue.FromObject(new HostType(type, _engineMode)); + IeJsPropertyId itemId = IeJsPropertyId.FromString(itemName); + + IeJsValue.GlobalObject.SetProperty(itemId, typeValue, true); + }); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 514cbf7..ad6c1b0 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -44,7 +44,6 @@ - @@ -67,12 +66,15 @@ + + + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 7102273..db1ce4e 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -658,7 +658,7 @@ public void EmbedHostObject(string itemName, object value) || itemType == typeof (Undefined)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_EmbeddedHostObjectTypeNotSupported, itemType.FullName)); + string.Format(Strings.Runtime_EmbeddedHostObjectTypeNotSupported, itemName, itemType.FullName)); } } else @@ -669,6 +669,48 @@ public void EmbedHostObject(string itemName, object value) _jsEngine.EmbedHostObject(itemName, value); } + /// + /// Embeds a host type to script code + /// + /// The name for the new global variable that will represent the type + /// The type to expose + /// + /// Host types are exposed to script code in the form of objects whose properties and + /// methods are bound to the type's static members. + /// + public void EmbedHostType(string itemName, Type type) + { + VerifyNotDisposed(); + + if (string.IsNullOrWhiteSpace(itemName)) + { + throw new ArgumentException( + string.Format(Strings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + } + + if (!ValidationHelpers.CheckNameFormat(itemName)) + { + throw new FormatException( + string.Format(Strings.Runtime_InvalidScriptItemNameFormat, itemName)); + } + + if (type != null) + { + if (ValidationHelpers.IsPrimitiveType(type) + || type == typeof(Undefined)) + { + throw new NotSupportedTypeException( + string.Format(Strings.Runtime_EmbeddedHostTypeNotSupported, type.FullName)); + } + } + else + { + throw new ArgumentNullException("type", string.Format(Strings.Common_ArgumentIsNull, "type")); + } + + _jsEngine.EmbedHostType(itemName, type); + } + #region IDisposable implementation /// diff --git a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs index d0b7699..e8a951e 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs @@ -234,6 +234,15 @@ internal static string Runtime_EmbeddedHostObjectTypeNotSupported { } } + /// + /// Looks up a localized string similar to The embedded host type `{0}` is not supported.. + /// + internal static string Runtime_EmbeddedHostTypeNotSupported { + get { + return ResourceManager.GetString("Runtime_EmbeddedHostTypeNotSupported", resourceCulture); + } + } + /// /// Looks up a localized string similar to The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language.. /// diff --git a/src/MsieJavaScriptEngine/Resources/Strings.resx b/src/MsieJavaScriptEngine/Resources/Strings.resx index a41d230..a9b9aca 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.resx @@ -177,6 +177,9 @@ See more details: The embedded host object '{0}' has a type `{1}`, which is not supported. + + The embedded host type `{0}` is not supported. + The function name '{0}' is forbidden, as is contained in the list of reserved words of JavaScript language. diff --git a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx index bde2624..cc53d1f 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx @@ -177,6 +177,9 @@ Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! + + Встраиваемый тип хоста `{0}` не поддерживается! + Имя функции "{0}" запрещено, т.к. входит в список зарезервированных слов JavaScript! diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs new file mode 100644 index 0000000..bbc5e6f --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs @@ -0,0 +1,16 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + using System; + using System.Text; + + public static class Base64Encoder + { + public const int DATA_URI_MAX = 32768; + + + public static string Encode(string value) + { + return Convert.ToBase64String(Encoding.Default.GetBytes(value)); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/BundleTable.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/BundleTable.cs new file mode 100644 index 0000000..2b7d887 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/BundleTable.cs @@ -0,0 +1,19 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public static class BundleTable + { + private static bool _enableOptimizations = true; + + public static bool EnableOptimizations + { + get + { + return _enableOptimizations; + } + set + { + _enableOptimizations = value; + } + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs index 73da9de..c6c4be4 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs @@ -1,5 +1,7 @@ namespace MsieJavaScriptEngine.Test.Common.Interop { + using System; + public struct Date { private static readonly int[] _cumulativeDays = { 0, 31, 59, 90, 120, 151, 181, @@ -9,6 +11,17 @@ public struct Date public int Month; public int Day; + public static Date Today + { + get + { + DateTime currentDateTime = DateTime.Today; + Date currentDate = new Date(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day); + + return currentDate; + } + } + public Date(int year, int month, int day) { diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs index 294a17c..c5d3862 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs @@ -24,5 +24,11 @@ public Person(string firstName, string lastName) FirstName = firstName; LastName = lastName; } + + + public override string ToString() + { + return string.Format("{{FirstName={0},LastName={1}}}", FirstName, LastName); + } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Point3D.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Point3D.cs new file mode 100644 index 0000000..ee76d89 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Point3D.cs @@ -0,0 +1,25 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public struct Point3D + { + public int X; + public int Y; + public int Z; + + public static readonly Point3D Empty = new Point3D(); + + + public Point3D(int x, int y, int z) + { + X = x; + Y = y; + Z = z; + } + + + public override string ToString() + { + return string.Format("{{X={0},Y={1},Z={2}}}", X, Y, Z); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/PredefinedStrings.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/PredefinedStrings.cs new file mode 100644 index 0000000..efca32e --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/PredefinedStrings.cs @@ -0,0 +1,9 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public struct PredefinedStrings + { + public const string VeryLongName = "Very Long Name"; + public const string AnotherVeryLongName = "Another Very Long Name"; + public const string TheLastVeryLongName = "The Last Very Long Name"; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs new file mode 100644 index 0000000..14d1ed4 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs @@ -0,0 +1,17 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public class SimpleSingleton + { + public static readonly SimpleSingleton Instance = new SimpleSingleton(); + + + private SimpleSingleton() + { } + + + public override string ToString() + { + return "[simple singleton]"; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index cdbae5c..8f57899 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -486,5 +486,486 @@ public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCo #endregion #endregion + + + #region Embedding of types + + #region Creating of instances + + [Test] + public virtual void CreatingAnInstanceOfEmbeddedBuiltinValueTypeIsCorrect() + { + // Arrange + Type pointType = typeof(Point); + + const string input = "(new Point()).ToString()"; + const string targetOutput = "{X=0,Y=0}"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Point", pointType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void CreatingAnInstanceOfEmbeddedBuiltinReferenceTypeIsCorrect() + { + // Arrange + Type uriType = typeof(Uri); + + const string input = @"var baseUri = new Uri('https://github.com'), + relativeUri = 'Taritsyn/MsieJavaScriptEngine' + ; + +(new Uri(baseUri, relativeUri)).ToString()"; + const string targetOutput = "https://github.com/Taritsyn/MsieJavaScriptEngine"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Uri", uriType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void CreatingAnInstanceOfEmbeddedCustomValueTypeIsCorrect() + { + // Arrange + Type point3DType = typeof(Point3D); + + const string input = "(new Point3D(2, 5, 14)).ToString()"; + const string targetOutput = "{X=2,Y=5,Z=14}"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Point3D", point3DType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void CreatingAnInstanceOfEmbeddedCustomReferenceTypeIsCorrect() + { + // Arrange + Type personType = typeof(Person); + + const string input = "(new Person('Vanya', 'Tutkin')).ToString()"; + const string targetOutput = "{FirstName=Vanya,LastName=Tutkin}"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Person", personType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Types with constants + + [Test] + public virtual void EmbeddingOfBuiltinReferenceTypeWithConstantsIsCorrect() + { + // Arrange + Type mathType = typeof(Math); + + const string input1 = "Math2.PI"; + const double targetOutput1 = 3.1415926535897931d; + + const string input2 = "Math2.E"; + const double targetOutput2 = 2.7182818284590451d; + + // Act + double output1; + double output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Math2", mathType); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + } + + [Test] + public virtual void EmbeddingOfCustomValueTypeWithConstantsIsCorrect() + { + // Arrange + Type predefinedStringsType = typeof(PredefinedStrings); + + const string input1 = "PredefinedStrings.VeryLongName"; + const string targetOutput1 = "Very Long Name"; + + const string input2 = "PredefinedStrings.AnotherVeryLongName"; + const string targetOutput2 = "Another Very Long Name"; + + const string input3 = "PredefinedStrings.TheLastVeryLongName"; + const string targetOutput3 = "The Last Very Long Name"; + + // Act + string output1; + string output2; + string output3; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("PredefinedStrings", predefinedStringsType); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + + [Test] + public virtual void EmbeddingOfCustomReferenceTypeWithConstantIsCorrect() + { + // Arrange + Type base64EncoderType = typeof(Base64Encoder); + + const string input = "Base64Encoder.DATA_URI_MAX"; + const int targetOutput = 32768; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Base64Encoder", base64EncoderType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Types with fields + + [Test] + public virtual void EmbeddingOfBuiltinValueTypeWithFieldIsCorrect() + { + // Arrange + Type guidType = typeof(Guid); + + const string input = "Guid.Empty.ToString()"; + const string targetOutput = "00000000-0000-0000-0000-000000000000"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Guid", guidType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfBuiltinReferenceTypeWithFieldIsCorrect() + { + // Arrange + Type bitConverterType = typeof(BitConverter); + + const string input = "BitConverter.IsLittleEndian"; + const bool targetOutput = true; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("BitConverter", bitConverterType); + output = (bool)jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfCustomValueTypeWithFieldIsCorrect() + { + // Arrange + Type point3DType = typeof(Point3D); + + const string input = "Point3D.Empty.ToString()"; + const string targetOutput = "{X=0,Y=0,Z=0}"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Point3D", point3DType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfCustomReferenceTypeWithFieldIsCorrect() + { + // Arrange + Type simpleSingletonType = typeof(SimpleSingleton); + + const string input = "SimpleSingleton.Instance.ToString()"; + const string targetOutput = "[simple singleton]"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("SimpleSingleton", simpleSingletonType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Types with properties + + [Test] + public virtual void EmbeddingOfBuiltinValueTypeWithPropertyIsCorrect() + { + // Arrange + Type colorType = typeof(Color); + + const string input = "Color.OrangeRed.ToString()"; + const string targetOutput = "Color [OrangeRed]"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Color", colorType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfBuiltinReferenceTypeWithPropertyIsCorrect() + { + // Arrange + Type environmentType = typeof(Environment); + + const string input = "Environment.NewLine"; + string[] targetOutput = { "\r", "\r\n", "\n", "\n\r" }; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Environment", environmentType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.IsTrue(targetOutput.Contains(output)); + } + + [Test] + public virtual void EmbeddingOfCustomValueTypeWithPropertyIsCorrect() + { + // Arrange + Type dateType = typeof(Date); + + const string initCode = "var currentDate = Date2.Today;"; + + const string inputYear = "currentDate.Year"; + const string inputMonth = "currentDate.Month"; + const string inputDay = "currentDate.Day"; + + DateTime targetOutput = DateTime.Today; + + // Act + DateTime output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Date2", dateType); + jsEngine.Execute(initCode); + + var outputYear = jsEngine.Evaluate(inputYear); + var outputMonth = jsEngine.Evaluate(inputMonth); + var outputDay = jsEngine.Evaluate(inputDay); + + output = new DateTime(outputYear, outputMonth, outputDay); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfCustomReferenceTypeWithPropertyIsCorrect() + { + // Arrange + Type bundleTableType = typeof(BundleTable); + const string updateCode = "BundleTable.EnableOptimizations = false;"; + + const string input = "BundleTable.EnableOptimizations"; + const bool targetOutput = false; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("BundleTable", bundleTableType); + jsEngine.Execute(updateCode); + + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #region Types with methods + + [Test] + public virtual void EmbeddingOfBuiltinValueTypeWithMethodIsCorrect() + { + // Arrange + Type dateTimeType = typeof(DateTime); + + const string input = "DateTime.DaysInMonth(2016, 2)"; + const int targetOutput = 29; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("DateTime", dateTimeType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfBuiltinReferenceTypeWithMethodIsCorrect() + { + // Arrange + Type mathType = typeof(Math); + + const string input = "Math2.Max(5.37, 5.56)"; + const double targetOutput = 5.56; + + // Act + double output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Math2", mathType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfCustomValueTypeWithMethodIsCorrect() + { + // Arrange + var dateType = typeof(Date); + + const string input = "Date2.IsLeapYear(2016)"; + const bool targetOutput = true; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Date2", dateType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void EmbeddingOfCustomReferenceTypeWithMethodIsCorrect() + { + // Arrange + Type base64EncoderType = typeof(Base64Encoder); + + const string input = "Base64Encoder.Encode('https://github.com/Taritsyn/MsieJavaScriptEngine')"; + const string targetOutput = "aHR0cHM6Ly9naXRodWIuY29tL1Rhcml0c3luL01zaWVKYXZhU2NyaXB0RW5naW5l"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Base64Encoder", base64EncoderType); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index b506e69..c724905 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -44,11 +44,16 @@ + + + + + From 37adffc676263679e3cb41d6e1715bcff6a62a15 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 26 Feb 2016 19:09:57 +0300 Subject: [PATCH 021/238] Version 1.7.0 Beta 1 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 5 ++--- NuGet/readme.txt | 8 ++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c08fca..93372ea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## February 26, 2016 - v1.7.0 Beta 1 + * Added the `EmbedHostType` method (embeds a host type to script code) + ## January 16, 2016 - v1.7.0 Alpha 2 * Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. * In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 135e8b8..b0b8ff8 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.0-alpha2 + 1.7.0-beta1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,8 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. -2. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`). + Added the `EmbedHostType` method (embeds a host type to script code). Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index d523cbf..093fa88 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.0 Alpha 2 + README file for MSIE JavaScript Engine for .NET v1.7.0 Beta 1 ---------------------------------------------------------------------- @@ -21,11 +21,7 @@ ============= RELEASE NOTES ============= - 1. Added a possibility to debug in Visual Studio by adding the - `debugger` statement to script code. This feature only works in the - `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. - 2. In JavaScript engine settings was added one new property - - `EnableDebugging` (default `false`). + Added the `EmbedHostType` method (embeds a host type to script code). ============ PROJECT SITE From d3fe4c50695162a208f4bd8e54fcc29e325be0fa Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 4 Mar 2016 18:24:55 +0300 Subject: [PATCH 022/238] Was made refactoring. --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 6 ++--- .../ActiveScript/ActiveScriptParseWrapper.cs | 8 +++---- .../InterlockedStatedFlag.cs | 20 ++++++++++++++++ .../JsRt/ChakraJsRtJsEngineBase.cs | 5 ++-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 6 ++--- .../JsRt/Edge/EdgeJsScope.cs | 11 ++++----- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 6 ++--- src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 11 ++++----- .../MsieJavaScriptEngine.csproj | 2 ++ src/MsieJavaScriptEngine/MsieJsEngine.cs | 8 +++---- src/MsieJavaScriptEngine/StatedFlag.cs | 24 +++++++++++++++++++ 11 files changed, 68 insertions(+), 39 deletions(-) create mode 100644 src/MsieJavaScriptEngine/InterlockedStatedFlag.cs create mode 100644 src/MsieJavaScriptEngine/StatedFlag.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index ee02f2e..c3006a8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -83,7 +83,7 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine, IActiveScript /// /// Flag that object is destroyed /// - private bool _disposed; + private StatedFlag _disposedFlag = new StatedFlag(); /// @@ -532,10 +532,8 @@ private void Dispose(bool disposing) { _dispatcher.Invoke(DispatcherPriority.Input, (Action)(() => { - if (!_disposed) + if (_disposedFlag.Set()) { - _disposed = true; - if (_dispatch != null) { ComHelpers.ReleaseComObject(ref _dispatch, !disposing); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs index d404e3f..b3f7ac6 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs @@ -42,7 +42,7 @@ internal sealed class ActiveScriptParseWrapper : IActiveScriptParseWrapper /// /// Flag that object is destroyed /// - private bool _disposed; + private StatedFlag _disposedFlag = new StatedFlag(); /// /// Gets a last COM exception @@ -81,7 +81,7 @@ public ActiveScriptParseWrapper(IntPtr pActiveScript, IActiveScript activeScript } /// - /// Destructs instance of + /// Destructs instance of /// ~ActiveScriptParseWrapper() { @@ -96,10 +96,8 @@ public ActiveScriptParseWrapper(IntPtr pActiveScript, IActiveScript activeScript /// managed objects contained in fields of class private void Dispose(bool disposing) { - if (!_disposed) + if (_disposedFlag.Set()) { - _disposed = true; - if (_is64Bit) { _activeScriptParse64 = null; diff --git a/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs b/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs new file mode 100644 index 0000000..8cdf01b --- /dev/null +++ b/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs @@ -0,0 +1,20 @@ +namespace MsieJavaScriptEngine +{ + using System.Threading; + + internal struct InterlockedStatedFlag + { + private int _counter; + + + public bool IsSet() + { + return _counter != 0; + } + + public bool Set() + { + return Interlocked.Exchange(ref _counter, 1) == 0; + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index ca92f4e..d724440 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -27,7 +27,7 @@ internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine /// /// Flag indicating whether debugging started /// - private bool _debuggingStarted; + private StatedFlag _debuggingStartedFlag; /// @@ -48,10 +48,9 @@ protected ChakraJsRtJsEngineBase(JsEngineMode engineMode, bool enableDebugging) /// protected void StartDebugging() { - if (!_debuggingStarted) + if (_debuggingStartedFlag.Set()) { InnerStartDebugging(); - _debuggingStarted = true; } } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index a63bbb2..2d95218 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -41,7 +41,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Flag that object is destroyed /// - private bool _disposed; + private StatedFlag _disposedFlag = new StatedFlag(); /// @@ -379,10 +379,8 @@ private void Dispose(bool disposing) { lock (_runSynchronizer) { - if (!_disposed) + if (_disposedFlag.Set()) { - _disposed = true; - _jsRuntime.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs index bfb5d86..16c9128 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs @@ -16,7 +16,7 @@ internal struct EdgeJsScope : IDisposable /// /// Whether the structure has been disposed /// - private bool _disposed; + private StatedFlag _disposedFlag; /// @@ -25,7 +25,7 @@ internal struct EdgeJsScope : IDisposable /// The context to create the scope for public EdgeJsScope(EdgeJsContext context) { - _disposed = false; + _disposedFlag = new StatedFlag(); _previousContext = EdgeJsContext.Current; EdgeJsContext.Current = context; } @@ -37,13 +37,10 @@ public EdgeJsScope(EdgeJsContext context) /// public void Dispose() { - if (_disposed) + if (_disposedFlag.Set()) { - return; + EdgeJsContext.Current = _previousContext; } - - EdgeJsContext.Current = _previousContext; - _disposed = true; } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 1696b76..9fcc60d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -46,7 +46,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Flag that object is destroyed /// - private bool _disposed; + private StatedFlag _disposedFlag = new StatedFlag(); /// @@ -415,10 +415,8 @@ private void Dispose(bool disposing) { lock (_runSynchronizer) { - if (!_disposed) + if (_disposedFlag.Set()) { - _disposed = true; - _jsRuntime.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs index 97f2ea6..756f2b2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs @@ -16,7 +16,7 @@ internal struct IeJsScope : IDisposable /// /// Whether the structure has been disposed /// - private bool _disposed; + private StatedFlag _disposedFlag; /// @@ -25,7 +25,7 @@ internal struct IeJsScope : IDisposable /// The context to create the scope for public IeJsScope(IeJsContext context) { - _disposed = false; + _disposedFlag = new StatedFlag(); _previousContext = IeJsContext.Current; IeJsContext.Current = context; } @@ -37,13 +37,10 @@ public IeJsScope(IeJsContext context) /// public void Dispose() { - if (_disposed) + if (_disposedFlag.Set()) { - return; + IeJsContext.Current = _previousContext; } - - IeJsContext.Current = _previousContext; - _disposed = true; } #endregion diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index ad6c1b0..0abd5f1 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -76,6 +76,7 @@ + @@ -142,6 +143,7 @@ True Strings.ru-ru.resx + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index db1ce4e..04c4766 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -34,7 +34,7 @@ public sealed class MsieJsEngine : IDisposable /// /// Flag that object is destroyed /// - private bool _disposed; + private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); /// /// Gets a name of JavaScript engine mode @@ -173,7 +173,7 @@ public MsieJsEngine(JsEngineSettings settings) private void VerifyNotDisposed() { - if (_disposed) + if (_disposedFlag.IsSet()) { throw new ObjectDisposedException(ToString()); } @@ -718,10 +718,8 @@ public void EmbedHostType(string itemName, Type type) /// public void Dispose() { - if (!_disposed) + if (_disposedFlag.Set()) { - _disposed = true; - if (_jsEngine != null) { _jsEngine.Dispose(); diff --git a/src/MsieJavaScriptEngine/StatedFlag.cs b/src/MsieJavaScriptEngine/StatedFlag.cs new file mode 100644 index 0000000..a90a429 --- /dev/null +++ b/src/MsieJavaScriptEngine/StatedFlag.cs @@ -0,0 +1,24 @@ +namespace MsieJavaScriptEngine +{ + internal struct StatedFlag + { + private bool _isSet; + + + public bool IsSet() + { + return _isSet; + } + + public bool Set() + { + if (!_isSet) + { + _isSet = true; + return true; + } + + return false; + } + } +} \ No newline at end of file From 9f3fdfd86aff32459c224644208bf7e855314d93 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 4 Mar 2016 18:54:36 +0300 Subject: [PATCH 023/238] Version 1.7.0 --- CHANGELOG.md | 7 +++++++ NuGet/MsieJavaScriptEngine.nuspec | 8 ++++++-- NuGet/readme.txt | 14 ++++++++++++-- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93372ea..cf0328f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Change log ========== +## March 4, 2016 - v1.7.0 + * Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code) + * Added the `EmbedHostType` method (embeds a host type to script code) + * Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. + * In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`) + * Improved implementation of the `CallFunction` method for Chakra JsRT modes + ## February 26, 2016 - v1.7.0 Beta 1 * Added the `EmbedHostType` method (embeds a host type to script code) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index b0b8ff8..06e1dbf 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.0-beta1 + 1.7.0 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,7 +12,11 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Added the `EmbedHostType` method (embeds a host type to script code). + 1. Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code); +2. Added the `EmbedHostType` method (embeds a host type to script code); +3. Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. +4. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`); +5. Improved implementation of the `CallFunction` method for Chakra JsRT modes. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 093fa88..e97fab6 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.0 Beta 1 + README file for MSIE JavaScript Engine for .NET v1.7.0 ---------------------------------------------------------------------- @@ -21,7 +21,17 @@ ============= RELEASE NOTES ============= - Added the `EmbedHostType` method (embeds a host type to script code). + 1. Added the `EmbedHostObject` method (embeds a instance of simple + class, structure or delegate to script code); + 2. Added the `EmbedHostType` method (embeds a host type to script + code); + 3. Added a possibility to debug in Visual Studio by adding the + `debugger` statement to script code. This feature only works in the + `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. + 4. In JavaScript engine settings was added one new property - + `EnableDebugging` (default `false`); + 5. Improved implementation of the `CallFunction` method for Chakra + JsRT modes. ============ PROJECT SITE From 2efce7453ff01a1d8680721917cf2060e11aeaf6 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 9 Mar 2016 18:16:39 +0300 Subject: [PATCH 024/238] README.md: Added description for the `EnableDebugging` property of JavaScript engine settings --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 3e92b07..c22a339 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,12 @@ Consider in detail properties of the + EnableDebugging + Boolean + false + Flag for whether to allow debugging in Visual Studio by adding the `debugger` statement to script code (only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes). + EngineMode JsEngineMode enumeration From 5a7d92709ded95ec027244093f4acd5f9fb1d2ac Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 23 May 2016 21:24:51 +0300 Subject: [PATCH 025/238] README.md: PowerShell.JS and Serenity Application Platform added to list of projects, that use the MSIE JavaScript Engine --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c22a339..7017e01 100644 --- a/README.md +++ b/README.md @@ -133,5 +133,7 @@ If you use the MSIE JavaScript Engine in some project, please send me a message * [Chevron](http://github.com/SimonCropp/Chevron) by Simon Cropp * [JavaScript Engine Switcher](http://github.com/Taritsyn/JavaScriptEngineSwitcher) by Andrey Taritsyn + * [PowerShell.JS](http://github.com/klumsy/powershellJS) by Karl Prosser + * [Serenity Application Platform](http://github.com/volkanceylan/Serenity) by Volkan Ceylan * [SquishIt](http://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Cuse * [Strike](http://github.com/SimonCropp/Strike) by Simon Cropp From 9869c403bbdb36ba77093bba33936431b68b5555 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 24 May 2016 13:13:33 +0300 Subject: [PATCH 026/238] JSON2 library was updated to version of May 10, 2016 --- .../Properties/AssemblyInfo.cs | 4 +- src/MsieJavaScriptEngine/Resources/json2.js | 507 +++++++++--------- 2 files changed, 249 insertions(+), 262 deletions(-) diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index dc94e48..5a0468c 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] +[assembly: AssemblyVersion("1.7.1.0")] +[assembly: AssemblyFileVersion("1.7.1.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js index 5838457..d4720c0 100644 --- a/src/MsieJavaScriptEngine/Resources/json2.js +++ b/src/MsieJavaScriptEngine/Resources/json2.js @@ -1,158 +1,143 @@ -/* - json2.js - 2015-05-03 - - Public Domain. - - NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. - - See http://www.JSON.org/js.html - - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. - - - This file creates a global JSON object containing two methods: stringify - and parse. This file is provides the ES5 JSON capability to ES3 systems. - If a project might run on IE8 or earlier, then this file should be included. - This file does nothing on ES5 systems. - - JSON.stringify(value, replacer, space) - value any JavaScript value, usually an object or array. - - replacer an optional parameter that determines how object - values are stringified for objects. It can be a - function or an array of strings. - - space an optional parameter that specifies the indentation - of nested structures. If it is omitted, the text will - be packed without extra whitespace. If it is a number, - it will specify the number of spaces to indent at each - level. If it is a string (such as '\t' or ' '), - it contains the characters used to indent at each level. - - This method produces a JSON text from a JavaScript value. - - When an object value is found, if the object contains a toJSON - method, its toJSON method will be called and the result will be - stringified. A toJSON method does not serialize: it returns the - value represented by the name/value pair that should be serialized, - or undefined if nothing should be serialized. The toJSON method - will be passed the key associated with the value, and this will be - bound to the value - - For example, this would serialize Dates as ISO strings. - - Date.prototype.toJSON = function (key) { - function f(n) { - // Format integers to have at least two digits. - return n < 10 - ? '0' + n - : n; - } - - return this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z'; - }; - - You can provide an optional replacer method. It will be passed the - key and value of each member, with this bound to the containing - object. The value that is returned from your method will be - serialized. If your method returns undefined, then the member will - be excluded from the serialization. - - If the replacer parameter is an array of strings, then it will be - used to select the members to be serialized. It filters the results - such that only members with keys listed in the replacer array are - stringified. - - Values that do not have JSON representations, such as undefined or - functions, will not be serialized. Such values in objects will be - dropped; in arrays they will be replaced with null. You can use - a replacer function to replace those with JSON values. - JSON.stringify(undefined) returns undefined. - - The optional space parameter produces a stringification of the - value that is filled with line breaks and indentation to make it - easier to read. - - If the space parameter is a non-empty string, then that string will - be used for indentation. If the space parameter is a number, then - the indentation will be that many spaces. - - Example: - - text = JSON.stringify(['e', {pluribus: 'unum'}]); - // text is '["e",{"pluribus":"unum"}]' - - - text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); - // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' - - text = JSON.stringify([new Date()], function (key, value) { - return this[key] instanceof Date - ? 'Date(' + this[key] + ')' - : value; - }); - // text is '["Date(---current time---)"]' - - - JSON.parse(text, reviver) - This method parses a JSON text to produce an object or array. - It can throw a SyntaxError exception. - - The optional reviver parameter is a function that can filter and - transform the results. It receives each of the keys and values, - and its return value is used instead of the original value. - If it returns what it received, then the structure is not modified. - If it returns undefined then the member is deleted. - - Example: - - // Parse the text. Values that look like ISO date strings will - // be converted to Date objects. - - myData = JSON.parse(text, function (key, value) { - var a; - if (typeof value === 'string') { - a = -/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); - if (a) { - return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], - +a[5], +a[6])); - } - } - return value; - }); - - myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { - var d; - if (typeof value === 'string' && - value.slice(0, 5) === 'Date(' && - value.slice(-1) === ')') { - d = new Date(value.slice(5, -1)); - if (d) { - return d; - } - } - return value; - }); - - - This is a reference implementation. You are free to copy, modify, or - redistribute. -*/ - -/*jslint - eval, for, this +// json2.js +// 2016-05-01 +// Public Domain. +// NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. +// See http://www.JSON.org/js.html +// This code should be minified before deployment. +// See http://javascript.crockford.com/jsmin.html + +// USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO +// NOT CONTROL. + +// This file creates a global JSON object containing two methods: stringify +// and parse. This file is provides the ES5 JSON capability to ES3 systems. +// If a project might run on IE8 or earlier, then this file should be included. +// This file does nothing on ES5 systems. + +// JSON.stringify(value, replacer, space) +// value any JavaScript value, usually an object or array. +// replacer an optional parameter that determines how object +// values are stringified for objects. It can be a +// function or an array of strings. +// space an optional parameter that specifies the indentation +// of nested structures. If it is omitted, the text will +// be packed without extra whitespace. If it is a number, +// it will specify the number of spaces to indent at each +// level. If it is a string (such as "\t" or " "), +// it contains the characters used to indent at each level. +// This method produces a JSON text from a JavaScript value. +// When an object value is found, if the object contains a toJSON +// method, its toJSON method will be called and the result will be +// stringified. A toJSON method does not serialize: it returns the +// value represented by the name/value pair that should be serialized, +// or undefined if nothing should be serialized. The toJSON method +// will be passed the key associated with the value, and this will be +// bound to the value. + +// For example, this would serialize Dates as ISO strings. + +// Date.prototype.toJSON = function (key) { +// function f(n) { +// // Format integers to have at least two digits. +// return (n < 10) +// ? "0" + n +// : n; +// } +// return this.getUTCFullYear() + "-" + +// f(this.getUTCMonth() + 1) + "-" + +// f(this.getUTCDate()) + "T" + +// f(this.getUTCHours()) + ":" + +// f(this.getUTCMinutes()) + ":" + +// f(this.getUTCSeconds()) + "Z"; +// }; + +// You can provide an optional replacer method. It will be passed the +// key and value of each member, with this bound to the containing +// object. The value that is returned from your method will be +// serialized. If your method returns undefined, then the member will +// be excluded from the serialization. + +// If the replacer parameter is an array of strings, then it will be +// used to select the members to be serialized. It filters the results +// such that only members with keys listed in the replacer array are +// stringified. + +// Values that do not have JSON representations, such as undefined or +// functions, will not be serialized. Such values in objects will be +// dropped; in arrays they will be replaced with null. You can use +// a replacer function to replace those with JSON values. + +// JSON.stringify(undefined) returns undefined. + +// The optional space parameter produces a stringification of the +// value that is filled with line breaks and indentation to make it +// easier to read. + +// If the space parameter is a non-empty string, then that string will +// be used for indentation. If the space parameter is a number, then +// the indentation will be that many spaces. + +// Example: + +// text = JSON.stringify(["e", {pluribus: "unum"}]); +// // text is '["e",{"pluribus":"unum"}]' + +// text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t"); +// // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + +// text = JSON.stringify([new Date()], function (key, value) { +// return this[key] instanceof Date +// ? "Date(" + this[key] + ")" +// : value; +// }); +// // text is '["Date(---current time---)"]' + +// JSON.parse(text, reviver) +// This method parses a JSON text to produce an object or array. +// It can throw a SyntaxError exception. + +// The optional reviver parameter is a function that can filter and +// transform the results. It receives each of the keys and values, +// and its return value is used instead of the original value. +// If it returns what it received, then the structure is not modified. +// If it returns undefined then the member is deleted. + +// Example: + +// // Parse the text. Values that look like ISO date strings will +// // be converted to Date objects. + +// myData = JSON.parse(text, function (key, value) { +// var a; +// if (typeof value === "string") { +// a = +// /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); +// if (a) { +// return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +// +a[5], +a[6])); +// } +// } +// return value; +// }); + +// myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { +// var d; +// if (typeof value === "string" && +// value.slice(0, 5) === "Date(" && +// value.slice(-1) === ")") { +// d = new Date(value.slice(5, -1)); +// if (d) { +// return d; +// } +// } +// return value; +// }); + +// This is a reference implementation. You are free to copy, modify, or +// redistribute. + +/*jslint + eval, for, this */ /*property @@ -166,42 +151,42 @@ // Create a JSON object only if one does not already exist. We create the // methods in a closure to avoid creating global variables. -if (typeof JSON !== 'object') { +if (typeof JSON !== "object") { JSON = {}; } (function () { - 'use strict'; - - var rx_one = /^[\],:{}\s]*$/, - rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rx_four = /(?:^|:|,)(?:\s*\[)+/g, - rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + "use strict"; + + var rx_one = /^[\],:{}\s]*$/; + var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; + var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; + var rx_four = /(?:^|:|,)(?:\s*\[)+/g; + var rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; function f(n) { // Format integers to have at least two digits. - return n < 10 - ? '0' + n + return n < 10 + ? "0" + n : n; } - + function this_value() { return this.valueOf(); } - if (typeof Date.prototype.toJSON !== 'function') { + if (typeof Date.prototype.toJSON !== "function") { Date.prototype.toJSON = function () { return isFinite(this.valueOf()) - ? this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' + ? this.getUTCFullYear() + "-" + + f(this.getUTCMonth() + 1) + "-" + + f(this.getUTCDate()) + "T" + + f(this.getUTCHours()) + ":" + + f(this.getUTCMinutes()) + ":" + + f(this.getUTCSeconds()) + "Z" : null; }; @@ -210,10 +195,10 @@ if (typeof JSON !== 'object') { String.prototype.toJSON = this_value; } - var gap, - indent, - meta, - rep; + var gap; + var indent; + var meta; + var rep; function quote(string) { @@ -224,14 +209,14 @@ if (typeof JSON !== 'object') { // sequences. rx_escapable.lastIndex = 0; - return rx_escapable.test(string) - ? '"' + string.replace(rx_escapable, function (a) { + return rx_escapable.test(string) + ? "\"" + string.replace(rx_escapable, function (a) { var c = meta[a]; - return typeof c === 'string' + return typeof c === "string" ? c - : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' - : '"' + string + '"'; + : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + }) + "\"" + : "\"" + string + "\""; } @@ -239,61 +224,61 @@ if (typeof JSON !== 'object') { // Produce a string from holder[key]. - var i, // The loop counter. - k, // The member key. - v, // The member value. - length, - mind = gap, - partial, - value = holder[key]; + var i; // The loop counter. + var k; // The member key. + var v; // The member value. + var length; + var mind = gap; + var partial; + var value = holder[key]; // If the value has a toJSON method, call it to obtain a replacement value. - if (value && typeof value === 'object' && - typeof value.toJSON === 'function') { + if (value && typeof value === "object" && + typeof value.toJSON === "function") { value = value.toJSON(key); } // If we were called with a replacer function, then call the replacer to // obtain a replacement value. - if (typeof rep === 'function') { + if (typeof rep === "function") { value = rep.call(holder, key, value); } // What happens next depends on the value's type. switch (typeof value) { - case 'string': + case "string": return quote(value); - case 'number': + case "number": // JSON numbers must be finite. Encode non-finite numbers as null. - return isFinite(value) - ? String(value) - : 'null'; + return isFinite(value) + ? String(value) + : "null"; - case 'boolean': - case 'null': + case "boolean": + case "null": // If the value is a boolean or null, convert it to a string. Note: -// typeof null does not produce 'null'. The case is included here in +// typeof null does not produce "null". The case is included here in // the remote chance that this gets fixed someday. return String(value); -// If the type is 'object', we might be dealing with an object or an array or +// If the type is "object", we might be dealing with an object or an array or // null. - case 'object': + case "object": -// Due to a specification blunder in ECMAScript, typeof null is 'object', +// Due to a specification blunder in ECMAScript, typeof null is "object", // so watch out for that case. if (!value) { - return 'null'; + return "null"; } // Make an array to hold the partial results of stringifying this object value. @@ -303,41 +288,41 @@ if (typeof JSON !== 'object') { // Is the value an array? - if (Object.prototype.toString.apply(value) === '[object Array]') { + if (Object.prototype.toString.apply(value) === "[object Array]") { // The value is an array. Stringify every element. Use null as a placeholder // for non-JSON values. length = value.length; for (i = 0; i < length; i += 1) { - partial[i] = str(i, value) || 'null'; + partial[i] = str(i, value) || "null"; } // Join all of the elements together, separated with commas, and wrap them in // brackets. v = partial.length === 0 - ? '[]' + ? "[]" : gap - ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' - : '[' + partial.join(',') + ']'; + ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" + : "[" + partial.join(",") + "]"; gap = mind; return v; } // If the replacer is an array, use it to select the members to be stringified. - if (rep && typeof rep === 'object') { + if (rep && typeof rep === "object") { length = rep.length; for (i = 0; i < length; i += 1) { - if (typeof rep[i] === 'string') { + if (typeof rep[i] === "string") { k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + ( - gap - ? ': ' - : ':' + gap + ? ": " + : ":" ) + v); } } @@ -351,9 +336,9 @@ if (typeof JSON !== 'object') { v = str(k, value); if (v) { partial.push(quote(k) + ( - gap - ? ': ' - : ':' + gap + ? ": " + : ":" ) + v); } } @@ -364,10 +349,10 @@ if (typeof JSON !== 'object') { // and wrap them in braces. v = partial.length === 0 - ? '{}' + ? "{}" : gap - ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' - : '{' + partial.join(',') + '}'; + ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}" + : "{" + partial.join(",") + "}"; gap = mind; return v; } @@ -375,15 +360,15 @@ if (typeof JSON !== 'object') { // If the JSON object does not yet have a stringify method, give it one. - if (typeof JSON.stringify !== 'function') { + if (typeof JSON.stringify !== "function") { meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"': '\\"', - '\\': '\\\\' + "\b": "\\b", + "\t": "\\t", + "\n": "\\n", + "\f": "\\f", + "\r": "\\r", + "\"": "\\\"", + "\\": "\\\\" }; JSON.stringify = function (value, replacer, space) { @@ -394,20 +379,20 @@ if (typeof JSON !== 'object') { // produce text that is more easily readable. var i; - gap = ''; - indent = ''; + gap = ""; + indent = ""; // If the space parameter is a number, make an indent string containing that // many spaces. - if (typeof space === 'number') { + if (typeof space === "number") { for (i = 0; i < space; i += 1) { - indent += ' '; + indent += " "; } // If the space parameter is a string, it will be used as the indent string. - } else if (typeof space === 'string') { + } else if (typeof space === "string") { indent = space; } @@ -415,23 +400,23 @@ if (typeof JSON !== 'object') { // Otherwise, throw an error. rep = replacer; - if (replacer && typeof replacer !== 'function' && - (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { - throw new Error('JSON.stringify'); + if (replacer && typeof replacer !== "function" && + (typeof replacer !== "object" || + typeof replacer.length !== "number")) { + throw new Error("JSON.stringify"); } -// Make a fake root object containing our value under the key of ''. +// Make a fake root object containing our value under the key of "". // Return the result of stringifying the value. - return str('', {'': value}); + return str("", {"": value}); }; } // If the JSON object does not yet have a parse method, give it one. - if (typeof JSON.parse !== 'function') { + if (typeof JSON.parse !== "function") { JSON.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns @@ -444,8 +429,10 @@ if (typeof JSON !== 'object') { // The walk method is used to recursively walk the resulting structure so // that modifications can be made. - var k, v, value = holder[key]; - if (value && typeof value === 'object') { + var k; + var v; + var value = holder[key]; + if (value && typeof value === "object") { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); @@ -469,51 +456,51 @@ if (typeof JSON !== 'object') { rx_dangerous.lastIndex = 0; if (rx_dangerous.test(text)) { text = text.replace(rx_dangerous, function (a) { - return '\\u' + - ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + return "\\u" + + ("0000" + a.charCodeAt(0).toString(16)).slice(-4); }); } // In the second stage, we run the text against regular expressions that look -// for non-JSON patterns. We are especially concerned with '()' and 'new' -// because they can cause invocation, and '=' because it can cause mutation. +// for non-JSON patterns. We are especially concerned with "()" and "new" +// because they can cause invocation, and "=" because it can cause mutation. // But just to be safe, we want to reject all unexpected forms. // We split the second stage into 4 regexp operations in order to work around // crippling inefficiencies in IE's and Safari's regexp engines. First we -// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we -// replace all simple value tokens with ']' characters. Third, we delete all +// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we +// replace all simple value tokens with "]" characters. Third, we delete all // open brackets that follow a colon or comma or that begin the text. Finally, -// we look to see that the remaining characters are only whitespace or ']' or -// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. +// we look to see that the remaining characters are only whitespace or "]" or +// "," or ":" or "{" or "}". If that is so, then the text is safe for eval. if ( rx_one.test( text - .replace(rx_two, '@') - .replace(rx_three, ']') - .replace(rx_four, '') + .replace(rx_two, "@") + .replace(rx_three, "]") + .replace(rx_four, "") ) ) { // In the third stage we use the eval function to compile the text into a -// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// JavaScript structure. The "{" operator is subject to a syntactic ambiguity // in JavaScript: it can begin a block or an object literal. We wrap the text // in parens to eliminate the ambiguity. - j = eval('(' + text + ')'); + j = eval("(" + text + ")"); // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. - return typeof reviver === 'function' - ? walk({'': j}, '') + return (typeof reviver === "function") + ? walk({"": j}, "") : j; } // If the text is not JSON parseable, then a SyntaxError is thrown. - throw new SyntaxError('JSON.parse'); + throw new SyntaxError("JSON.parse"); }; } }()); From c946b39df88d22d0ea4eaea5e8509c220db3363d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 24 May 2016 14:04:30 +0300 Subject: [PATCH 027/238] Version 1.7.1 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 12 ++++-------- NuGet/readme.txt | 14 ++------------ 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf0328f..da0cfa2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## May 24, 2016 - v1.7.1 + * JSON2 library was updated to version of May 10, 2016 + ## March 4, 2016 - v1.7.0 * Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code) * Added the `EmbedHostType` method (embeds a host type to script code) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 06e1dbf..960d964 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.0 + 1.7.1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,11 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added the `EmbedHostObject` method (embeds a instance of simple class, structure or delegate to script code); -2. Added the `EmbedHostType` method (embeds a host type to script code); -3. Added a possibility to debug in Visual Studio by adding the `debugger` statement to script code. This feature only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. -4. In JavaScript engine settings was added one new property - `EnableDebugging` (default `false`); -5. Improved implementation of the `CallFunction` method for Chakra JsRT modes. + JSON2 library was updated to version of May 10, 2016. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra @@ -25,8 +21,8 @@ - - + + diff --git a/NuGet/readme.txt b/NuGet/readme.txt index e97fab6..dffef8f 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.0 + README file for MSIE JavaScript Engine for .NET v1.7.1 ---------------------------------------------------------------------- @@ -21,17 +21,7 @@ ============= RELEASE NOTES ============= - 1. Added the `EmbedHostObject` method (embeds a instance of simple - class, structure or delegate to script code); - 2. Added the `EmbedHostType` method (embeds a host type to script - code); - 3. Added a possibility to debug in Visual Studio by adding the - `debugger` statement to script code. This feature only works in the - `ChakraIeJsRt` and `ChakraEdgeJsRt` modes. - 4. In JavaScript engine settings was added one new property - - `EnableDebugging` (default `false`); - 5. Improved implementation of the `CallFunction` method for Chakra - JsRT modes. + JSON2 library was updated to version of May 10, 2016. ============ PROJECT SITE From 2130b58b87d432117570a219eb3b62a6acde78b4 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 17 Aug 2016 18:58:29 +0300 Subject: [PATCH 028/238] An attempt was made to prevent occurrence of the access violation exception in the `CallFunction` method --- NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 3 ++- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 10 +++++++--- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 10 +++++++--- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 4 ++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 960d964..4d955a9 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - JSON2 library was updated to version of May 10, 2016. + An attempt was made to prevent occurrence of the access violation exception in the `CallFunction` method. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index dffef8f..17860e1 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - JSON2 library was updated to version of May 10, 2016. + An attempt was made to prevent occurrence of the access violation + exception in the `CallFunction` method. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 2d95218..a430dd8 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -424,12 +424,16 @@ public override object CallFunction(string functionName, params object[] args) string.Format(Strings.Runtime_FunctionNotExist, functionName)); } - var processedArgs = MapToScriptType(args); - var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - + EdgeJsValue[] processedArgs = MapToScriptType(args); EdgeJsValue functionValue = globalObj.GetProperty(functionId); + + globalObj.AddRef(); + + EdgeJsValue[] allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); EdgeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + globalObj.Release(); + return MapToHostType(resultValue); }); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 9fcc60d..1361121 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -460,12 +460,16 @@ public override object CallFunction(string functionName, params object[] args) string.Format(Strings.Runtime_FunctionNotExist, functionName)); } - var processedArgs = MapToScriptType(args); - var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - + IeJsValue[] processedArgs = MapToScriptType(args); IeJsValue functionValue = globalObj.GetProperty(functionId); + + globalObj.AddRef(); + + IeJsValue[] allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); IeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + globalObj.Release(); + return MapToHostType(resultValue); }); diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 5a0468c..37b22c8 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.7.1.0")] -[assembly: AssemblyFileVersion("1.7.1.0")] +[assembly: AssemblyVersion("1.7.2.0")] +[assembly: AssemblyFileVersion("1.7.2.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file From 671da2a43fd05a0085f55fe19742791195d5a00c Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 17 Aug 2016 19:32:18 +0300 Subject: [PATCH 029/238] Version 1.7.2 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da0cfa2..057e837 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## August 17, 2016 - v1.7.2 + * An attempt was made to prevent occurrence of the access violation exception in the `CallFunction` method + ## May 24, 2016 - v1.7.1 * JSON2 library was updated to version of May 10, 2016 diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 4d955a9..60038c4 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.1 + 1.7.2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 17860e1..cd12de2 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.1 + README file for MSIE JavaScript Engine for .NET v1.7.2 ---------------------------------------------------------------------- From eff1a09b0c4850d41468fdead65969b992a38b68 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 24 Aug 2016 20:14:57 +0300 Subject: [PATCH 030/238] Added support of NUnit version 3.4.1 --- .../MsieJavaScriptEngine.Test.Auto.csproj | 8 +++++--- test/MsieJavaScriptEngine.Test.Auto/packages.config | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 8 +++++--- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 8 +++++--- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 8 +++++--- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 8 +++++--- test/MsieJavaScriptEngine.Test.Classic/packages.config | 2 +- test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 8 +++++--- test/MsieJavaScriptEngine.Test.Common/packages.config | 2 +- test/MsieJavaScriptEngine.Test.nunit | 4 ++-- 14 files changed, 39 insertions(+), 27 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 5fb2f25..ebae1ac 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.Auto MsieJavaScriptEngine.Test.Auto - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Auto/packages.config b/test/MsieJavaScriptEngine.Test.Auto/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/packages.config +++ b/test/MsieJavaScriptEngine.Test.Auto/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 52f8f64..56dc63f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.ChakraActiveScript MsieJavaScriptEngine.Test.ChakraActiveScript - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index bc7ae77..54725f3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.ChakraEdgeJsRt MsieJavaScriptEngine.Test.ChakraEdgeJsRt - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index d1a6d53..a11f6a0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.ChakraIeJsRt MsieJavaScriptEngine.Test.ChakraIeJsRt - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index ac8ffed..f94739d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.Classic MsieJavaScriptEngine.Test.Classic - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Classic/packages.config b/test/MsieJavaScriptEngine.Test.Classic/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/packages.config +++ b/test/MsieJavaScriptEngine.Test.Classic/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 8f57899..0daea51 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -384,7 +384,7 @@ public virtual void EmbeddingOfInstanceOfDelegateWithoutParametersIsCorrect() } // Assert - Assert.IsNotNullOrEmpty(output); + Assert.That(output, Is.Not.Null.Or.Empty); Assert.IsTrue(output.Length == targetOutputLength); } diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c724905..07475e2 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -9,7 +9,7 @@ Properties MsieJavaScriptEngine.Test.Common MsieJavaScriptEngine.Test.Common - v4.0 + v4.5 512 ..\..\ true @@ -22,6 +22,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -30,10 +31,11 @@ TRACE prompt 4 + false - - ..\..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Common/packages.config b/test/MsieJavaScriptEngine.Test.Common/packages.config index 512ce05..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/packages.config +++ b/test/MsieJavaScriptEngine.Test.Common/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.nunit b/test/MsieJavaScriptEngine.Test.nunit index 0cb3fcb..0af6bb7 100644 --- a/test/MsieJavaScriptEngine.Test.nunit +++ b/test/MsieJavaScriptEngine.Test.nunit @@ -1,6 +1,6 @@  - + @@ -8,7 +8,7 @@ - + From 17c10857e70e5b22c639fea5e2f743cda725db98 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 24 Aug 2016 21:30:50 +0300 Subject: [PATCH 031/238] Was made refactoring --- .../ActiveScript/ActiveScriptException.cs | 10 ++--- .../ActiveScript/ActiveScriptJsEngineBase.cs | 32 +++++++------- .../ActiveScript/ActiveScriptParseWrapper.cs | 12 ++--- .../ChakraActiveScriptJsEngine.cs | 2 - .../ClassicActiveScriptJsEngine.cs | 2 - .../ActiveScript/IActiveScript.cs | 10 ++--- .../ActiveScript/IActiveScriptError.cs | 8 ++-- .../ActiveScript/IActiveScriptParse32.cs | 10 ++--- .../ActiveScript/IActiveScriptParse64.cs | 10 ++--- .../ActiveScript/IActiveScriptParseWrapper.cs | 8 ++-- .../ActiveScript/IActiveScriptProperty.cs | 8 ++-- .../ActiveScript/IActiveScriptSite.cs | 10 ++--- .../ActiveScript/ScriptInfoFlags.cs | 6 +-- .../ActiveScript/ScriptInterruptFlags.cs | 6 +-- .../ActiveScript/ScriptItemFlags.cs | 6 +-- .../ActiveScript/ScriptTextFlags.cs | 6 +-- .../ActiveScript/ScriptTypeLibFlags.cs | 6 +-- .../Helpers/ComHelpers.cs | 8 ++-- .../Helpers/JsEngineModeHelpers.cs | 6 +-- .../Helpers/JsErrorHelpers.cs | 14 +++--- .../Helpers/TypeMappingHelpers.cs | 10 ++--- .../Helpers/ValidationHelpers.cs | 12 ++--- src/MsieJavaScriptEngine/HostItemBase.cs | 12 ++--- src/MsieJavaScriptEngine/HostObject.cs | 16 +++---- src/MsieJavaScriptEngine/HostType.cs | 16 +++---- src/MsieJavaScriptEngine/IInnerJsEngine.cs | 6 +-- .../InterlockedStatedFlag.cs | 6 +-- .../JsEngineLoadException.cs | 6 +-- src/MsieJavaScriptEngine/JsException.cs | 6 +-- .../JsRt/ChakraJsRtJsEngineBase.cs | 8 ++-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 16 +++---- .../JsRt/Edge/EdgeJsContext.cs | 8 ++-- .../JsRt/Edge/EdgeJsNativeFunction.cs | 8 ++-- .../JsRt/Edge/EdgeJsPropertyId.cs | 8 ++-- .../JsRt/Edge/EdgeJsRuntime.cs | 8 ++-- .../JsRt/Edge/EdgeJsScope.cs | 6 +-- .../JsRt/Edge/EdgeJsScriptException.cs | 8 ++-- .../JsRt/Edge/EdgeJsValue.cs | 10 ++--- .../JsRt/Edge/EdgeNativeMethods.cs | 11 +++-- .../JsRt/IActiveScriptProfilerCallback.cs | 8 ++-- .../JsRt/IActiveScriptProfilerCallback2.cs | 6 +-- .../JsRt/IActiveScriptProfilerHeapEnum.cs | 8 ++-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 16 +++---- .../JsRt/Ie/IDebugApplication32.cs | 6 +-- .../JsRt/Ie/IDebugApplication64.cs | 6 +-- .../JsRt/Ie/IDebugDocumentHelper32.cs | 6 +-- .../JsRt/Ie/IDebugDocumentHelper64.cs | 6 +-- .../JsRt/Ie/IProcessDebugManager32.cs | 6 +-- .../JsRt/Ie/IProcessDebugManager64.cs | 6 +-- .../JsRt/Ie/IeJsContext.cs | 6 +-- .../JsRt/Ie/IeJsNativeFunction.cs | 8 ++-- .../JsRt/Ie/IeJsPropertyId.cs | 8 ++-- .../JsRt/Ie/IeJsRuntime.cs | 6 +-- src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 6 +-- .../JsRt/Ie/IeJsScriptException.cs | 6 +-- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 8 ++-- .../JsRt/Ie/IeNativeMethods.cs | 11 +++-- .../JsRt/Ie/ProcessDebugManager.cs | 6 +-- .../JsRt/JsBackgroundWorkItemCallback.cs | 6 +-- .../JsRt/JsBeforeCollectCallback.cs | 6 +-- .../JsRt/JsEngineException.cs | 6 +-- src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs | 6 +-- src/MsieJavaScriptEngine/JsRt/JsException.cs | 6 +-- .../JsRt/JsFatalException.cs | 8 ++-- .../JsRt/JsMemoryAllocationCallback.cs | 6 +-- .../JsRt/JsObjectFinalizeCallback.cs | 6 +-- .../JsRt/JsRuntimeAttributes.cs | 8 ++-- .../JsRt/JsSourceContext.cs | 6 +-- .../JsRt/JsThreadServiceCallback.cs | 6 +-- .../JsRt/JsUsageException.cs | 8 ++-- .../JsRuntimeException.cs | 6 +-- .../MsieJavaScriptEngine.csproj | 6 +-- src/MsieJavaScriptEngine/MsieJsEngine.cs | 24 +++++----- .../NotSupportedTypeException.cs | 6 +-- .../Properties/AssemblyInfo.cs | 4 +- .../Utilities/StringBuilderExtensions.cs | 41 +++++++++++------- .../Utilities/TypeConverter.cs | 16 +++---- src/MsieJavaScriptEngine/Utilities/Utils.cs | 14 +++--- .../CommonTests.cs | 7 ++- .../Es5Tests.cs | 9 ++-- .../InteropTests.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../CommonTests.cs | 9 ++-- .../Es5Tests.cs | 9 ++-- .../InteropTests.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../CommonTests.cs | 9 ++-- .../Es5Tests.cs | 9 ++-- .../InteropTests.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../CommonTests.cs | 9 ++-- .../Es5Tests.cs | 9 ++-- .../InteropTests.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../CommonTests.cs | 9 ++-- .../Es5Tests.cs | 9 ++-- .../InteropTests.cs | 9 ++-- .../Properties/AssemblyInfo.cs | 4 +- .../CommonTestsBase.cs | 12 +++-- .../Es5TestsBase.cs | 10 ++--- .../FileSystemTestsBase.cs | 10 ++--- .../Interop/Base64Encoder.cs | 8 ++-- .../Interop/Date.cs | 6 +-- .../Interop/FileManager.cs | 8 ++-- .../Interop/Temperature.cs | 6 +-- .../InteropTestsBase.cs | 19 ++++---- .../Properties/AssemblyInfo.cs | 4 +- .../ValidationTests.cs | 8 ++-- MsieJavaScriptEngine.snk => tools/Key.snk | Bin 109 files changed, 458 insertions(+), 481 deletions(-) rename MsieJavaScriptEngine.snk => tools/Key.snk (100%) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index 315e2fc..8fc3d27 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.Serialization; - using System.Runtime.InteropServices.ComTypes; +using System; +using System.Runtime.Serialization; +using System.Runtime.InteropServices.ComTypes; +namespace MsieJavaScriptEngine.ActiveScript +{ [Serializable] internal sealed class ActiveScriptException : Exception { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index c3006a8..5c1da41 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -1,20 +1,20 @@ -namespace MsieJavaScriptEngine.ActiveScript +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.Expando; +using System.Windows.Threading; + +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; + +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine.ActiveScript { - using System; - using System.Collections.Generic; - using System.Globalization; - using System.Reflection; - using System.Runtime.InteropServices; - using System.Runtime.InteropServices.Expando; - using System.Windows.Threading; - - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; - - using Constants; - using Helpers; - using Resources; - using Utilities; - /// /// Base class of the ActiveScript JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs index b3f7ac6..d279447 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs @@ -1,12 +1,12 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; - using Helpers; - using Resources; +using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine.Resources; +namespace MsieJavaScriptEngine.ActiveScript +{ internal sealed class ActiveScriptParseWrapper : IActiveScriptParseWrapper { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 54a2829..4b56d04 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -1,7 +1,5 @@ namespace MsieJavaScriptEngine.ActiveScript { - using Constants; - /// /// ActiveScript version of Chakra JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index 245cdd1..7a3ae64 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,7 +1,5 @@ namespace MsieJavaScriptEngine.ActiveScript { - using Constants; - /// /// Classic MSIE JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs index 8fee946..bcb575e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// Provides the methods necessary to initialize the scripting engine. The scripting engine must /// implement the IActiveScript interface diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs index 412d4bd..84baa8f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// An object implementing this interface is passed to the IActiveScriptSite.OnScriptError method /// whenever the scripting engine encounters an unhandled error. The host then calls methods on diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs index 919a818..c3f580f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// If the Windows Script engine allows raw text code scriptlets to be added to the script /// or allows expression text to be evaluated at run time, it implements the diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs index 9eb9d78..91662aa 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// If the Windows Script engine allows raw text code scriptlets to be added to the script /// or allows expression text to be evaluated at run time, it implements the diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs index af07d7b..22d456f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// If the Windows Script engine allows raw text code scriptlets to be added to the script /// or allows expression text to be evaluated at run time, it implements the diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs index f08db94..b8325a1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.ActiveScript +{ [ComImport] [Guid("4954e0d0-fbc7-11d1-8410-006008c3fbfc")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index 65301ea..1f0c29d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// Implemented by the host to create a site for the Windows Script engine. Usually, this site /// will be associated with the container of all the objects that are visible to the script diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs index eea4e89..19ec39b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; +namespace MsieJavaScriptEngine.ActiveScript +{ [Flags] internal enum ScriptInfoFlags : uint { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs index 1d731e7..b5812dd 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; +namespace MsieJavaScriptEngine.ActiveScript +{ /// /// Thread interruption options /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs index 54de65e..9125aec 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; +namespace MsieJavaScriptEngine.ActiveScript +{ [Flags] internal enum ScriptItemFlags : uint { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs index 050f772..27f98b0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; +namespace MsieJavaScriptEngine.ActiveScript +{ [Flags] internal enum ScriptTextFlags : uint { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs index ce92732..1b55092 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.ActiveScript -{ - using System; +using System; +namespace MsieJavaScriptEngine.ActiveScript +{ [Flags] internal enum ScriptTypeLibFlags : uint { diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index b1ef7d9..9f2b972 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.Helpers -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.Helpers +{ /// /// COM helpers /// diff --git a/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs index 6aa48a9..06cfe76 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsEngineModeHelpers.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.Helpers -{ - using System; +using System; +namespace MsieJavaScriptEngine.Helpers +{ internal static class JsEngineModeHelpers { public static string GetModeName(JsEngineMode mode) diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 2942f10..56d1e48 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -1,12 +1,12 @@ -namespace MsieJavaScriptEngine.Helpers -{ - using System; - using System.Globalization; - using System.Text; +using System; +using System.Globalization; +using System.Text; - using Resources; - using Utilities; +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; +namespace MsieJavaScriptEngine.Helpers +{ /// /// JavaScript engine error helpers /// diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index 0f94505..4a09bbe 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine.Helpers -{ - using System; - using System.Linq; +using System; +using System.Linq; - using Utilities; +using MsieJavaScriptEngine.Utilities; +namespace MsieJavaScriptEngine.Helpers +{ /// /// Type mapping helpers /// diff --git a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs index de10b6c..5e7b530 100644 --- a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs @@ -1,11 +1,11 @@ -namespace MsieJavaScriptEngine.Helpers -{ - using System; - using System.Linq; - using System.Text.RegularExpressions; +using System; +using System.Linq; +using System.Text.RegularExpressions; - using Utilities; +using MsieJavaScriptEngine.Utilities; +namespace MsieJavaScriptEngine.Helpers +{ /// /// Validation helpers /// diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index ad1970f..57f6fbf 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -1,10 +1,10 @@ -namespace MsieJavaScriptEngine -{ - using System; - using System.Globalization; - using System.Linq; - using System.Reflection; +using System; +using System.Globalization; +using System.Linq; +using System.Reflection; +namespace MsieJavaScriptEngine +{ /// /// Base class of item, that implements interface /// diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 1c19248..d1ac1f7 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -1,13 +1,13 @@ -namespace MsieJavaScriptEngine -{ - using System; - using System.Globalization; - using System.Linq; - using System.Reflection; +using System; +using System.Globalization; +using System.Linq; +using System.Reflection; - using Constants; - using Helpers; +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Helpers; +namespace MsieJavaScriptEngine +{ /// /// Wrapper for object, that implements interface /// diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs index 4cdbf31..9b5efbf 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -1,13 +1,13 @@ -namespace MsieJavaScriptEngine -{ - using System; - using System.Globalization; - using System.Linq; - using System.Reflection; +using System; +using System.Globalization; +using System.Linq; +using System.Reflection; - using Constants; - using Helpers; +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Helpers; +namespace MsieJavaScriptEngine +{ /// /// Wrapper for type, that implements interface /// diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index a733dc1..bd65a10 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System; +using System; +namespace MsieJavaScriptEngine +{ /// /// Interface for the inner JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs b/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs index 8cdf01b..2aa396a 100644 --- a/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs +++ b/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System.Threading; +using System.Threading; +namespace MsieJavaScriptEngine +{ internal struct InterlockedStatedFlag { private int _counter; diff --git a/src/MsieJavaScriptEngine/JsEngineLoadException.cs b/src/MsieJavaScriptEngine/JsEngineLoadException.cs index 19faf1b..0b99971 100644 --- a/src/MsieJavaScriptEngine/JsEngineLoadException.cs +++ b/src/MsieJavaScriptEngine/JsEngineLoadException.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System; +using System; +namespace MsieJavaScriptEngine +{ /// /// The exception that is thrown when a loading of JavaScript engine is failed /// diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index 85808f6..bddcd45 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System; +using System; +namespace MsieJavaScriptEngine +{ /// /// The exception that is thrown during the work of JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index d724440..778671a 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; - using Helpers; +using MsieJavaScriptEngine.Helpers; +namespace MsieJavaScriptEngine.JsRt +{ /// /// Base class of the Chakra JsRT JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index a430dd8..a54bcca 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1,13 +1,13 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - using System.Globalization; - using System.Linq; +using System; +using System.Globalization; +using System.Linq; - using Constants; - using Resources; - using Utilities; +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” JsRT version of Chakra JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index 45e4c9b..1960cca 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -1,9 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - - using JsRt; +using System; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” script context /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs index 3046b57..f3ca6a0 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” function callback /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs index cfcbc1e..4650034 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” property identifier /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs index e1e80b2..6e40c3f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs @@ -1,9 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - - using JsRt; +using System; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” Chakra runtime /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs index 16c9128..5188275 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” scope automatically sets a context to current and resets the original context /// when disposed diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs index 14c8119..5da7122 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs @@ -1,10 +1,8 @@ +using System; +using System.Runtime.Serialization; + namespace MsieJavaScriptEngine.JsRt.Edge { - using System; - using System.Runtime.Serialization; - - using JsRt; - /// /// Edge script exception /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 5a8a69e..a27500e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -1,10 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - using System.Runtime.InteropServices; - - using JsRt; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” JavaScript value /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 6b3b217..f157c94 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -1,11 +1,10 @@ -namespace MsieJavaScriptEngine.JsRt.Edge -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using Constants; - using JsRt; +using MsieJavaScriptEngine.Constants; +namespace MsieJavaScriptEngine.JsRt.Edge +{ /// /// “Edge” native methods /// diff --git a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs index a6cb347..9854446 100644 --- a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt +{ /// /// IActiveScriptProfilerCallback COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs index bdb942d..d9b0eb2 100644 --- a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs +++ b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerCallback2.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt +{ /// /// IActiveScriptProfilerCallback2 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs index d1d2671..13d741a 100644 --- a/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs +++ b/src/MsieJavaScriptEngine/JsRt/IActiveScriptProfilerHeapEnum.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System.Diagnostics.CodeAnalysis; - using System.Runtime.InteropServices; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt +{ /// /// IActiveScriptProfilerHeapEnum COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 1361121..642828c 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1,13 +1,13 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; - using System.Globalization; - using System.Linq; +using System; +using System.Globalization; +using System.Linq; - using Constants; - using Resources; - using Utilities; +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” JsRT version of Chakra JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs index fd3ae56..b35beb7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication32.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IDebugApplication32 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs index 29bd944..4152b2c 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugApplication64.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IDebugApplication64 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs index fb8d0bc..a28a754 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper32.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IDebugDocumentHelper32 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs index 6d024f0..b292940 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IDebugDocumentHelper64.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IDebugDocumentHelper64 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs index fee3744..1c6cda9 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager32.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IProcessDebugManager32 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs index 413576f..10b1587 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IProcessDebugManager64.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// IProcessDebugManager64 COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 5e0b626..1e1982a 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” script context /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs index 55b9429..517db1d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” function callback /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs index dd5b10a..1b0c9d1 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” property identifier /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs index 2e4f30f..06f936e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” Chakra runtime /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs index 756f2b2..7470ca7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” scope automatically sets a context to current and resets the original context /// when disposed diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs index a560286..4804611 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs @@ -1,8 +1,8 @@ +using System; +using System.Runtime.Serialization; + namespace MsieJavaScriptEngine.JsRt.Ie { - using System; - using System.Runtime.Serialization; - /// /// IE script exception /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index 67e0d3f..c77aff4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” JavaScript value /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 43885fd..e5b7c97 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -1,11 +1,10 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System; - using System.Runtime.InteropServices; +using System; +using System.Runtime.InteropServices; - using Constants; - using JsRt; +using MsieJavaScriptEngine.Constants; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// “IE” native methods /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs index 602032b..b119b61 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ProcessDebugManager.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt.Ie -{ - using System.Runtime.InteropServices; +using System.Runtime.InteropServices; +namespace MsieJavaScriptEngine.JsRt.Ie +{ /// /// ProcessDebugManager COM interface /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs index df7a572..759b7ac 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsBackgroundWorkItemCallback.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The background work item callback /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs index 0dc374f..dfcc3ab 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The callback called before collection /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs index 19eafd6..69d40c6 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -1,8 +1,8 @@ +using System; +using System.Runtime.Serialization; + namespace MsieJavaScriptEngine.JsRt { - using System; - using System.Runtime.Serialization; - /// /// The exception that occurred in the workings of the JavaScript engine itself /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs index f4719bb..3c53b8e 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.CodeAnalysis; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The error code returned from a Chakra hosting API /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs index 78393ef..0d0c823 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsException.cs @@ -1,8 +1,8 @@ +using System; +using System.Runtime.Serialization; + namespace MsieJavaScriptEngine.JsRt { - using System; - using System.Runtime.Serialization; - /// /// The exception returned from the Chakra engine /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs index 82680e7..65bef2f 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; +using System; +using System.Runtime.Serialization; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The fatal exception /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs index 992a888..4fa09cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// User implemented callback routine for memory allocation events /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs index 0069182..56b3c77 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The finalization callback /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs index a4f8706..cbedbf1 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Diagnostics.CodeAnalysis; +using System; +using System.Diagnostics.CodeAnalysis; +namespace MsieJavaScriptEngine.JsRt +{ /// /// Attributes of a runtime /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs b/src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs index 7f2780b..12584f2 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsSourceContext.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The cookie that identifies a script for debugging purposes /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs index 9008444..6f9df33 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; +using System; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The thread service callback /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs index 1682791..0223134 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.JsRt -{ - using System; - using System.Runtime.Serialization; +using System; +using System.Runtime.Serialization; +namespace MsieJavaScriptEngine.JsRt +{ /// /// The API usage exception /// diff --git a/src/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs index 0357c90..ec43d3a 100644 --- a/src/MsieJavaScriptEngine/JsRuntimeException.cs +++ b/src/MsieJavaScriptEngine/JsRuntimeException.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System; +using System; +namespace MsieJavaScriptEngine +{ /// /// The exception that is thrown during a execution of code by JavaScript engine /// diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 0abd5f1..96f69a1 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -39,7 +39,7 @@ true - ..\..\MsieJavaScriptEngine.snk + ..\..\tools\Key.snk @@ -172,8 +172,8 @@ - - MsieJavaScriptEngine.snk + + Key.snk diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 04c4766..6b828a9 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -1,16 +1,16 @@ -namespace MsieJavaScriptEngine +using System; +using System.Reflection; +using System.Text; + +using MsieJavaScriptEngine.ActiveScript; +using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine.JsRt.Edge; +using MsieJavaScriptEngine.JsRt.Ie; +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine { - using System; - using System.Reflection; - using System.Text; - - using ActiveScript; - using Helpers; - using JsRt.Edge; - using JsRt.Ie; - using Resources; - using Utilities; - /// /// .NET-wrapper for working with the Internet Explorer's JavaScript engines /// diff --git a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs index e57b1ca..868e4ff 100644 --- a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs +++ b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine -{ - using System; +using System; +namespace MsieJavaScriptEngine +{ /// /// The exception that is thrown when a .NET type is not supported by JavaScipt engine /// diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 37b22c8..0c54f78 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("1.7.2.0")] -[assembly: AssemblyFileVersion("1.7.2.0")] +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs index 2944b91..004888a 100644 --- a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs @@ -1,8 +1,9 @@ -namespace MsieJavaScriptEngine.Utilities -{ - using System.Text; - using System.Text.RegularExpressions; +using System; +using System.Text; +using System.Text.RegularExpressions; +namespace MsieJavaScriptEngine.Utilities +{ /// /// Extensions for StringBuilder /// @@ -12,16 +13,21 @@ internal static class StringBuilderExtensions /// Regular expression for format placeholder /// private static readonly Regex _formatPlaceholderRegExp = - new Regex(@"\{[0-9]+\}", RegexOptions.Multiline); + new Regex(@"\{[0-9]\}", RegexOptions.Multiline); /// - /// Appends the default line terminator to the end of the current System.Text.StringBuilder object + /// Appends the default line terminator to the end of the current instance /// - /// Object StringBuilder - /// Object StringBuilder - public static StringBuilder AppendFormatLine(this StringBuilder sb) + /// Instance of + /// Instance of + public static StringBuilder AppendFormatLine(this StringBuilder source) { - return sb.AppendLine(); + if (source == null) + { + throw new ArgumentNullException("source"); + } + + return source.AppendLine(); } /// @@ -30,18 +36,23 @@ public static StringBuilder AppendFormatLine(this StringBuilder sb) /// Each format item is replaced by the string representation of a corresponding /// argument in a parameter array. /// - /// Object StringBuilder + /// Instance of /// A composite format string /// An array of objects to format - /// Object StringBuilder - public static StringBuilder AppendFormatLine(this StringBuilder sb, string format, params object[] args) + /// Instance of + public static StringBuilder AppendFormatLine(this StringBuilder source, string format, params object[] args) { + if (source == null) + { + throw new ArgumentNullException("source"); + } + if (_formatPlaceholderRegExp.IsMatch(format)) { - return sb.AppendFormat(format, args).AppendLine(); + return source.AppendFormat(format, args).AppendLine(); } - return sb.AppendLine(format.Replace("{{", "{").Replace("}}", "}")); + return source.AppendLine(format.Replace("{{", "{").Replace("}}", "}")); } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 4c85817..9ed083e 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -1,13 +1,13 @@ -namespace MsieJavaScriptEngine.Utilities -{ - using System; - using System.ComponentModel; - using System.Globalization; - using System.Linq; - using OriginalTypeConverter = System.ComponentModel.TypeConverter; +using System; +using System.ComponentModel; +using System.Globalization; +using System.Linq; +using OriginalTypeConverter = System.ComponentModel.TypeConverter; - using Resources; +using MsieJavaScriptEngine.Resources; +namespace MsieJavaScriptEngine.Utilities +{ /// /// Type converter /// diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 3184fab..7478da9 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -1,12 +1,12 @@ -namespace MsieJavaScriptEngine.Utilities -{ - using System; - using System.IO; - using System.Reflection; - using System.Text; +using System; +using System.IO; +using System.Reflection; +using System.Text; - using Resources; +using MsieJavaScriptEngine.Resources; +namespace MsieJavaScriptEngine.Utilities +{ internal static class Utils { /// diff --git a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs index 4b4a89b..3c664f4 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs @@ -1,8 +1,7 @@ -namespace MsieJavaScriptEngine.Test.Auto -{ - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Auto +{ public class CommonTests : CommonTestsBase { protected override MsieJsEngine CreateJsEngine() diff --git a/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs index 3d47b65..2133db4 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Auto -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Auto +{ [TestFixture] public class Es5Tests : Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs index 712c3fc..0134590 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Auto -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Auto +{ [TestFixture] public class InteropTests : InteropTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index f9cd7f2..21e35d9 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 37a4868..784849a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraActiveScript -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ [TestFixture] public class CommonTests : CommonTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs index 5e36bbc..1a17734 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraActiveScript -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ [TestFixture] public class Es5Tests : Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs index 8c89810..44871a4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraActiveScript -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ [TestFixture] public class InteropTests : InteropTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index e9611bf..2f8d45c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index cc37d31..1aeade0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ [TestFixture] public class CommonTests : CommonTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs index b025ee3..9cadc18 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ [TestFixture] public class Es5Tests : Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index f687602..fd62ed9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ [TestFixture] public class InteropTests : InteropTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index a09ae3f..e2f9c03 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index 493eee5..d5ddaca 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraIeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ [TestFixture] public class CommonTests : CommonTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs index 12ec415..dd4658f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraIeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ [TestFixture] public class Es5Tests : Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index 6474b23..079385f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.ChakraIeJsRt -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ [TestFixture] public class InteropTests : InteropTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 6dbe669..165d626 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index 5396bd7..247de8f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Classic -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Classic +{ [TestFixture] public class CommonTests : CommonTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs index 6b5ed68..9888aa7 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Classic -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Classic +{ [TestFixture] public class Es5Tests : Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs index 2b008ad..5786691 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -1,10 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Classic -{ - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Common; +using MsieJavaScriptEngine.Test.Common; +namespace MsieJavaScriptEngine.Test.Classic +{ [TestFixture] public class InteropTests : InteropTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index dda7ff8..8302f8c 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 8073e06..fc26878 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -1,12 +1,10 @@ -namespace MsieJavaScriptEngine.Test.Common -{ - using System; - using System.IO; - - using NUnit.Framework; +using System; +using System.IO; - using MsieJavaScriptEngine; +using NUnit.Framework; +namespace MsieJavaScriptEngine.Test.Common +{ [TestFixture] public abstract class CommonTestsBase : FileSystemTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs index 792ae29..bc25874 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs @@ -1,11 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Common -{ - using System; - - using NUnit.Framework; +using System; - using MsieJavaScriptEngine; +using NUnit.Framework; +namespace MsieJavaScriptEngine.Test.Common +{ [TestFixture] public abstract class Es5TestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index 04c9ac9..90bda7e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Common -{ - using System; - using System.IO; - using System.Text.RegularExpressions; +using System; +using System.IO; +using System.Text.RegularExpressions; +namespace MsieJavaScriptEngine.Test.Common +{ public abstract class FileSystemTestsBase { /// diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs index bbc5e6f..e134e94 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Base64Encoder.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop -{ - using System; - using System.Text; +using System; +using System.Text; +namespace MsieJavaScriptEngine.Test.Common.Interop +{ public static class Base64Encoder { public const int DATA_URI_MAX = 32768; diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs index c6c4be4..313dc55 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop -{ - using System; +using System; +namespace MsieJavaScriptEngine.Test.Common.Interop +{ public struct Date { private static readonly int[] _cumulativeDays = { 0, 31, 59, 90, 120, 151, 181, diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs index a61aec7..9f4a63b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs @@ -1,8 +1,8 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop -{ - using System; - using System.IO; +using System; +using System.IO; +namespace MsieJavaScriptEngine.Test.Common.Interop +{ public sealed class FileManager { public string ReadFile(string path) diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs index fc67995..d6d9525 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Temperature.cs @@ -1,7 +1,7 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop -{ - using System; +using System; +namespace MsieJavaScriptEngine.Test.Common.Interop +{ public struct Temperature { double _celsius; diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 0daea51..953f323 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -1,16 +1,15 @@ -namespace MsieJavaScriptEngine.Test.Common -{ - using System; - using System.Collections.Generic; - using System.Drawing; - using System.IO; - using System.Linq; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.IO; +using System.Linq; - using NUnit.Framework; +using NUnit.Framework; - using MsieJavaScriptEngine; - using Interop; +using MsieJavaScriptEngine.Test.Common.Interop; +namespace MsieJavaScriptEngine.Test.Common +{ [TestFixture] public abstract class InteropTestsBase : FileSystemTestsBase { diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index a1d5e5b..d5e3fc4 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("1.7.0.0")] -[assembly: AssemblyFileVersion("1.7.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.0.0")] +[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs index e108e6b..97bbb89 100644 --- a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs @@ -1,9 +1,9 @@ -namespace MsieJavaScriptEngine.Test.Common -{ - using NUnit.Framework; +using NUnit.Framework; - using Helpers; +using MsieJavaScriptEngine.Helpers; +namespace MsieJavaScriptEngine.Test.Common +{ [TestFixture] public class ValidationTests { diff --git a/MsieJavaScriptEngine.snk b/tools/Key.snk similarity index 100% rename from MsieJavaScriptEngine.snk rename to tools/Key.snk From 2e61bdf50cdfdd39aefa3b42b24a8c70eb1215b9 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 24 Aug 2016 21:51:07 +0300 Subject: [PATCH 032/238] Added a custom generation of `*.Designer.cs` files from `*.resx` files --- ...ngine.sln => MsieJavaScriptEngine.Net4.sln | 0 _generate-resx.shade | 358 ++++++++ build.cmd | 10 + build.ps1 | 67 ++ build.sh | 50 ++ makefile.shade | 48 + .../MsieJavaScriptEngine.csproj | 27 +- .../Resources/Strings.Designer.cs | 842 +++++++++--------- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 +- ...criptEngine.Test.ChakraActiveScript.csproj | 4 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 4 +- .../MsieJavaScriptEngine.Test.Common.csproj | 6 +- 14 files changed, 955 insertions(+), 473 deletions(-) rename MsieJavaScriptEngine.sln => MsieJavaScriptEngine.Net4.sln (100%) create mode 100644 _generate-resx.shade create mode 100644 build.cmd create mode 100644 build.ps1 create mode 100644 build.sh create mode 100644 makefile.shade diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.Net4.sln similarity index 100% rename from MsieJavaScriptEngine.sln rename to MsieJavaScriptEngine.Net4.sln diff --git a/_generate-resx.shade b/_generate-resx.shade new file mode 100644 index 0000000..c50bead --- /dev/null +++ b/_generate-resx.shade @@ -0,0 +1,358 @@ +use namespace="System" +use namespace="System.Collections.Generic" +use namespace="System.IO" +use namespace="System.Linq" +use namespace="System.Text" +use namespace="System.Text.RegularExpressions" +use namespace="System.Xml.Linq" + +default resxFile='' + +@{ + string output = string.Empty; + string resourceDirPath = Path.GetDirectoryName(resxFile); + string projectDirPath = GetProjectDirectoryName(resourceDirPath); + string outputDirPath = resourceDirPath; + string assemblyName = GetAssemblyName(projectDirPath); + string resourceNamespace = GenerateResourceNamespace(assemblyName, projectDirPath, resourceDirPath); + string resourceName = Path.GetFileNameWithoutExtension(resxFile); + bool isCultureSpecified = ResourceNameContainsCulture(resourceName); + + if (!isCultureSpecified) + { + var resourceStrings = new List(); + XDocument xml = XDocument.Load(resxFile); + + foreach (XElement entry in xml.Descendants("data")) + { + string name = entry.Attribute("name").Value; + string value = entry.Element("value").Value; + + resourceStrings.Add( + new ResourceData + { + Name = name, + Value = value + } + ); + } + + var outputBuilder = new StringBuilder(); + outputBuilder.AppendFormat( +@"//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace {0} +{{ + using System; + using System.Globalization; + using System.Reflection; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + public class {1} + {{ + private static Lazy _resourceManager = + new Lazy(() => new ResourceManager( + ""{0}.{1}"", +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 + typeof({1}).GetTypeInfo().Assembly +#elif NET40 + typeof({1}).Assembly +#else +#error No implementation for this target +#endif + )); + + private static CultureInfo _resourceCulture; + + /// + /// Returns a cached ResourceManager instance used by this class + /// + public static ResourceManager ResourceManager + {{ + get + {{ + return _resourceManager.Value; + }} + }} + + /// + /// Overrides a current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class + /// + public static CultureInfo Culture + {{ + get + {{ + return _resourceCulture; + }} + set + {{ + _resourceCulture = value; + }} + }} +", resourceNamespace, resourceName); + + foreach (ResourceData resourceString in resourceStrings) + { + outputBuilder.AppendLine(); + RenderProperty(outputBuilder, resourceString); + } + + outputBuilder.Append(@" + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); + + return value; + } + } + }"); + + output = outputBuilder.ToString(); + outputBuilder.Clear(); + } + + if (!Directory.Exists(outputDirPath)) + { + Directory.CreateDirectory(outputDirPath); + } + + string outputFilePath = Path.Combine(outputDirPath, resourceName + ".Designer.cs"); + File.WriteAllText(outputFilePath, output); +} + +functions @{ + private static Regex _whitespaceRegex = new Regex(@"\s+"); + private static Regex _cultureRegex = new Regex("[a-zA-Z]{2}-[a-zA-Z]{2}$"); + + + private static string RemoveFirstSlash(string path) + { + return path.TrimStart(Path.DirectorySeparatorChar); + } + + private static string RemoveLastSlash(string path) + { + return path.TrimEnd(Path.DirectorySeparatorChar); + } + + private static string CollapseWhitespace(string value) + { + return _whitespaceRegex.Replace(value, " "); + } + + private static string CutShort(string value, int maxLength, string endSymbol = "...") + { + string result = value.Trim(); + + if (result.Length > maxLength) + { + result = result.Substring(0, maxLength).Trim() + endSymbol; + } + + return result; + } + + private static string CutShortByWords(string value, int maxLength, string endSymbol = "...", bool isAfterCut = false) + { + string result; + string processedValue = CollapseWhitespace(value).Trim(); + + if (processedValue.Length > maxLength) + { + if (processedValue.IndexOf(" ", StringComparison.Ordinal) != -1) + { + var sb = new StringBuilder(); + + string[] wordList = processedValue.Split(new [] {(char)' '}, + StringSplitOptions.RemoveEmptyEntries); + + for (int i = 0; i < wordList.Length; i++) + { + string word = wordList[i]; + + if (!isAfterCut) + { + if ((sb.ToString() + " " + word).Length > maxLength) + { + break; + } + } + + if (sb.Length > 0) + { + sb.Append(" "); + } + sb.Append(word); + + if (isAfterCut) + { + if (sb.Length > maxLength) + { + break; + } + } + } + + sb.Append(endSymbol); + + result = sb.ToString(); + sb.Clear(); + } + else + { + result = CutShort(processedValue, maxLength, endSymbol); + } + } + else + { + result = processedValue; + } + + return result; + } + + private static string XmlEncode(string value) + { + if (string.IsNullOrWhiteSpace(value) || !ContainsXmlEncodingChars(value)) + { + return value; + } + + string result; + + using (var writer = new StringWriter()) + { + int charCount = value.Length; + + for (int charIndex = 0; charIndex < charCount; charIndex++) + { + char charValue = value[charIndex]; + + switch (charValue) + { + case (char)'"': + writer.Write("""); + break; + case (char)'&': + writer.Write("&"); + break; + case (char)'<': + writer.Write("<"); + break; + case (char)'>': + writer.Write(">"); + break; + default: + writer.Write(charValue); + break; + } + } + + writer.Flush(); + + result = writer.ToString(); + } + + return result; + } + + private static bool ContainsXmlEncodingChars(string value) + { + bool result = (value.IndexOf('"') != -1 || value.IndexOf('&') != -1 + || value.IndexOf('<') != -1 || value.IndexOf('>') != -1); + + return result; + } + + private static string GetProjectDirectoryName(string resourceDirPath) + { + const string projectFileName = "project.json"; + string rootPath = RemoveLastSlash(Path.GetPathRoot(resourceDirPath)); + string projectDirPath = RemoveLastSlash(resourceDirPath); + + while (true) + { + if (string.Equals(projectDirPath, rootPath, StringComparison.OrdinalIgnoreCase)) + { + throw new FileNotFoundException("Project file not exist."); + } + + string projectFilePath = Path.Combine(projectDirPath, projectFileName); + if (File.Exists(projectFilePath) + || Directory.EnumerateFiles(projectDirPath, "*.csproj", SearchOption.TopDirectoryOnly).Any()) + { + break; + } + + int lastSlashIndex = projectDirPath.LastIndexOf(Path.DirectorySeparatorChar); + if (lastSlashIndex != -1) + { + projectDirPath = projectDirPath.Substring(0, lastSlashIndex); + } + } + + return projectDirPath; + } + + private static string GetAssemblyName(string projectDirPath) + { + string assemblyName = Path.GetFileName(RemoveLastSlash(projectDirPath)); + + return assemblyName; + } + + private static string GenerateResourceNamespace(string assemblyName, string projectDirPath, string resourceDirPath) + { + string resourceNamespace = assemblyName; + + if (!string.Equals(projectDirPath, resourceDirPath, StringComparison.OrdinalIgnoreCase)) + { + string resourceNamespacePart = resourceDirPath.Substring(projectDirPath.Length); + resourceNamespacePart = RemoveFirstSlash(resourceNamespacePart); + resourceNamespacePart = RemoveLastSlash(resourceNamespacePart); + resourceNamespacePart = resourceNamespacePart.Replace(Path.DirectorySeparatorChar, (char)'.'); + + resourceNamespace = string.Join(".", assemblyName, resourceNamespacePart); + } + + return resourceNamespace; + } + + private static bool ResourceNameContainsCulture(string resourceName) + { + return _cultureRegex.IsMatch(resourceName); + } + + private static void RenderProperty(StringBuilder builder, ResourceData resourceString) + { + builder + .AppendLine(" /// ") + .AppendFormat(" /// Looks up a localized string similar to \"{0}\"", + XmlEncode(CutShortByWords(resourceString.Value, 100))) + .AppendLine() + .AppendLine(" /// ") + .AppendFormat(" public static string {0}", resourceString.Name) + .AppendLine() + .AppendLine(" {") + .AppendFormat(@" get {{ return GetString(""{0}""); }}", resourceString.Name) + .AppendLine() + .AppendLine(" }") + ; + } + + private class ResourceData + { + public string Name { get; set; } + public string Value { get; set; } + } +} \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000..e3c9bc6 --- /dev/null +++ b/build.cmd @@ -0,0 +1,10 @@ +@echo off + +setlocal +set ORIGINAL_CURRENT_DIR=%cd% +set KOREBUILD_DOTNET_CHANNEL=preview +set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003121 + +cd %~dp0 + +PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000..6d49c4d --- /dev/null +++ b/build.ps1 @@ -0,0 +1,67 @@ +$ErrorActionPreference = "Stop" + +function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) +{ + while($true) + { + try + { + Invoke-WebRequest $url -OutFile $downloadLocation + break + } + catch + { + $exceptionMessage = $_.Exception.Message + Write-Host "Failed to download '$url': $exceptionMessage" + if ($retries -gt 0) { + $retries-- + Write-Host "Waiting 10 seconds before retrying. Retries left: $retries" + Start-Sleep -Seconds 10 + + } + else + { + $exception = $_.Exception + throw $exception + } + } + } +} + +cd $PSScriptRoot + +$repoFolder = $PSScriptRoot +$env:REPO_FOLDER = $repoFolder + +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" +if ($env:KOREBUILD_ZIP) +{ + $koreBuildZip=$env:KOREBUILD_ZIP +} + +$buildFolder = ".build" +$buildFile="$buildFolder\KoreBuild.ps1" + +if (!(Test-Path $buildFolder)) { + Write-Host "Downloading KoreBuild from $koreBuildZip" + + $tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid() + New-Item -Path "$tempFolder" -Type directory | Out-Null + + $localZipFile="$tempFolder\korebuild.zip" + + DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6 + + Add-Type -AssemblyName System.IO.Compression.FileSystem + [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) + + New-Item -Path "$buildFolder" -Type directory | Out-Null + copy-item "$tempFolder\**\build\*" $buildFolder -Recurse + + # Cleanup + if (Test-Path $tempFolder) { + Remove-Item -Recurse -Force $tempFolder + } +} + +&"$buildFile" $args \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..21be9ef --- /dev/null +++ b/build.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +ORIGINAL_CURRENT_DIR=%cd% +KOREBUILD_DOTNET_CHANNEL=preview +KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003121 + +repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd $repoFolder + +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" +if [ ! -z $KOREBUILD_ZIP ]; then + koreBuildZip=$KOREBUILD_ZIP +fi + +buildFolder=".build" +buildFile="$buildFolder/KoreBuild.sh" + +if test ! -d $buildFolder; then + echo "Downloading KoreBuild from $koreBuildZip" + + tempFolder="/tmp/KoreBuild-$(uuidgen)" + mkdir $tempFolder + + localZipFile="$tempFolder/korebuild.zip" + + retries=6 + until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) + do + echo "Failed to download '$koreBuildZip'" + if [ "$retries" -le 0 ]; then + exit 1 + fi + retries=$((retries - 1)) + echo "Waiting 10 seconds before retrying. Retries left: $retries" + sleep 10s + done + + unzip -q -d $tempFolder $localZipFile + + mkdir $buildFolder + cp -r $tempFolder/**/build/** $buildFolder + + chmod +x $buildFile + + # Cleanup + if test ! -d $tempFolder; then + rm -rf $tempFolder + fi +fi + +$buildFile -r $repoFolder "$@" \ No newline at end of file diff --git a/makefile.shade b/makefile.shade new file mode 100644 index 0000000..2980d06 --- /dev/null +++ b/makefile.shade @@ -0,0 +1,48 @@ +use assembly="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" +use namespace="System" +use namespace="System.Collections" +use namespace="System.IO" +use import="Files" +use import="BuildEnv" +use import="Environment" + +default BASE_DIR='${Directory.GetCurrentDirectory()}' + +var AUTHORS='Andrey Taritsyn' + +use-standard-lifecycle + +#resx description='Converts .resx files to .Designer.cs' target='initialize' + @{ + string currentDirPath; + string originalCurrentDirPath = Environment.GetEnvironmentVariable("ORIGINAL_CURRENT_DIR"); + string vsProjectDirPath= Environment.GetEnvironmentVariable("VS_PROJECT_DIR"); + + if (!string.IsNullOrEmpty(vsProjectDirPath)) + { + currentDirPath = vsProjectDirPath; + } + else if (!string.IsNullOrEmpty(originalCurrentDirPath)) + { + currentDirPath = originalCurrentDirPath; + } + else + { + currentDirPath = BASE_DIR; + } + + Log.Info(string.Format('Processing of resx-files in "{0}" directory:', currentDirPath)); + + foreach (var filePath in Directory.EnumerateFiles(currentDirPath, "*.resx", SearchOption.AllDirectories)) + { + GenerateResx(filePath); + + string relativeFilePath = filePath.Substring(currentDirPath.Length); + Log.Info(string.Format(' * "{0}" is processed', relativeFilePath)); + } + + Log.Info(''); + } + +macro name="GenerateResx" resxFile='string' + generate-resx \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 96f69a1..e01490e 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -19,7 +19,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG;NET40 prompt 4 @@ -28,7 +28,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;NET40 prompt 4 @@ -133,16 +133,8 @@ - - True - True - Strings.resx - - - True - True - Strings.ru-ru.resx - + + @@ -161,13 +153,9 @@ - ResXFileCodeGenerator - Strings.Designer.cs Designer - ResXFileCodeGenerator - Strings.ru-ru.Designer.cs Designer @@ -184,7 +172,12 @@ del "$(ProjectDir)Resources\ES5.min.js" AjaxMinifier.exe "$(ProjectDir)Resources\ES5.js" –out "$(ProjectDir)Resources\ES5.min.js" del "$(ProjectDir)Resources\json2.min.js" -AjaxMinifier.exe "$(ProjectDir)Resources\json2.js" –out "$(ProjectDir)Resources\json2.min.js" +AjaxMinifier.exe "$(ProjectDir)Resources\json2.js" –out "$(ProjectDir)Resources\json2.min.js" + +SET VS_PROJECT_DIR=$(ProjectDir) + +cd "$(ProjectDir)..\..\" +build resx {k=MpYUsh7d@iqXB^>8gl{JN1mU4--ETSJ(+FQd z_`{?;_YnKbgcm%j=W{gS^9kQb_))^`;kw^a!lw|vjPPBAUm)DNO&_;M9@FzVh477p zUnabKgs$I2_U!lPq!zw-#+PWV;AOW&^R&mw#? z;TH*a#_IZYgl{Ljlkibb>G~@OKS_A;I9+Ep;kyX;KdtMGC44pEX9+JLzYjimyzX}a z;RgvXc!#btlknYyr%ljxCKJAy@Ye|+^G;oVE#a34pGC@ZSdFgVO!z*+L+{dc#t^=o z@S}w1P1N-#6TY7CbA&t3==w7WKTrD4t;GH^;e#jXe(MO|MEH5a2fSO?uO)mv;im~N zn5^qhB78OB#|Xbpc;S0=zat5sMffVh+X+8Uc={AQKjnl^A$&36TL?c!cE*eb*oSL%zY_`HNcc6v zhrdtPUrzXG!Us>&b?ON}KzQW+y3RDhYlrFOxsBLgBD{FI?sqETYY0C|c=`u){ZWK3 zBz!mF*9kA3q5G{Pd?hK*4aEL3;nC-GzY7UJNO+`9*O^Lq8{yXoulk^_zl883gcr=z zb&5%OPAB$lgkL7S>_fWWd4%sGyp!<@313Bclzji{31VL`TlYJK z@b!eBC49h#b^YmtZzB96;e%tk{w%_`5`LBN0Qvs^p>g7u@J)oDCA?scu3tm=a>6?Z z_s`Y!s|cS@_%^~X5q|Uz{eDzDPtVUx!nYBAgYc@4==zHY?;t#5zOGY4_*%lx67GCd z*PliBcET?b?$qo0(+S@|_*ugHH|Y9P2wzM13BvOh==wE;uO$2k;Tes(el_9q3ExWi z1;YC`>3$~?zMSv_gj*le^`nH(CVUg&X9&-0*8NT-d_Cb82rvD(u0NmfJ%ooA>N?{H zUrqQK!ktg(`m+h&Nw~F0*Qq3Y0pab0Tc6bRhZDYt@co2`7VG+>313F|A;L4B*Y(E} zzLM}Wgb!Y#>(3{AAK@9F(sd>izKQT_gjX-s^_LNTobUmk)^)~^anWpIzl-p+WxD

    u`~u-4R_QwH34fjNiJ#YXwiBMQTDPA`_yNKP zd_mV~Cj2Df%gJ-d(KWh$jPT8bpC`QkOS=9f!dDW0i15%_U4J;?3kcsq_?0*ELc8H# zmgO%gvVDyvU|AN}%_K7ckNrEzOaLsu>2*P{Z#IE4XKXJkY&#n=tUw9k`<4#02HTeP zN!!YFt`=JXXQOR}!@i~uW?BA$mANn}ZmL7LGw_p#tw4MeQV(pFNT=Si231tRz}GbM zO~wbijV01~62?vhFB!e?J>OQ?`3f@N{1px>(;(5W+Svpe4IrFrg3g5ga5vks0;zU9 z6Lx7ioq;jJUV&kskh2K_@z?N@?a%awg6>8HGyU$%cym9BTxR!pqLo4z*esEK;P+wJpPB~q?3BzD=Nd{YJDeGw3v5?p z11G|6yN#ICQtEZsJ!xCs#8(%JPCJ znOBk5Q&K;QPYHw5UKw6wYN{0&fy2I~8P;i_7o{$5k!s!<_$taXzFAK5HN51$@G|TM zMr`LPTxYitFYztlt?{qnHSByzuBFt3fZu6D*a}2mSdSF(t%yzy`ke;U;GjP~3l`1- z3Huy~3<@SMvEAxygXyV0&<1Z^ui0z=#DrF*$dsE!G6SMs23cY|k z5Wz>J-QGgq0@`UuI(wBw?oga!IQlG(11@q9PR&UR#=nJPNej6<@m3skP+`OFw90+5MPWuOY=51?suVEjJ`~2NYku0^$~}<`v{42novm{ zwEnR3F@#K6WQU_(*I-H`J2f*UGc_R__WH(iUf&q@`o^$V_t0ygu1Y3@!OV~|Q^IL} z^ckiwkWmz`^sJSuI{*7$(+=KPb*)Fya^&xJ{2zq>)%ahC{~M(m<1fjlAdF7d`YO2e z5jlu07KZnpeNEDSHR7a9rIm@jG~_w3ZNPuiNN}88nrh9*JMKZ5v67d4vz;cCN;oz? z8BDbU&byKSiXu_)f>IxS6{+&-j+QQ4lp|5dTDk6*aK^FvWO9?hv~W9OqI?z7o!LHj z6cV~$gt4icg|_2^my)J8Hn6*-Vo5`7mWEnVZu^|!rRZ(8O0Bl6HC{SjrQ{~I4Q}J; ziNp068vFCtB{L;bPtL4mxkU4{kF8fpP{ye1HMKVRn2aYe7Ill59`jrVX23A z;A|Z9c7sxbmA#S1pYwF2#2<8j2pjhVUJ}7m2*$q;k5A{CGLpUm;|B9*yDl=3`vS6p z{=46OFS`XecDCa@GH_LRWG~y-@6J2=I(wlj9SGFC{v*}YEfKe4r%{f5-M&yXm)(xo z?sgpXOL@jc*YhT~8I~RY0rV1OQR!V1T!R0avM;wAB;a%V-es;?W#ZWH<{NOa>-csY zH+{HA>z$2oXW$o7YWv_|V6#Lz&C+^5j+YXvDw(#on=NA9S~;Q>dz02t(fXm$l1OKv zs&$8G_0W#U@rtA`jJ&>wf{yQpjPnT*ScDfhSBy}8|C?Q2!me-WZKlrPUW>l}BX?T? z+ntNoNF+W3Cb$ta;>i6Gyri1GDd-+RI4$7LLv+afF%E)W*Yt-s-(k_Na6hxH{?@?9 zz2=_Zg#H9$-|SLz;m_&c3k_GAmQ#pO*BHT# z7D3CjDyJVJ;x>*Gbt%~|$XMpv(7yXjQv(eG+!74U+*JT+ z(YGT-$o)LR#z(TbG~q57e%XB_RtHONQ!6oRP65_WzFVRKD|rKMSEuRw00?Yf=T!qeQ{??NRW)M41=#DDz}_%XK{KUB{2fb=>IWcWLDH(7*ss zdP4_&TGw^kCRv5)L2B#3NbD;5YBbzf&N_L|iw!aFcf`h+_xxC$dG8x*miOk~rUww6 z28=(wIkX9w@^1(xnF)Z&eRCwpqv`gl0Hqq%LfLLUfxW=NG#c(k1IO4unS{}x};mW~=o`pX%F0h?*2v%Ua4O^iVm@Ob^C}a?buJz_UgmVTkVC zdgFNqDh)k2>Xy<-oYJx+^-jnuqclq#Vt#`2NmK#3kg16@!=HS^z%dhT0@9Flk{*7Lg)9}v0XXZB;Ze@D)7d?-0o4o!$OD?SZ*|G2!F?RLl^Kw7zizXx0 zya&onw4xp;4@fF?4|E5R)aV{4-%Phno$FhgY2p5BVL+A{$9xD&gaPMUat*wG=`)fS zuhQ;MR%$aP3^cX%=rUh1U1neDGG9jTHLzJC&5*`fg1*O0OjDyW$qSlkX<9<_;v0(& zOKH+j62rkGZypXtN~G&ej6bGY(beAg1NW1M(DF)}?D)^nb2et9`f>MZ0wRb?KyqA^~@TBn`bu zEYwr13HSK0dmb-+QgWPMK(9htfS0d<(DQmaS+h+lX8L;wq(n@<-M2zvuH^bF@=}u3 zyYqGlWcE(nPy3dpTN@yZ8*gS#*ef>oDBPt+ASTKXLHfMK^hk=IE$sCW>D$?}x@T1q%N0B>IQ^KQ+)ul1Ik!{sr!ym!$l8AfOI z>Wn;&410?v$+=0owRoi^(N>F{+lX~wSC)wUH6o=xW|synoQ?T2OBJ?z0#U_wgLw1}ll2nY73j0R4nVjTK>{$d+DHp^@ z77$}fWnhD(#gV+BJ()$YMvT4vsQe+6fhi-o+h7=kaZ(D96i=op9%+{-8!hkQxbX(s#t;o(+YXCmR72){}AgfHv*>j=L>_{a^q&N9NU6F%`P zy3TIG^Ec}D3kW|%c=W5f&RW7R6Fz>EuCtTyv{!WdI>I{$FKp9w<`902@S(5jI!g(^ zMEJ-nRdUy?kRL4x8vT8Rb?~T4F@9j2ATB+O3aWe zHE4S)I=CD68~if159R)aJ;ZRZ-(cr4^c{UtoDq0S@y3aLF@|{&Y8Z?p#%wvMku=*3 zvid}2EjYzn`}YUU_GYF(HF_Ip(6>yMS#fup4eitr0*^y=A~vh!&VWJJ9dMkJn&K@E z?J|R}6th2);@$6pX3HR9XeYLIUV+#{J`uqBsr0Ab+EAu7?!DgFOx6k~66?gh&H5fj8%Ss49HTN83SzSc`RtP-gN=U9 zGmp#gSmus$qlwCffJjBr5hL(SIFySM44QS{vVC3m)>U=`7Q+1AcrCY4!Wa&|4aL!j z)jh0s%PUSsuH~~(!Vn}gUW6eA^4PcqgWG^F{#)cao-RpV1F(HqIlCJc@iXAgC~&Og zNleg9!$Ad>p>d}e^2BO@3IO*gZAlqtzAx1fwzSv?^t$ee79rmRLD&-#Q zi}=jBDK|r3SqW{SMwyk=(O*54pd`D^~l?;jK@!AJY3n?jKCddGq>5yt)@m z@K1Q{lXCBAPe0r5?eApzbDxodPTbpMzVIW+U`S-fXIQZGS4f%r>;?(DlW{&6w_z>L z?_PvrYP1@$7)1RU2Wjwr$+)SIisF?<$X$=quaK1oh)DT_+`qucodl^ApL-c$r2i}4 z?)_HRAnb{*L0FG6^^|0NB%$POsu{I+L(Ob_1PM=EBHqh{`vZVP+}~hZ62FSqB=L$v zMm5Re2;e&X9Tv&c`=fGtKKB|d`b1@ACB^*{YW|#WppD`BVAJs*h;pyvrP3_im|{<2 zY0OERT;nFuu)lpuHoj8k-YYV_Gkf3ij6`mBASXN6;{s-fqC+v|$O@S&n4J>9PT@b{ zQJzGooNUTMt{JGgjIuD~6$XeDJa!-hW=A?RXew}KYIZOxouQqX>WslfsgRZ`v@6*S zBrA@#2@Y0_lD9x*cYR5E!lD+YaHhf}Tp77a>FSag&rqzzCBYd*F?Q?1CaaZC8s!Qp zjHG?+6PQ4lB+)^Fosp73lw_BM?RVY|=Gn+p0$>~fPBM(6OxcWzqP(m~b^v82wYGAP zY?(^$lojfXbXQzCrANm=0q>9F|K0dM1OLTR{)9K;|I_$?2>&Ic@+bTT{$tD18jgdc zeP66uECt7yAM*;iDDJ=DKDTNvAQoVHHp&q|UA53u0QAiF0eT4&ZL&~6lE}sMN?1-i z(&tovyd`VyH)xAb)!q++ef)IvF_VA?4;Wkmf4QTLwoPRi^ICws~?9>)hG>4VWN%H_l}KfNQ6X-SxcA2cOoe&OeUwi;=%Z&q&Cls-~#Z$l=u{$C~j5^|maePNL zMn{-Hry}gFgBzUpPyjfd23qf>_PGP0SMvWO-K(hZvTx~)4>7sKHI@9h#WJ$+RTfDG z8YEwCANWfYX4kQs4v3!xG0!2yN(!vmva%!sKKCt9K%TsH#@^OYC}G^0=|k;^N}a}_ zO-4;=Au~-j3TVP+SeQF8H5l*)NWacSi%rb0joaJcQOXGOZF8KFIL2PM9Q)i%4`7aM zj{UveEFoR-*n6q%v`jD?LA_f z%x|7&)|LM|631Qn$@f6gzHcHPd;8w`xCMrE+283I^f=!_A$1AoPIvxM6#Z^Z+uuu@ z^mUhaD0~0OvMUmljF(C&W#8rdZVz7ngH?uW+LTTRnN*W5i)ir06R1hY*+ft z!=H8o_B;LVX7TP}?-{gbV22Su>OOWcy=Pc#=M%7Ui*W+p<4XZ=q_Z78Z7OYik zzhsx)aIZMPP!zrdRhTi77j}k2s!t7l7rkV&sk37Q?KGw|o>V+@yA^zEVV zr9>XQKE!(*6Zc_LkL8)<=P_o%3?-50$_5;Ir&x(OsTGlXnXge!2enj60XG+O+Rlq` zS0Ni+x!67Wr1*A9x^jT|j_rI3hpi#^T~go)i$}UF`lMjq)G8J!?$gGi9tU1^a9R*7 zHg_1?`3%CRs^BNvk3Be7u3?3@wJJ_C(c=kn3ZdaXi5D~B^!#DqE#wpuTc^H+mtch~ z*9N?~P9jV9B6VV|97AtpTMD@q&k;T&Vo$+7nfbxpmKa@jSq41IfnAmnr?T4;4;&|p z0%Koura4}D=GLeYe}nBh2dB)nfv_Y50>N}_g7P!&6CDnFvqLTIi}i| z$XfmLu)|DK=I74GA&HCA)soZ9)GyTClKa>xjnd@ppo^#E!i~~XBuZT7Y}q*Q3fYun zuJ_bP;!%~IX3`SUCoQNYqAT}5X+W6E6^^hX-uc{ajsJi*bRLTt{zBx@S&kRmZN@9c zm06aH6qqMx`sRKYC4h0IOtq3%;bB;L%}DlK%!CUYF9G)+oPgJYf_VYAr2EJeIvS5x zN2`$ByWFUwiR2;A#IzBtJ+JWc5j4*yV4{w)L@V&RE3>3;ns=6+)yw@3Ov6!`L3)kW zz+D0Zm0_Wwpz~QAdYfckyUnz|h#1WIGyTTKLB|p>d+p9JNoiVhB9G=2O)K$slCVwJ z1e-o7kINhl4b<#g+=KVw_@6wtu(9bz2vSiCP>kR*|}Z! zE?GBv6n^B-ZomdqqEBqV!z8FGQr#Ysp$#spgc}V`95|mBB5Ayo(${+B(NhzxzW(QIFAIi@`k zXEiKPPGV?cbF0l|_Ib#A{v-DmD~#rFUz8g{;u&Y#7xXNO6L-Zwn#H#Trm1Mg!;(r1nSr-r8jEWU@rL-Db%K9F~gE%}vFe+B5eD zBJLnm{@6;KT5L650?uF@drMNjpnES4uw6FI3+Iadz9A}@I40Go=pOEBo=smykyrOe%f>mhXvV=An`B*s*>^9te` z1$ekb;veV{-zM<_JS=0b-e&HMl{Z{xdjU4e{m!Q`012OxIibvezkxLM$vOgNWoKI{ z(tpalyFZRG`Nug)N~J7q=Vhc%tl4_@ShQ2^O?leRx}-g>p@_=!Q+OE4k9$gr=?AfH zg7i|%URyFja|1VBms!^fqf2yNg;H7wPmH*!s40C;$s7(h60B{Tb4sp1fLi!aQ>vU( z(g#-a{=fQ2`@i~-a+Bp&tOA-cmy>grNtp-CV!JQr>3BB8=gFZ&uy=T1Y{g`1*TSogU<0P<#(KKHGt$UPRFJ^PSb1}v58>o7%?Hs{y3 zw9rBsSXk}EI_mwfs5pyk#)l$=VU_^1&Y2pm0}ghtbE5Bf0Fh0zkUQsLER~os8}|Fl zL8A}DIOINvU~C=w9yf|mrSzsDbEocxx1^G8Ae7@)z&P=sNsF0O1eHlez^#N?w%=@9 zWceNJbl`&@UXC$p8-~MT;D_;!51mOrpXKk2j74kqwoH6(6{5_{COZ(7VGcgs@h5Zx zb7XFVMNfRxObQD00nmGYcS_bZGrjo@K8+FbR%b(=T8a1hpgXMvU-0HNw)IV`A?CNzSGlHWA4fKf z7TWdVCOq)xH)&!QkmG)N@sWsb7HXnkm|c2@d=|#SVtyt*Lt#7LLgsw#6R<22T z#}SSB27`jFd z&yx?bD&Oz*@lyX~ok9L!>yM1Lo!2CTW+3vYQ2Xhq-2QyNapu}Rop?9XokZB}N;3F3 z7EH#O8<4XbI^&biq2U_Kvw|{*kiVoaSzPdZy-O(bB}3_?FVin$m%@99EJ?eB2Jh8! z;EiEI)>|QjT^aP*pD{NXGx7)|8~fkzFlB1c`y4=`q1s3w3-ovs4QcmPSi|0feA|)6 z;i#Ut7X++#AYT4#-`uURY^+9v-5{^Y^$7{PPvhz~J|=NKXFS4+$ved45iv=~C+bkp z?5|?W2lq)Mfycg_2{861=f3!OWU28{B=qIR-w7@c0(~Fsl;quRkeI|msRZ2#at1jj zL2@`OtJGa<%qiBOq2{BlrjMKt4Q!HN?uVThnfsLj1l$^=nEQSZl$tCtV|ei{Anz2h zbuIDEUdfm_BfCM)-4~xIHl~QY0!WmF*m&KBhuyBSNQ{|+)d zM+|+Dx`_J$+@_1Y@t}M*NV1517u-LjXizt#u<$WWZ@!H+ym!I?pQO8WIN_CJikWEV zKGQe?Y3vj;(aw9O@o_owdHwGc_)T0G>1f5zS+3AtC-xqx)`W*{9Gyr9-s11V zOW2HHlH`3xH`kqp_aK_3*{VO4Ek3>RmMhx@0arE=y4s&@J^qBZ6(r+ux%Ai}`=9(y ze3ReztA5P@HSuw3@e7YA1asYtPl?Bxma`9fX0O)g?`_8`WVgUZ(3y@j*oS;W{9|45 zACP!?c2man*tA1`2{=)@%aKlX4Xm3FTCb7Ug9N!J(i4!MWQA3munQMYWgCHL9z zxhts%m{aGP&fa$Fv zN;2#PpOl~(*EM4I)NjXTU|`Ysb_rtf52xpA94QAr_lFQ{d;(!yFsYBI^B6z-OU7fR zT>_1`%fqhGK=?wu5ZMnBf9_0pc0XjYFLPn>=IuY&&Ob!jxHs6$mEYDQ{$CO=z;2LN z6OWmASNeZSya2mFUd`T!oPyc&FahL8p5xwzcid*=`KB)*=#BaV?kwa=ra~v66Lei1 zrG@Z`85u(M{(rQ+34C2u)&G5a&dr^Yw7pH5q)FQpq~#a{YEhn>1WK3@6%`ek#R&z$ z1NXKngp`VcQ$bO|2~iQ8M{s@|c^tu^D&hnR4v4dl)8pe%-|ug&ea<~eTjc-#-#7W3 zd-hp-?X}lld+)W^o_Y3L@Mr~qVA;FquUsvD%iWUwpxqKbg+6PZth)1guYXE^<2#i6 z!oF>VRp^h%3_9e5fBoxULFUSL+1kw6(iYP4smrGl!a(V_32k+WywUo3Gg?$W;^ZE@ z$jRhqym_f;@KS2^{yA?Jb#=q`mYxGi=5rPH5BN@<&3Bxh2RFobn&LAljrUJKnvcQW z*7_WV&G*0X41|2@dN9drDqa`S!jic zk{=K#`8_|AGCKX6ISy;=l3xKII!I%10kZ%;L`_JH+Lr1F=~yl{e@UP|?-oY2$6hsRm5^fnA%EeuQUT4wWBY{I#>%5H1hBBlbX{8KBXNBX!rzGj*snUXC{t4vgU zRYJ_VJqt`uQ|4gsq>0MJ@(C^Hs|@Xb!*WmWEne5%5ViUpcLxB_7gp~Fz4{JXEjL|j zIx4x7By~2EzVzArple-AnAS2~FwfJJ!vOOgC&P~Zg6eq=VTU#zF2F)%6bPDzdaj~~ zW<|WKt%BY$pb#c}je+aHn;C0VsqrNN<>bHRw&ETtjqvyc9wzk%y_>w zLdVA5)LE@s;qB51u?^-#v(mqD`gM^I0ri>Gw&~AXEJuk7?gn;{*ey+xm@n%XBLn2TO-W$z4QB3i9R(qv#^|>1}De zxMGc0)qY1)G*iRYq!qztyLr8QX`a7}d7_mpRU!Co&<-HhvN9f@yoZm=HDNLDaC%&Tr~kj8+_WMaRA+}f0z8y9rpWA z`zgxIm}p+ipu(J>(X4*MS_cOh!rLV!U+W;Kr4{*}DmQBzPU9Wc zHVBlB9mwr#8-(C!6D7?7)-Cm(7YriN7)g&*fqGbT+B{Tz&_nP~(7}ylZ@BOca<(Sn zQNU6SL9y^54$B=1d(tu)sLg&oG+4OQjLS1JJa!Y+bT_JX|3^`g6-tqlHMYweRg#?T z1X@1zMI#$_A{yJp{d``(W#6AmzyWx*tfSMYLOi90$;HN z-|?~~6ijtK-I=ddu<|&-M6L!=S!~9dxXO_-jb(xBEo)plNA*VXkbSG>N;oIBH7t^m1s0)z!dU?wBzMZ}0 zNh&W5qOp0Yt@<>W`aDTf)lr3DjP(-V0BHz0hH9!I169nh$@ew*=9_#?`5k~ZtfgD{ zwE1lYA*?ubln?1JGv$&UY zue>U8GGJw>b{&Upk;e@mw)V+^snh89?7XwMP{x;+-gC3hk!NW?AsQY|8hI7=>1pJV z`LFg0#rVKr=?qdgZ1UMTNTU++T+O^~$)#2G7C^c`VePSYI=V!|Q4j{Jv~MKE7C60x zmIaetZ9^76>++J*A*nL6j`ksWqJNwaZGILt!c4Ddf~BzI%E?mcy>vmI0+~2jr9}Cx z?i>*Ggbk}%-+%7O04A=6wnqK$8_U)yia~A#WE(dqEkBBH3 zD|sGN=bjD0d?Z+ZF$A33BzH%w&z+AmTcIL%oL)lER-dTMI^g*LqGSUBqvW9$ zulLJpT^nYn_{xQdOqI-8{M|S+;xAZ8+{@hTbK!-u-Y6Zb1o21jMkG3m#Pw!e(X6F! zR_;^{apcZRMKSm(p~26b@pR&4qH!9+To=vCXVTYC z&PPfwQ=Efyf!$$f-AL5q6B31h8Dp_F$H!|5x?n(Te7ecI~xzYZ5`yWK@Gi92^4E&Ve zAD>sZq9yIn~Y$#FZmrlMB-$5PYm&yuVJ5aZc`ptTK5Mn-q zuECFJkcnsd0~~1@ao*oyxLPvwqgiDIeut8iVWA>BeTJYXBlfyxBh}KaJJmq4wWsD1 zXyQsXiW++nj6kog;Y&uL((LU>$y|6R`6|}#fO*>1#?*gE4~v;*kFV?NYxcR>-WR63 zON+3$B3kB|)3RaB@0Ff<@S^?c*sxadd!^T$uhJr%n@Zoh%;&zRynIn9y>KvAud*0h zIiLWHv3B-dgkdc>{meFAQ`d@wF+P+&9A2@R1ZURkd_3kla(l*^?Be7AA$cw(4BS>) zl*Wugdru_oqQeZeOuepRYyPa!Q5W?fg4{`n(w)l{E_sN^4SJk|7Tq1rPI@dp*?6+8 zZJa1QtW)au^iPydxzvX3SR)>HUWcp`R*-l*-Cx=Q=~2??i|o36uSN@FIV;x;*-);n z_)t()JxKIZ_^ny#V9GT)M9eP5$JW)C=S31K2g|YPmrMJKe>-L-U zm{QiRX{K`)4>Im|FgUPR>~y4Iei)FJ1ty#!BXhA(=Toz}PR$P$D;*8RMSGcWldNiwoW(QKb zGfjwMVi)iS3O=@eq;xHMWF=`Iq>s&vS~r2O9h$8>hpL)61 z`Y@@`RhD<5@#+WQ&NzLsgjw!UgmM#Wef3Dub^pP}O`Vs=8PP_%ScF`7p zSreIg3LFZYd#dcE--KO4y26uzVRm5HBbk3^XaYDtnuj`qLb;oHD0$uIJk$y8FHp#~ zJ_~~F{XT$8wG_E^*L+@RfC0t`v2#mox}pCucLBg?R$i0G0*%esWo&9aAC+_uVx3%T z5)z8`obL%JIfb7}`T+agi{JDgtdAhegcPTL(?@(Ed1m(Ytm0t4XUHOhCCxw0IxLEuU)bKcuSZwP?SmfKO$w-nnZSca-N>WrL$mZ z%}!7v3}-;6>?cj<5c{Y#avO9L}jsD|JH&@B6?sMIq(Dp<|!o*0`)i?_S_YA=xX zQW#r;G`!IRP46<0=kMCmEMe9X#`jbBZkZ@~Az_kJAwD1ce85q1p*&AB&r5LH90I2{ z*d762;h$bXD%WLOG#&zyb8Vw<7RF3n-#_F0)0cb>c=UPtOG=0S{!Qdh%JN`<{>F*m zue+~w%wyF)Z00g!^1=UxNy#hY5uN#DC4V@X70ZGfFYBU_71>@utvO_fv9$NUxzdrIe=ADo;HD3~`}}(Wfo-lfO62r4b21w|tN!0aA7t?~ z$$x&Dhf1rlm(X0;{d1`6sXjh;vt?r+agHu*Bzw+J?xTQ(QRRX{D(>ef4DCK34|^X& zyTy$kY`IbH*Q^`bUw3(^#5pf(a(Xsi#`soID@OGpTXJCL{G3u4(%B`jN0)&1pFzOY zn-7pVIvMEsH)88^CM^HXMx0icvYKRomlbQ0No)6o!=zQ*D@3Y7UY(`98o-{VXJ6Xq zKH{_K$E+OwU&c4K{sES#GIXzfccOQ!rkp)w!0?4I*@?`!!HQ_bkqzJkOhoN!)= z#x6(F+Mv`v4g-;n9tS85Z(&1e*swIxer^t5vE|YnKH9z{hbONTxlJNBlssE6wwoz> zmBX8(*-HpDwHh9x+2_kSAZL`kT+?6j!{ij)5ykV^`lR$&$`E;AYeZ%trW+_G2l3>> z7d|mZm1))Vd_Jh&c|q%MY1m=jnJ$Hr7CJ@UqBfvjX0u$WC6_^n;q4ylcL1w+xf4Hx zvLQ?B?9o#Senq;~-IYS^Ht6=ne3xSAgFPWDiQ&{3?yK;U7!HOil(5~FM2#X9@IpyM zm6954+Dj>3JC{T+hYv2@6#7kDw!BpNBHOq9BC@q}6&bo!F!Pw$vSnND|Bf3of5FTH z|I2g#pXC06nFl(kuXHNJ_a{F!v0*K-Dt_F}2(CNOz#yw1UP3r)`Noo~!SQaA85&me z=YtR64J{>L$h>DPxU^*xUwn0FjNYUspPqa>g<(%30^t#MT>? zD`V+va5XB+H*PSFD(P$aX3xwqVuy7)B~HtF9qwBCdi%YG-~4baX8o71|Cry2(0Kzs z{nhkZUPBviBV>K3o-&2sNZ$x(9h*`IILYcwxVeEzUC(7b$(!|6sYi6;jef-srAl8y zuyw#5hJSk>CG1#XQXXvw!a%KuOOlRZrKB!Cu~MvCi!78K7g;ClafHYTiFshoy>@~O zl!^X2pi`SwG}UF`EYYFI<@;`6%GOIb3BTNA-uYygl&%_Hq;Q%q8BAWFQYbl(m1s9h ztQHA#n(-uEQ957gTZk>W6twIJU>56^)|B`$+4YqtKMgV8**M9t8qS9xhyK<}ac3v8 zX=B<}RbTY7o6g7JTQfo1P-@L)ww&wQPIF{FTEaldaI+^HE(vl|Ki6%9y}H^TiBqGm zV>q|lbqZDbY{^Ys(|KnoI44t&1wO>dPY3b#9o=Nuvk-ubVMZzvZ9zWNm(_j1?0S3y zD;m=@Pf)^saJ5kzK2)^{%9@?pX|t2I7NNJ=o~DfW?r5LUv-ZI2{?Vm3{oKdLG~a+k zOB=`=U&6!%A4ON4xtiDgolXe$s6{h`B3l;;vvy2*^VDsULMVuPUe5851ZMg~aWKocG|TwCNbB+N#Q>M-rpooWUHO|0D z6gNjqB@V1;uGm=^FNQ{Qh4HXB%k1>+O1Bp_UZ$%1P*f*!4qDY!_0#^Dsp{%HRZYF1 zsS4V|Rkc>69=a0c16SYXxd8{Zzi)KpJF`bMKVS-V*a`vd_o95gM0+zL-Kv~!KTj@| zz4mM6Qn_q@L@t?+?OWxNT-raAOQ{<)n__UQEQi6ZvJZS5U~K&wyBqHz(jUpyXxh+c zn1QL?_8AUBH2HYLhFm>!Bt$U#-Pj8ADIYCN9xgcH#$%K+oo{9xkkhnoVc<-7!OUWd z7KJRBS#H)O`x7X1$87X4v-yudy);N_av5Xazg7a!*+1sM?}RXOJ)B$)T|8cGBGNfa za;5JeYMRsh`<>zYFtY2_grLn$ULlUa8C(C@(l5wc<|UY`Vs8j0GmGRkDt#rb>xX%? zROfo0H&G1eL+Ln+(mlW{;kyp(oCOa%3LM6}^>jSrO)sQCF+nK~t7%L`>AT>on$~dk zwH`+Vwe;OU*jFl?dint2h@WjWwi_{dr6l5EEsbG; z;`P?rE|?5fG(+ioC7pN^)>ed-Z*kKa7q2zlj)poQVP@wfK(OR}_S@LnPc>O1@q{!=*(p9AR#j9Zz>5YkWJoh6?Zr9fmT;0$Fr+Z54o)ErL7 zM5Zg(0IpQyBHKaCU^YlJy>r-Ey^Mf^JMBNl?j8+5kpu_&8L4_Js>t`{2p46a(|W$i{R~GoEq<9*W%36|QYsB+7r^LglSKV|YdM5A#*Y-u~kOc ztT!`HmR!>JLyx^M(X2drD;zJRqO#FS%A#UPQD-Tdy&fz-4t#h{?x_9wtkrW8+hh@1 ztCw63PqccTr%l^0dhq;mF|_e8qbkO=Tg-&f6((EaBtlEqt~_tW({9)F)HYl$JC1xnnql9f>MPHEUs5WDhywDT3>zmWVHF0l@# zv{7kWIma?fwi5> zUmB$XnPt}bD$#6{T{V>43NUyH(D@o(6V>rvyV7P^6zbY4cy)Z+sZo7>fDxedim$8+l zTgit*ln*1te30GBlwE$8fOsEgk7DeAj?OK zfaQqElELN=B1_wGJ!JM(e@jBDaVpa1Br#P=+}jaCzb#X!CEt)6x^<^phi-2e!>f!p zXO6WP-UkocvCkGIkYg5B8Map*_YLwH=pkD~SXt3zC7H3=RJl@#*(5W1qB1h`MuK&| zDZFayA|oLU++gi%vo?0pk@O8qr|}%hvzVt@8(%!FG}wI;m?%cgyD;B^N_rbV!7u%` z$kr8oNKLa&2HlxuP-S5Th3aqt!>>{M!5=2uO*K@=W^6%?Vz!?nC}v+{r@*=Xc<7>1 zX-0WFTFl!8bqtGfK^Dng0c@<57&Uf&d zSJ4!aSG0Cc_dY9{0;r;mr+MxAE<}9-Wp%Ts5OK4|4w$WdB+zOLGp952Y_xT+{eb&PEgW}X~{Y(3X`a#Tbv z$Mf%>92G!vT$PLQd$|}_Ax1?LDn*Y+7qu_W4G|Cd=x4P)6Gz*I}d}eLh=W(-| zy-5pR(EGd7H&P{PSe*+iEk!kue1phrqmUy^9+~5A{vL7qp}bzr^*!hkNWV||dwqk1 zdD>he^|AGBUQ`4_vX*q#2rV;_cTD z;4i4%tfk`gM}I!+==7poFu<(2Qin3inyc7D)hBAhyJ)S--de3EM6>K;8tUg+ zvzB~QBM?1mjC!_RNjmcqV$3mRqXy3#ub$)%6{x*M=l%tc+Aq$8x>ErQ2@DMyl~w7M zy6!e;jP+~Q(~rcN9U|zBm<*G3p?q~U zqT~Jw+^`#4LpoVw*ez7;>c=u_QryEu#XY<*0oq^hX{g&BxksoxS$2=ww&y7QnDe6a zSl7T;TbfDQa9%ItAv~8SmF{eHY(_Po_ zV)tV>fdti8QlD;|M@{b8JWsigXMg-!Jckx=CaCOY!4D@NhOG(eh<%QP&+)o{ugJdp zldl=x_~Oj5BsfMK(>gh2(+6`W&?TCPdXldwh{^ArQSwnfeAmfp3lR?P-VQjnoi^St znBc5T?=U?9DsJl8_uARV1K{#Oy~q}9)_O_h;V8)}`3Q9ACM4hDU75z}C`Ik%%4s#o zvE^%J+buwo|H<2*z*J4h&J-i(jQlPS4~R|gyN9i?w%({t4s#S#OlMK)dxG% z=cAIh#z4$LQ2O^D$zbMi*vB%MIe<~;hDMSfSp@FB%iKTYm`xm9;U(rZhCmKIJ zZWeRA|0}#d7v7%_?=OV+XZ4=Sm8|rn&JnKLIhD-AGM@1vVqhb+a!XmPb}oBX;a>RI zeXE?V10~-U!tK@O-WOypqBi#)a<{L`^4lZXb}8p;6*9f*r)hf^W~lE@or*HtXCs5_ zLdOOuz*0E3P0p*YE-m>1Vz@3!R2n$3nBTCaP&pDd-N>2#NKG_hbS?m zI6tj0XnreZ+=Ss;#J*$)k(ea#ZT|sk#q53>n~U7Gcj(BB)FaV8`ad)2u9z3?3b(Wt zCh|Thd#sk)Z7)zE>&EJOZFz}}Fr`NoWOAf5waWW(JZdyf=a~R0dkZc%^U(92)>;6r zRIHI2u^~AwvoJklpiu*@=p%>KJFi)OYXhG0o1&va6!M#+1*2Kj@#Mb&O1#XHmNoYq zc2qaZvsN-rVlclv`(3Tc=sD=Y@WmGupgijGOztN5x&^dGBLj!L$%D^4f#6Z{dqQ~g z+dffwVZGNV`7L1Q!Veb;3?%;q9^zbKozL;b)*6iW(`RRTQYlpdxGtyV$#N_+ac-Y!xyY=3~Tlk;g ztr40Zg{So!98vPW$b&+mLC@hCDbZ+kb=w_O(gnS8%bkhbQ~HJ~UQ{rd`f$CWqmNXM zulqUCz zR9{P3v8>_KvA%Sw30QrcKI`LT%=us+3R7((Q_KEdYzHee`~9^zc?!1Pz!K!yToM8X zRXl7;XE&0@aFZsSi0F<>$Y*b(8OqWIOsOk?+J7vw?(=UH{Me^QrG9*RH0WeM*Y`1| ze?+jsnQp3o$HzyHxGJ5M!D6?0d6YV>O^P*Z^R?$|Zwl7&M&qye405~3P+zUz@8zDo zk?{4k!zcDP%h%Mc&v%fT@j|&@J5U~4e|x=#DycFH*c-5>z^d4l4tCgVWR!;JB+lLh z$)S`L9U7KnmM>H!12aPUOFSl``tV7~UtnjTIxjfr^9a-`Q@upArbHTSogF)QJOb7j z{R&F!SmWF?e9}RCfyGkj>Pf>Vv8X_)(!5~cievIXZB-d_3*4*Ulk?`+-%W78?9aHV zG048oEi$FjW4p3PvQlOd-KXTwIH;w$ZdjL{bFZ_V_Jr5RNk`ZuNtmTcy0VX}Cz+sY zCmpOF1D`f58eptF5n1P)1Im6QIZClh4($z}U`_LH0bN*amQU<$mTN49u^D3U3GX`4Y3Xc zv}KZ<3ivfPW}jq3s4*wiINiAPG_dp+Z+SP=hOeaaudaH$1vOkAy7CY$Ht>(&H-g`L zi+=hDek<^MU(rt=!Ee-#(96>!4S#~lj-?{3K-db;7$p5biXPasVrmIj6q#xK66vQ=_*2y=;RZU*O?>hPK$*?X&`?4GQ3 zTXUCywP8EJ`kLBSN!C5t|FY)y@~jW9`IEi3O0-0*e55b-aeb+OW)3ib{bvRiR%hkKP-hrNx+g!Ca=MpZ>7Pj|Bld`<%1uCPqVBAFaKr~L~UaB$l}vuqs**b{Rgys|83RWVX?~P zJ1>)|r2hn$tPK0BTBW%UWoz4eO3TnqCzHaAnm04(3C@FMRp{ojARp_chR~5Rd&?fk% zOTLNdS7o8KM}jaW`KF1!SsNv2P2p<_UsHIKKeLV&J2|k`O8Ppg&DJ|qGjct6Z&pvt zK{?Xck1XL+OxOJo@36)sIh4?LwYF9?6zoB76Hhh#yTE4*rvU*KZZ(D)&(R}mLywwS zJ=yS|nT@*qLSu8I6JrxA>AY>jDv4%AZJP?L^`i%qFAcHefuPdiFNrRqqZ1an6c?|E zWnW%GTKr6l)5P0u&=tq%wDpTDzLjCAi{K->TIwSD3zxcxlbx5k2s2yilC?W`12g?< z4$^}D`f&y`hr@o7!OY>Xp9(gGZk8iT4>TpHjDW_^GJJD5{yiDY9Kcv>^K)Q3t+f$Q zI^T(zpEIL-dBg6ha7gl4NZ8%&}eZ#Iirb35M}Eqa~>t1lF)-khh)`Ehd| zDd+pld9<9@oAY6Ek_DM~v{1>%xr2BFNY4{iM*$q_@%~Hkrt;Ep6~Sva*>Hx?9^6H< zwKnMs1XYo1f0(l1#oDIK+PCnXyce77LOP6IqC=@ao-h{4kPnHTWCIXAHXpQb8F^oyl z1+vO7)j7c9n-)@)78V$&r0`NHq21p4DUChdLS7feB0f&=S=ICrAaW)qzeDT)n>48( zco0;dwo`l>%1~Xkiv`B}C&m{~j4vUMFYGoBt>rwN8gVAHhFGtdD|0^ye7F&|pDOl| zleh-Fl|a8*JBc9@H6wLf5NYZ^w(S_T5wfQggtZ@7d9zx+@7jsJ;3Uv4k zbdwYK(ViPMo5OaIk=M6qRxRkT?R0hDk!k5xcaKiXhKbUX2+gki^hCX_QD8d_V_Hq0 z-hCiQ%4Qi?Qjx9o{Lm^ZGP}EwDI#-QMGEe9 zQu|M~q?d$KDzltZ_P*By!$BuB(x-HBqFvy`!coJDyhW$H3!EO|JgtjU*#%BjIBG=$ zo!TyN>cUZ*8gO2qjl2tZz7&`>qu^v`)jq@Y7R&w{BD$DF>hj$u(BH0FcOIW!d~B^; zAM2t&g=`km?Ni)mdEBnE{T$r0GTQySrM>vy(Ox3jXYWk=?2Pu(-O_IUJKD=c`-rjt&7*nFS)S{7 z7{o2z&OBn|Qv@!%gJ6xkRVAmJZ`#=DqZ6o)__8MVHus zS7McaiFJyl7OQEv0p|v6jzwOoBfl%!L7fL6eX~VW!OvF(PcKqx38EQCR}6U&fjTcj zVR#TW4_pNswe*4zvk^roud)O4y)TNjo9T7Zt{; zYaT|R&fa-E>^7i#G{&a7xe(?j3S&(`9!8)}l8347Sbny`)Y45Mj7)2967nztbsm_9 zVP`Vk&@p!SZ4P1Roi6ewA`c@_XCe>N*s=T^h2id|5GL<hy(x0*~hI!WT9K-V{o)dQSoDTd<9wj%! zX`Ro9u9&mYEKTDCM;NavZ&reAcCmf&XXbCr^d+>(%S@o&CDo*~+a6st3|CuO5&w{pVET_wP62G9mO0^qb@o+x4zT@kT!bHe5Rhk*0Q&(g;UYcadtI-|nkcv**BBd<^|usyRYwKqeNqBQD+Ii$y@lDU{82*guxnJnC@miR={}f*Gd!X7}a)1 zNy2Yf$EZYvb&QstmxuHy>{~tTuN3xJ24m$&7Xh3z5a%q%<<3&R4O3&fjS?-O{W1{LU#lW=`?r z@f!N+7ay*!an!z%^yW!R)UJZB1~tbQ9d)OGtI-@^7UQ%FvT10`>=xiMSaP`TJ=u%& zo=5%=RK1VE26nd;Z}JfGgtZPu=_yYYhinsQ$tcNb2`&>1_+3S~(jc=RxEjek4X*&M zwwgs#8+h5am!*rqQj?91o#nIW%G}3C4Rh`zx@wPD;$0{>XlURv{ndBgPQyQ1@VyK_ znf&w`GOl+11HWzZ;ULOi zWU&?#^cvnR>1S@6d@tf~HPGEs ztA1z2cGMF0!@iK00f}y5ihZPh-^*j)>t#}aY4nH2+-IPqzqlZmh;NpDElBm$a-nU1 zZdO=a6plM&AoJ9$aXO{a zM6F=Wb{4)efuxUS>~UX^s3@aaMP^xKGkI1%?( z1R5yERohukANgPqS|;c4kv?M-Y0E0A#Z7J<_zbSF_U04C3qx2);)m7t__4`xdL)?C z^`%I!v`^`{3$i;omX%%y&lig4?c%vBTC=gs$yZPzo8;4ydEeOxOASj)m^fP3Iv%*E zDCC+f^z;xA`)YnOT7Na(uCy8P+G36sf}2f(^wlk`9=w)v_c3}#^HJ-(xQy<1gA}mK zKj$x(e^>TvN~7qnS(Cj8&y#(e9z}$e^iar~)caaD!*sZd^*5mRd&bn$!-R5phR4jw zxga9_Uy#|Geh212Pfz*|a&>rS9G^O)5=VeNDZQ3`Y+<8Y!!FLuva%;V3Q)*O|LA6A zPn-oze+*$Fdnl3Z`x3t=s_gefF~{OL8m@Qs9QAY7rVhX`D&7UlWQ-$+`(k3B1cUpP z%Kzg^Tfb)4f#Y6V`p!SHvaq;x1*y0Q8TM>88CItD0Z{JdooR|FyRotLpAGoz3WAX{M*SCSu+OY^YC7awqMmj46m_bXjZ9?!uamnA8>u!Xes zRKUKc)nelqhfsu+k=68Ae*0=unxy5{UgGGl);kXuFt)6&rH|mFmOhf-1!=W>_1#4y z#a*i%C705HrC8Ddx8i)>hE_QLd4&bb>2V;oJ^`B3Panni*?9UjunNOnFb(>b-{Byrik2yJi8 zaG`Rlpj6D+Ra9})&w#Y?s|@?sU2HkK*gY}qN}+|uM>>3L z{qhpyrKPP_hl4#S!((tFdA8D#UuDd)NK3;e28I^(#>PqVb8(s6tKaTooW4QM@TO@{ zb=((HL0J!kH1=2;O)u1ZBYaIrJ^eQ9ohjQ}?o-*;?H>B}-?D;JGdnj}Ds3gZ$eJ;j zY?ZXbS)GTHZ`)VbJ($rMoaL_tW+=d5>!Mw=oj0l7pX0&pvF0Rh2 zTlaSHd`W&K?U0Ba zL#r6Hpf1wKQ}*Jva- zS%=&gbg2oA+Y?`gg!L5NpdQ=rE_c|O7*f4zdX@FI%LuxE7G2(d(%W(UWEzd)laNL){n`ypA>p@0Es-HfyEpkyeS$0iGQy=>aPA3CwZbKZX zY2WuN#iRt8Ds1nf9go1P2TV>n2Qm2$1%~KukpFWs(Yl@#jZes$9zV$+i zQ3PiCE9^%*V<&E2S44%N^-tpM|D9=4Yx~KZV*ije(0^C%l6Q0FARKek{{WWRTTDAO zxDPZ={y|xolMgh&`DYg=!76GP4FNs>8>PFU#f)*Y?1%fJ2}*th4$G1i*Z9&WjxV*- zEW`KA6US#})DSZM^ijrK7>An2O8Z{&H%k6V8AzT)@_SnsisojSF_TVSPWB!C8}eMt zMR3-Y?3VmfjJ&O&Jn)uKsLIL5kU&9$2gRuLdbt`by$oIbVx`%}tGGB)YN|M5MF%xl z7<kmxMtyn@5oq6?CDPej zSaXVHGaQ1Xe5zQpJUFovSL%4WZ2i#s)qHbCwhE8upJ!3>RK#q9y%X$*R=x)K({lLz zp>n3MW%n+i^7I^T`EzWvW-EMHIggT`NRyxo>b4~NCEaqWOb_KWltYy7cbU5EYiSKe zC~kWimWo^dGNu`biK|e`cEEH%?ggX$*juwEJ+@`pw&of&{ZwM7zi2#o*;!tirtG{l zFFQMxoW_EZbAQJ=SIj6yg&Zub54T%b`QtKWMlrb2L}pfcwqh<=Y^VV1*;Kt}liOWYx8ZVwsE3UP4$@e?+YIRmIMch- zfeFELd#Y+&b_UEE`d3n5HpIdKco zO_@T_<8s^ZOQ^d**cl$3)+I$4zsS)0bY|z%J>ec7Zs)1^c)ZJ`Qj!vT88V5xa}TkT z_PK{jGNf4+aZ^e9Im* z&)!gZx$`JX%|_}E^-gp62rDX5_hrlPyFKL zhh92{?Y!D3UR+L^l4~gBb+bq?f0i1seHFC5m}^b{cwUV=zK_Dv z3i@kV2@#cEWo1Xp^;pe2*7_dyMQqOVA&${2=!o};M3rhC?YEz6Wj)!O0n zLADlj$hL0LGPi+vS_5+lx*%?MnX|IMTn>>HYi_sBVk?(bM`bIU173jjWH568W1Wrq z?kwvWw)#1+ewo?AS0UGVbGqeCqr}AxSr@~8+EJ0Iaz6w)lWY?Iv`nP{7~j{5Atm`T z)uJsikygBU*$ir5b=XcSpdA~3&>QOM3ss`ZLyXNn5*oVN%5FVMUqQVe;4Uhz0!p7v zI8NJZ#(GfR%`(F#?`pq%ymTJT--9SV z15EtXtTJY{u*TFlK7(_}iT(d`Tev>+8F(zTDSb6N-or)Zdt zrwtVjr_A~_658K=wp6GfwpfgYb~U2y%tB+UpyriaC6z)h?6cMugs%(adYFh*1>m=9A3e%86wz7eZLE%$Xj5n-t<&bmRx872d8g2RvDd?OC z)rn}+m*jquyZ<8hGtJ%EPcOc)8}11_9RN>O{y8(;xfCRMU4hF>#O3QVE(x!-05e2- zjd-&_n{R@uA5h~&o&gab{<7~)^0&(`vCcimD~Uv4ZFeTS!wDo=vOZJtitR>Pi?3YT z6ZjicZZ^Gz)G`PojEYCrA>2Ba3rc=mHE-$5Xg)O1)cQpwpNy=7#`?usz2o%xq%H_1 zhrM7IuuFFVV`0KhVK3|A9UtOgS-}ehwHzTGC*<(K^hNTp?6GkvHv;@Lrk&rQ6h1zSi=@leR6R(%_(){~+ zFDD{z5ND_$TQ+E@AJAj^^G(J4l20YwA1=HwybOZt-2NxOj6EE8SrZ=;@ulCg5u=-Du~v_GRnpw6@M*eWd6@{QNB# zG!~1P>^O74-^OS#Ip4~5GRJFT@puy%B^TjNUzhXf->(nf2fBZpUgLla{|yWMuXTWA zfMAmHdgmY=^*0F%1T;!c?IXms8$nB|+&8kJUn zd!2Ms!W~o`=~YfXAdDiKwIRoP_;Tk)d0Q@6csf3%x9k+Yr-)|ZDT5}(|A2|S4CWB$ zNNbyAt6wjAo8P0ht>Wj5Ti8l!wfH6&uqmXMEAh(fEI(D8vi$UtV1CyrJ3dG#`BB&P z9j7010DPJMyt3 z#lAn*jZfck`f&$jysEP7g4PE_>p#0;^&O|5aKKSfV*a1xGyT*qV4rpvGBdn+Y04q< z(w;Tm8*k_1(OH&$9!wqP?n}K#d z3v{cX=9Rob`tRCI2}8SO7P zDcT~h6tqbz;K$k|bHFXI(F|q|hmB=0a{wDyzr>C}ek*ce%hWCK+UPI=+2|a`Pj6JI zCbt6PVj+HQP{c>s7(%4WFCaIQCEFLG*y2pd@^A6xe;`#;)$t}dJ+I=;3?gM z-$Tn?xSEbW%Sh?>@cB0Q8*IeAEv-?knjReH><84KF=eecYroPjBAaTOz|Y#=eZNzg z{D@G}F9EHjU*@;3bs3OlQF03({pIvlUiEZu@YAp0WW-A|Wvm(as=l-& zwAfMOHQaYK^lFC9+Syg#FUEL}EM0SVNto7VoWuL=D$mB_=!HP5HnV{)*IIuHY201?E6nLG|@L#2UDk*kqcAGmRno3(3>+3813#4~g+-j2Y z>nM%|tm*elc{cJ~8J@@TJ|ei!EWlri`{Kg44G3-n;M}#($mOmo*#2ObDUCu;v|mLI zu?`2?dS}q@E$H9ucjB8ObD;em$8T(9ZriOY zsye?T^r}_H)rQc!FTK;`p|WIUa<5o?rC53gpUKyVa-i12*e(rg9NKnKaQ%4j$51d0(PBnRSE=18T6IpGs_`AOYgo&_ zeMPfYkc|LUV73N}de4vr&KHY03mfkACBX3bLy)E(o!6nB9Ye1#)S;yiD?O$3@l}hg z-i)n3v-A)0?A^$5u+cegqgHK{=YGo3snuEiS~mA__{@W<2zV9!blb@NS>kV%G1 ziinnLLmNqBH-aIj-(#vR5Y6>lf9qs$>#p6j@@>9mm^=typ!2nxO*PsWsf~vRf0Sd{ zO6ovG& zX7P%dJw$(JPgBNPMb`T8{J=(XO8UMarsO)w`5`%Q(_4|PmHa2bS~$>3+YDRJP;@31 zUto5kzHJI>h{_;lvP`$6F~}_wzGv8rGoya0DutN63f`Ip0#OCU7pV25cN2Eq1X4Vd zB9*1mlJ-Ik>IXUtvQr}x!AGbCb&4t}%?s4kw1q%c4&ICQ^R~|d?LH&taV3F=2sXW4 zBCPKs>s?%EfK!$2*7~US$L)_3r>lkFX(Gmb+5*I{6cOc_AwF>d;$1~Vc^YC^{^v5< z^iJ`~$-n+tD58N+PODi!^{-v3?&;BUw9Ep;^0)E?xo3v>j0K2;MMQaKh-WWA+^dKv z&tihwN8lTBUJdlZc5A}d&;F@&&KZj|l;qJQ7iv{IP^xBaZu`yPmkZ6dkA4qN8$-XziE*b+ zE@T-_R7I8+306tI#cxYZLRb}mU!|7(0BCu8H<^1X?JL2mrbpprBLSP_ZKmW;#bM7x z)xg=B;FYBZP_N#L+!vSEHYVwUQc-1nSe=`~eB@h3jej3v-?B^mTk5OQmd)bdQk$ll z7WZJ{<+G~kwAk5)AC$;^pM!SmbMS6`HWqx!UU8M`#oQV22}Ce{NZ2D;UaSW1yI`Zb z+MB+ePtQv77-WkvG34nPGBTq!T3|eSl5fk$kQQ@jrZT`~Hnx8M(l?OV`%GpQyXocj zWzhGc#Y}up@*P4ni2ehNGH}4<_)Jn}&S>%p#^|uksIwX+7g2xBFjbhGrYc66)sja* z$Fja$TdYR!XJlhNJrXEer>uRzx*7>#{j>D`Lz zjvQpWY1tL-UOlbhm4MW+6Z*r)(ivGp%}SXe!rMq-u}B4!-Wjr` zl&yZ~pH@?{*ewyuNA8MIjR9oM+2S5+KKZ-{k)}WA$NJ!Av%RPEoW0y;(|(a7ApHKW zZt`m<3z-+UZ{t#GeeVKII*i5S(4x0R`8^?HKCpLD7jb9f~mdR9#Un`Ew^Xy{sUvSDeo=49~!w?)b4LGU~6>gD8i z$DWxI8TZ;BXWe=<$y>0)azpqrGKBw|#9|0vj|ZncHhY{xrbiogdk^7Dak+gd5-@A0 z{btTBu)1m$Bi{TW;+nLMnfa$Dz=Un2Bh>2^N?m>TQl;{GO?F_z53FBH;8KYq)$Ht` z4`{crgrZ-c{y9Z7s|VBH?|w9+L{CU>!Vf? z>nxc$MqbC7SFX8ol{KZNq#2a3njEcB8{cdC;YbC?%nWTe{;vD-MRuV+4^%ZLT}?lS z=3oaPs^t#l*8dWOMGJUnK%@1`T~Y92Y|D2Bs%4j+1{QP;(A2qvSjKTrI-t+yB$qX~ zrRK&tKj-$#kStaevEc1U)$E6wZLtYUf6mfY!7vUoW~Zjz zWbIH}qX*UoPu>abK{J+GH{dKtXKnxF9FV#hxZYq>rudc}>)-p@x6D=lekk9qWB3V% zM}b>$a#ecfnM7K3BZ9xCb;dH9Ym1-?Lgn}?oR@>(m z1P!#8p#n4Mp+f4>keMTeIx|x0r%-;-^o;Ds!T#1ajqAMlayilDI{-DyZQ0YF?3M#$ zH#f>sHpb z?_^e1wUGUD_s~w{0+YrcnR%{a>G#8nnJ=o&3I~Hs&4l*QIr{uY;`aLR%$Erl8U(C= zv7%9t`7Od@7q$pxbe6XWtrsi&!U*lC>;l6Ka!Jy{YsyF!Q-Ps}0S}sd$pJsK4K^5d z9@f?yrc)q$F>lH4ooN5&ySq~%PH1$xjoxtjQ%}cDU9Ite&mA+UMg!15H{LG7M<1MQS!;W{uvkyB8YF-KI zX`hLkyIs1%hRNZHZij3hSlfA-U+_JK*F`>9)Ey*{858-qQa+~O=LPZqh3`3`7Q%nr z!XFgE|IfVee_as%e-&P+CeP$l%FG07AM~bazlUtMbqfp}xlGMr@=N|KPjK~SMT7fj z4ZvS4l;yM08{P6Si(qxM)g0W?x*{pDD3CbE*n6ug^Pl3GiiBa>ptJQ)b-SwLd!~Pb zziNd;Qe~1RcjKKy&1C4a(L(RAhw~k{^_BWz{eY#Vi7DIk#@d9TB=RUN&O^cZ1aXGA zSUc@;k&+PCJ;aqmEv{aRt73x#;ou3W%@9|uG_k?sIySN~{4Iwo)msj;v@`$qcaoB< z3OsCx+7JI;SbQrQQ%g!AUPhQH+}-bgF8JQD;QL<-z8O!R7k<%#@5sK-jLun7YCj4V zT(U9HWSKK}MRd;Yd{KDG5@G2a_)Pbdho{vZL`fMUex6^_Bd1DjJW(DoZNu1Kh3_p# zNFMFS67xjQHoEeQVt*wZYwGL4pB&9&tx{l(d!}~dnRBLkSh4kY#0FEwi438@pQIg+ z@0Z?*p|*TR8aN(5GJI(WAs&C4e^IN%e%wCq7tHOFQ zFKhOFT%Ol;C2c_Ri+LMQo4FSFuavp`c@^? zTgI8*Cx!RZ!u$O2mRT%+wcUDO72aRYDfhpma3ddq7!uqoS>$5@iyU)5VGf(y4q;8k9DbYNE8P7< zxqIdAo_HGBYJcB-+Dq~Cb3s_MIhd>!ChN1MGuOFWdA~1G<4pNxY%BWXE6y4^Sfy>y z4z}s+!L3kS#h3n(0NkNDSk1@;o2FuCY<-6CWed-u|6PPH=i%dOvbV=An+U$*jG%Os zrnfjXn(o}UK%z~nB#E$vI{|Jv1Qy>KlDHXM#tVhZ!po2G&Vv|#W1M>@z4u?>tziL7 zb}6Y<&rTom>8*B7C5e5ta{5t%r~5ORQLb?uo;J@}3sUppWuK|9TGJB7)K`~ATi%Ay zMh+(X5F(RraLdNf;M?bjzw0D--l` z+?^qQ(sx?OT+Wk3jNG$)`;zFK81n7co^QYLeEV%7-%e7#4U62noDru-{;-Z*^u{<# z;L-5)Wyv#??FC8JnQc|u4>hThUA3P1n9o~$QF`0Xc-z^23T1JiwEtl)kBs+Q#QVvC zckYr_nd3HMl{s!9&&%8?;(bKCuiz(?IoV$uopoy;R>RS)qW2?o7u9n3@>ig0*@jfP zUXE(=07q83b#8*%!>{D{RLw6D4)qZNa@J4P0@gx6g;NacOY}7Wb=6PFXv$jwFeth0mHQDWF$aSP#7s+*$ zTvy0-v|QK8bqp>aN2Nb@tUj*x{sV<|Ps|DL_`eg>&QtlsP?$3;>mQ7&grHxnFR`HS za2nWJmzJC^2fUJp<>ZO}VeT{BeU#u&LrzPhvK?IoGQ2!oybylQ9E1nPx(kPy1K0_n zuQQxH9s+EgdxFawo~-Xem`7$|%t08{2bnC}$%|i}f=UWaB}7e}*P6IV`Og4eoI(ctT@uu@VhP^Kh2?@zf;l3 zw9KPu1si@jKX#0IbQs^?RGGXCI_#JlCtR-`1XoSh;O4B0O7dhJBK1Vtgv2 z(mRxyryxTsd*%S1m6>l@UY)4CqRi}pgt}#BPrfo5Dl-q@drqhTv+%cB_>)5Tz2=2q zyCD2Jg%@fe{I@Oq$szpx7+Vl(A^hzY{*(}Y?|Jbj3*vvE;umTm{C6z;sUiIR7@H7k zA^dkO{AnTl{TQ1OY9ajhEd1#qJUx_x{57orYF=kGzc44%Liq1n_$P+&_oL1WmGG2_ zr^+RLWR60a;PMFS?~?+}`;jL?E%0=Qg@1Age?Md@)I#_>E&LfF{QZ!rP%TXh$BQm7 zJw{rY1@W|+gR}xWGlQAKVNcIs<}g_DC=rn^e6&#udjB#0VS4{~cdH#=Lm2(32@p!u zle|zb24$ab@1EpRVXIyeb}+d@U%JO&Gp%?Or5|9lnXoT&F!iifIv9FCluYtwC7N8V zI9y9;DVnPW^qtf~Zwun3A!hW-oPAO4Yzwqp7u^5!7=Kson!l?9&11Vvv8mz}230>t zUFRQJK3RBd})(c3C`hNR{t+ zbR&ZwC12+KV1~XFjbRw>S@Up*cY$jdhI{rr+!edPH4MXj<~-byUEmsq;hr-OcUL?Z zhT%Tz-{KmE;imI&cg3$^81A|AaCgP8VHoat^Kf^?uVEPO`SWmhMb|KNXUZ%WJe6(o zGwM8oVlt<1hnnt~?TFU#QJmdxd?2Se&l%A3{n_$YSuh8%tPQ-|%Ib6RRvWq>Wv$zW z?$1|Nw$+Bxt#8Z;6<`+r#}@vA5dOjQ!f#j*{s4s+Y9ahjEc}Hb{6n(vD>Od;&;{WS zRCu8l!vEC5&xY{-k%b>tc#aRA$N!|l3$+mbXBK`ggrCa7+x!3q+Pv@wDZEe%;qS5V z7lrT#&kMhCLHI)yUZ{oeKezB(Lim|^;SXI9{xF3XD&g7t`g~j=zwJ=93HBz=2^bB} zy+BytT-?Rk@_NBk1_XqJ^ubm+)hC?c`(Aj7RSeX44;|bGh!3^vwlQJIE`w@c^+Coe zHE58HRnCbBaXwG9q^Gm8@e51aC4fcrezb)`g)#1;mdiqjPtj}h)?e64Iy5I8!Ofnk z{=8JPd8yL!QhnqlmBULlj+Yc0FV(4N%j@{Hx)5zyR>mo%8JUDkI#E)rKuXhS=j)+; zh?s3Dm3~RulI?&Rk?kd6XU=VWsW}X7L65bkzY^X*Y1qPXOn!DJ6UF2ur)hmdL|tZ1 z_t(Pz=6%sUvb2s~$#1}m(?5WiFcQ1Z)Psq4s9}?!QF@a&abK2$6H|I5KX!M$L(`-9 z-f(+-(T$`#k(J|nIOFs$1Wn(>Pkhl$@;e&D%{aj`8}-Q z_b2&XZ+`ESpRBTs=DqTJtNFcGe#aKV{Zf8!H^2ADPZn|(?$`2rulc=OezN{Ezu(I5 zo#yvW`N^`+{C+RLcbne_wuCDH`uCBhm#4xsI zgL8<0VYXO2*n?;`E4staFiE%t|1FsA@MZyH>AwP|JG@fBZUjtsxKY5d2$=5hDuUNu zMRF*(Eja{;nD*9Q%`ggO8%BVLU~lb4hEd?!FakupdTXy?7=@_~BS1u_H}n-a<;^MA z8~QTAB61Wia>rZyc_ybUw8;q&$>*)TmSL2$HjDs~s@~c!FpM(Lh7lkV&l~z8oEA*C z^iyx>I)b|>7`&lP1dA|IxJo4LkNp_GXu!nI1aPfa>>uHy;)Hz3IKB-ni<(B}N@?hu0CqNtew?=Z06~zdmFx&hRXZx!v>CI?w-Jc_EfPvoN2YjZ1L# zdKr7iN-R7FFxpk>iYdj7J+e9zc#&G@6W=#&H;1RD*zG|a;%ynvPNq%2Olq~c{!g*{6O_@55X4xb$>#{@%nW#+F z=ZxDlOTl^|v;0aWOB9iz?huuLJ{r=z@N3Ksmw~cJX5%<-MzsPvqWO_`8~~zn0T4f1 z##Qs?46zk*lPJ#Menr$C(S$ctay0L7xPE9tFRuppcbfRZZw zDm=Zd@y>(HxZ5TN9}yF1WLBhYqzx-ED5Gw~gQrrZZKeuoBlF;?FuzSXXi_u<6&4w; zux`9oj6Oo8kgcG&(j;x0{g_K$vEV7`q`l~`P2tnxhJL4EO##=xdKre}77~`7w~Tkb zIe(YF{3|QCI-D)zvAY#*fqJ_R6N^blI2TK4X?KX=<~UBkQrXvr;7YXG%IGjD0?q-@ z$_3j&Yy(`9>%e=hw@5D3?sdR9NOFOMkrqd|X>ptt*cQj3sV*bW3z;b3WC0lo!h@O7 zJD3q_UAt1X<7!5Hlnj@jNza9hiDTC+rw^J@qOR|IsQx1(L3jw4^*I{0jcvRClXWIt*DWd|1o%6jW>8Z*yJ+=9MQYZ82Lp3|0i}r*M zz(35Wk@T-idaC3?F(*Il1b2`WLoY7VD zUsjj@Va%UVBkBJm={e5pQ1Mn!t? z^k%xqQ*nT&fZbwY;!xPF7A6jbeb>Uop|I~+m^c7q9Zkh|i_pkvA8F*wPd8g#$pnCW zu#V27NhhO&PS{yE5o)l-5D2>nCrntEmFY>v)`BxcZ_C!gISz1g+EZg|abnbkuL79# zQxsNtJfa0%hmKF+VL1QlHQf{oI)}^H77|wx*d;EBk4U!&uJ#p zZ-X6=Q6uSNlAiNSrr!oT9HU0kH%WTVMVWpZ?0}3KN$*Q~&R3a!8|-+Diu7nZoXy&I z8Y(tA0ufx1A#uS^O9Sz5gDs6wfneFk*n+o=4=^0aitT#Ig6|?jTTHp-V^CEA_mA~D zkGa9k&`mvk$mY`9BD)NJ1SDv75AZXEb1=E7cKFAV$L&Q8`aC#;6mfW#;aZxugyM<(2BSJh~jflO9HWCMOyG;n_TPi#tvL1QrE#IQU zxZs~Cpsp5~Dr$n3MA8j76?Frd(gd8r;`-yw(0SAbQfSBNGDBq{nW&|M^@Fvou4S>N zu4S#Uu4Tb-C>i%SG&yI0l%%vJ*4+gsVGEWpcRcXxSdvFM?XTmn_#{ z>?T^s>9jk4ZHZ7tBI>0I2Wa zoGng~Q5HRjc%s?lP!UWNTcR0Wa8iEhBJA6AyuLjv6kTvq*D@Oo$JrKRTSm&4Mv6%e zGtR|xHo4Lpm)2XnL{LOZip_>g@|CO>af6^h^ls)v4o9wQ*^ta76k}2`PGO2sxn<&x z&aFg*TNj+9Wm=kF%6Yr=LQ?^x80Wx_N6q38<_zIbrfG>J&NRvPJ#<(yQH!mJa=0B? z#*H;vQ636POpCamh0CF{Sryoi!nU#(VClxXV4d1@OY=*xRO{k!+ES^-=7cDh@dPfk z@ppPI?$1~44;Zz+PeY?%M{vWt(5Cw(+g$Jf+&N~8@jbW)9`0lMq51yEe1B}d_nPnB z{POn-~@#4>Q3fehRPNAV^I5rpqJ@I?h5K5#z4Jc|eL2{zd=1G{SY2?K{Pe2s>$7~nQ0 zL@X`c3lhqq4>l;-VNc6e@nCp3*_w>&WjL|E)KA(l76uHZ1QrwKf4%M#H)<-c!1QYMOblg32g5`Ht>xopzyQug+J z2L75>Rycg{%sNUAO<1rf5_CUo_;5+;jW-r}~ zQicZSxCAq2lwZ8?k%1WqlSAmX(aAvQ z4~oL7vaNqS+Nju7ifOi1BeA4Xl*54isv$7Y0(o#Tp2-C9r;+7d=r%%%#2t^mAWC{;ssMT=fX3L-{;KlRD6q<;~(p0 zNWMD`yidNv@*sE-TWf1M&b?iR<8#h!C~aBlKp9(GCa~GE&2Z!0jH}$3-%vZnSpbdB zAn7;(4mH|+4y_LE(si)w0y=(8d&Mx$Ug8(FALM{jOBB{BbnX|IxnJ?!jNu3Kfmf;p zN~neh3s`^bj&A9GTP-y?)%Um&rfn7NE<#|Te?YNLdD2w&*jQ_uTz4XP5RJ}_%T&<~ zaDM@`Lhb7-yx=5AWO*vaD;zZ-i^qlOvN4={a~?)vvh}jpbaTwh26ty+MS7XO#%^lW zvxnW%%_LYvx*5OBNa#lfG0d?dWyJ-S%32=zs;!9G>y5-?T_p$3BDoPT13>TGNikYW2SSdW|{GVB5Intrku($Uhi#Qf&sTRa5+&`I-%+{C!p+!KnV6lWa&PM!tn;Q2SK|qRq1?NSy2QHvlO><7ax$7 zHbrr<*buUREg@4I2`TJr@_aAzWJ`C0JxyveQwsJ|e{BcKTajK1?iv|fsEiDS=22o) z#t0+iKK|c|kUO2untY1K0W`Xh+gn0cVPBK%-t`M}j3}FHCV{4iRrWRv6yOBMiWRl_ zqGNG37fc6BiLZk0+L*xR?;k{J7O&|H@IOl)OKpweC#@eVTo) zBHqosIU@Pe@%};Jttm}ZoIc`~(nO}>RHxc?bZtWVxJY!_Fj*Tq`yxm(Im53t+YC7^ z8b`=fsI3mkU8eAcAMY1@qJYTa--wycljMPFuNp%)1D1{=xvODSi#H5>TEBiGIuJCB zhAmZgMfg+*%xG9aU(;9`vZ`%=GW@v{k}@Vj9e$v~QucwKc{}5EbW|?uPDk}BJ!1{4E4vqeN*E5=yhcB%SIi9*g5~jx{4w z9bpc3R@}pNdt51&7uk|YSYi)lrpc~BF}Ih>HU~`{p*%8&j}S6ev`M&+`cLTa%B=3e zEyyV$2TAV9c{sHF(>b%P|mbjQk7v9 zlnwMo7&aN4_`Nh0iY0$VVcznk8#YUc$)vlay_}4o1|-?`OnXD2+oOeUH-$F%u-t&M zLVWK0v~4TxTGot~l^Gs@3^l8uuB96&msUDDf*-QYWHZ_PAT1l2jtI@vr!v{D!4pQL zx--)$*Dp<3i)ag#Q|DNM8VVWVRK{Eab1G}^i3*1{j+o1McL-D|GW}zm|nDxAZ7kXhyN9T+0e2U3y_*MKx1IX{c zoiJm??z@qmXc54nD+#O1C?A<;)#ibWX_4{es^a=&RRdwZq9qJ$TWnRN8Wq1p-+7!t zU^^fUmk}YQlT#U%?LD4J=Wt{;f$d0dHp?$H)_XKBZ0JD~nF>dg0sfLpa0lKU7>ouq z4lSG5XZIaIcKVGex_Z^-m^XVEe202%x8xPv%4gCH=@eT zkTqazixWjqZ7;raA8_{oH(s`cMNDkX*35Dtg7~}0{OIFpKGrCNR#z5!(BQdpWjsj{ zlzEiIQ|l8^<#~e}%XOnGmtm<=+s0IdRDJ^-ry_~Pr^)B~v^QBJi zX4%phzt&)jg9LH^)x(Skr~GgP5@b$%^}S%n1=hf#DQdhJz`DFELr4-nb<8%5yWnnP-!z}8^L>gOc0h) z3QjD)0CNKnyFtK>lR4%j5e)Ao?kW>^nG1``MT{*`3PW;(Uazyv?dpoc4>NF{p{8`< zpF3efBueQ)lz`XIpiY?ucD7gCg}@{?ZQ6H^MEZ$FUg1hm4_?fM9CDiyx5#oBl7=;{ z@f}g)n`L~ZUmkv?L(i$W||9GM65NDmBC7c8Fc-IFqVtMTj8LQ!!FfZ7zbSw&=`ktat^RyV8mM0MeRXcLVNm?$U|wI%wvx;a>t3 z?3Zj1g=r=Ly1NZnhe?5PvyH{&zLrTGYlOn^>#T~PSL&IKd|9eE9Yw+Wvcb&=!h*Uq zIcdZ3@)6*m)E?FVQ+{sVZ|!{^5)1EA^Oi-vd8z&>#*e+d)rv<2lBc^Om&vT>)lZ<1 zy3=`5aIw_JCW5%ti!=9NHCkjL87yaiLJi3C;mVg~l;x5{WIQ|)32hXHFNIU4!=v!U zZt!U-X@r`~v6V^UdSZgs(ZXWlU36>{LUY>L0W|Z^4bH7J6f_<39%6(wp%vt={T1B7 zB@|ffhkLlTWXpr|6kPz6P0&Ia|#?vz7d@t!=dYu`{bK z|0pu%ex~Rgcb#|!bmKWrr<;>2@IX?kU z3+z{zMzZO7Zm<(RauI3!IP9dM2j;+3-*M!=w4fX$B3p`VQ_*&GwSjmYVyDpn&L`|Y=T436ulho>kEfKt}FgwT-0e>A@4enHJ8*rHi8VmiYnJiDE(*jQMu$kZ$@mbAKa}FTvAD?<2T3Q z6ST3a9#$CCZLw^EM#g^tai+3PrL}vx<%@a%@e0Z13uFY*!m@m@;jXFo$u^)&yH1aLs9D~Tys`&u_9;4t7u7OPErakR<@%)k*>7}qDd4<&S zBbPjUHNS_qk3+UQKW-bV^r^V^DIIt0T_@Wy&!Lx5;K)5GZP=WEdr}C+Jt>$bk9<$c z^t!ZiPs&!(LZ5q{otZbslmFKL%{o7?qKSrIYy1S-G`t)=8s{6vf3Q3B0`l;}kD%8; z<9rDo#^XBvJMo<%bTdl$QN&1LQYxM`@W`ow<Bp104cXP)J^s;mDsT!xM11AMy6g z8+4vSZO;_E43dX1^5^^DBXkUR=taQ3M4w+?3v`fc6$G+267h$_mWp+MK`I;dL&z%~ zm;G$iC251}hn3`A$hHUt0mN1?+9Zb~iEaf?pfBhgr@Ri>o891Yh_~=#aJLkH3slK) zJ>1-67``w8dNnLm*zF*0gP6!Vn!+;>O?HT4t5*1Nco6GFreOOu?(j_F@?}#PPC{e% zBcAMuqKOA*0T!H%e{$F|ffJ2r_*}uYVF&nB=atq}(=|G{|~|8(BO}RbdBq#QmHI4MS3R2k7s>+`k)v zcv*+JK;N`(At$%+bA%*JcrHBGmZkXdYSccixS1#>*}^)A;n9&`b$;o>DGaqpYl5m7 z0N-mQiR(&m|CMf9jU*j?%2LCInPda!`VYvv1(- zSl%rseatJ)2G}cIWpneZH_Z7X-7uGS-8{wlK2;!GZWQo10XOcq1^I$sK#Lm2KI5xcmGW1<*r;Esuwx_oc#)> zWSQ487}pW9t0Mv86ASd+r05>AK##{Bi``?vH6WLBgHN&t6v>A0-zY};Q}6@40iWQf ztjmcAb4xQ{Fcso&_%+lisRl3jY)zTZBxWhIh*ye6xd4%Zi~@sQqp$8a9)9LPa}CS* z4*X;rL7`np=`BprZ?}HB^pn@mWc?Hd^-E=s)ZrF*%1GLcXbhfRrRg@(%>I)8mx+0GVyE!-b z47gT42|Y2m6s|}#3<^{f4uh3}^}GjuAH(k&{N4}Pi}=2RANMR@j^Fe6k?wsEwgKNi z;I|9h^z&Cd5dYlZ8_Yy9b+`DpFz@r(D8GRU4ZewgFlZ+t6^ruu%!M9Rg_66 zsRSXZj48#KcCn)Qbz;Q9agL%)Ea*m{9V{BH8&5E(b&9nqJ5M#5& zh+A`=OtaG1ye$}86=SPnY;!Yh!Pkhf)nbIb1TQx###V!Il*(>bT z6ilt@9fxVNixX1Q*V{4k=5f=1XWemk`fMFDU1zB~eb~Cc=1%{Gb^q6$KGieh?Y`dh z4_o)u-t@cG-7{~F^zWTS-iTUz0eUW0#nDbNwp<8LIv#RN?;51;6c0ZLw+xZ-kg7*+ ziz`>83w`c_F1jseDG@FW@j zEfTXoDJUIk$4xC*UN>dP@EI57ecj(8CA*_iGD0ON_%`Jo2ikZjS%epXeZ@P0-COtf zNZRjL(h@2`%9TqPRV7JGmI^B(3i|UuImEvYF^t=k0IO}Y`xgK#N?7?4WSPa2AS@Y(?J%s`1r|J~V_&fwuoe?0eIvE%8FeZ!mgm z!^XI^`!2`^G+YSAbNwt0k2E~E32(-)0LN_nsB!X-^Q)`z-5G7q>N+|tIT7`PonB`m z&|mjTgmHJ0ahHLV^@K_gjkdGb;p|eS&HaFpE@vb{C5YE7%?|d%KQv}EJ>2NbIg49* z%Ce;N>4LK|9)1SNf*sKPYP2Rh2cF+M<1U?1*LIw5U;n9x5a&2(Ltcx z_QQK{7LpIR`G+yI*Ys^KbnN}-iq7^?ey zu%Br%m+s7$T=ce`np|$E&xQEvbJ6pHwn99-@^dQ~YIIRA*a%Orb6O>Q@<_qZV`ex< zp)I^K!Yf#o8!(w(TX`4`T>Nzd7iB>itYpYotehsSocN+;rKYGapBMhJk&BWASt(&- zvQl$d70HEZ8guy*pnXSzBrl{hL=WLxv^xTVrxCFjfKy`_#${eBS68{E-&BwSUafaT zmy!8??VE8ORm_u3(4X7c$6ChiVdhrZd9xhO@pp~#zI#mGgYCZujcmL$SNE+0krT0! zPvC|XoJ8Ey1yR3H%U*n`%He8^D!pF#B+JhELnD%Y#j#bMp<^j?t3E0}v%+5%UR8A}(Kr zz~E{ot3;$k^K}7GEd{mA|^Q^_!hb@bHP?VBX$yhv5X4}FrsP-zRi$sBrIwcBOOuzPsR!O#8bAzfl3q5bYqpBs>bjF`|2?il-uuD#+=$EDglPXwtV7 z@VFQ#`WK5+%qQG^QDe@Ci&;f%B8yarf6$g95>NIh>ewygn^C~e5xY*!J7ng~jsfS) zJMG>1?{M7KBkJswJ0ex4#YpG$4)$rJ%ToiU0v5ZEVu^s=`F*S3*NE8o^5*d ztMj+Ou*3a%RAc%gZK-O})@Jj0Bubg4OU=g*U+3ww4kU|0^C8q3G%uPl`=#OIL8kA3 za_nKxGj1vS_X=lddQ+uAQTX8zz^t~Go_Vd#=}6E|n$&=sg;$-i@LG@~+v~9tNsYB+ zo;t%XAW%j!y_w3FaV#B+t96!(H2G%PM{4@p6OH{X*Nc;;I%f4dJDi|>Za+_~BQS+{ zg(=e2dYve&-N0xc+a0;^&kG+0E5w`>6Z=>HEI{4Ty_O9cVFS)Qx-t158B_K80b_ge z9Iny~h+Ly_M(($V0?P8J4btwz;yMW9&aaPaj5}&;v^Fh`yI|C~ya8Y1;{CXPqA;DZ zQygt+vKzhuKi`$BfzNGof-j;DxaVye++Ttl(Ve+sn_e$V0I(&#ibBZ#8*v~U`zf~h zZGb&^F@$*#;2yLu;_t^BqL^tR-~oXw?!*F_yc;vlgYEM^0xxh&xmVBv`M8vex!`^SNzd_7{XCscxh+lc#i`~$DN;Eqa8 z`i9ZZgj%}2;QNe(vhZyq>jqyiJ(~@?t1C9mg{-ScF;@Q$Eeg96X%{U`N9lBblpp*+ zk*V#{b-2ZM5z-d6ly3xmeCg^N_~MnPZ}KBLHQuqjD?%RjXhkvtzwSn0`P+!D{JO`| z#i{h5;=bA7zD1A%uKA~&cIeu>llBcSLR;%kA&7TDz61|UYywE0@kiLQ(i=DCNE4+C&T%FKmW*eX4&4gqDtB16U1Id_$3>$P0K6(Ipv5 z4=mpb^4G+}pF#Uls)$+rin&Sy4qV>_Sth1!jiH6Z6_lhQ*_#MHh3uL&ETIy010afs z{6QW6ki5Lol}_5(>#lwoNu_tYtLW@?%ije_8~#c+-=N%*`x~6$-=y`3|L^p#%dC)|QnC-~QD=pMTG)yPC z>UlJ>EbJ;!w#{=)ar+!o9OjI*sF3iJ2%9O}<&vu&MQy;QaR=#$$L$kMxKBi%XNueB znLuoFLaATGlg;)`L2Wl4FhVxO9ZcSwcac{^tT`127gHSQa*jaV@C>vMjO2`htIVXh1|V?19Ik*7|+S?3DX0bmPeVy53EWV8SN zjrqsC+WbGhwfuj{{5evY{OLEju11lfwCTII90!AY>S@DOkf}1>PZYh)$_B2#EtYys z!NsBbGAssib&Nd2JefR;3(xY~#4|Ix3ePBo&FD&hm1ptv>eaRDpS~?x?o*lh#_9Uf=)y*GB7eQJG%f|0&aJ#Q9CE{~FnI=+^Vz<89@Ae|_E$5Kxo%2ezK~ zy0?`#>!haK4>shzq%m){hv+yudV3g)=M8zY)@#eXv@!4c`o80BmHQ|4<;F{&b$Kt_ zdfuLxByD#(Q%$k7) zvW|Jy_DS{#jcWU((t3Cet>L!NI(k1Di&plNGIqu`(8@e(X=M-6sI{~nQA6v>ZJ~Aa zel-@YBI~f*wt-gWSxYN>Tv?*l(t2bKt)*?Db@aY47Om_HW$b=zpp|*n(#l?jca6S+*tuyKS)|@$B=rxe006d$TLxS zI)N;rmvbePdRvV+r9NZkL7dZ5H#oY6S0`@^uSVBt$Kn-r+VZRsc*Q(xc|~nkqgLyc zv>sDK>xZ|6)}3A-ZTuaJ)}NDB?8I!SSLRtu>n|!%Ev>2>;9N+3z1EKvqw9lXjZ@SI zYbupmpB<;PPLHeM)ADWM)5^ESr-xYhU<5uf&ssh`T#0J=q_iGiL+dHqLhFrhi`GX- z0CxN~)G70vn|);%@%9(PB~aOaZVn+&YJ4<<=!_&laYo76g_I&QSOu3!NY8( zQA#7D5L-6u3cK4Xaiqel79^?g-qPp<*t$$OSkZ7!Y2>FnU@joJf7r&Y(M%1ocwtb|%E1*j^{ z!a^xP8C(9Xa9b^<=muSis;(4rTuVcwB$~9Q->hilHLhr=nP+`p|;E zp>;&r=+@Er(pLCYD;u$tKT13NA$CC+=B;8Z(+*?ue!;1Y^|qzXCOQ4hvHN@QUDgiD zrgF4N&LfpZ#v84Jt>M-7jOCBhPzP}Obo+lD$Svz^G26i;S7S{awH|3DVQ zSdZ8@6ug9$qH>BmJb32EcNPJT`$Vz#U^$y7w@`Sc71k;H;8Px!Vfjj=FMHb4jXP_& zrY3tqCpw+;bj=8R4*0rsa4=R8m^b%9Sobpbp?{(*x-NexB5b0UdzNC(S?JQML65v; z-M<1pFZdRkDo_1lk(S$!(Dxi}&ZB0)h1z%Gw>y5P;&(iL=ixVu-?jLmEz0%v+-Uzj z{CFnvVf?VV?7V>AX8gusIr=qxyYX$s?>+b}!Vg!U%X9^I&(ad4;UrjZlwHoCEJMR<;G_93`4bpJu&ntee^lW;bhAAJK85b572ZWR z`wQSc-QW@Pok%y^JKR(0en#OF=w^Qcd@|f8Z+KDzQVd`xM!+PvPm!CD;7Kxoy&dju zx*yd9ak?ob0MFBXk-`&n%X)$v#OUV48*vJ7<1?Kgb`H3=qg#{&THyBUx;|33rA#U)Rem*Tg zIUO$|iCY;CM^K{I6`&sTxEHaiA;JB%-Un*DZt1s`@lgt`7YS8wxYxR%%z7^f{RsI~ zeiB2nJhz>~g&)X1?F*CSp>AKW^bC* z=gDbWPtOLU!{dl7&P!k`9rnTCe{cj70L(UX0*>+0qB{I9XaR0a-T#Ig5pee@p?a1= z>T@ka#LxYH_C3dsvW!EFN}0}+7ow`j8<#xPVe_)_*GPP#8auwcg>{S)%RK`;&M}0v zUioBHNvbpLySQ-xP8njFq4%a6%;#p!(-IXhv>wfsHeI4 zf%`wchB_Gru8HSEoby71i5va=q>X;po{fHYp=G1rQ%G*~*K-emM#IJS6F0^Y zEskh$M2j<8oYCUzX*!xD*qRfFmO!)wq9qV5!DtCaOH3@ZZcMDFx>ra`WL#ifXx^C2 zPu!U7nzS)FVe-agchAOT4^kv2B1Li%QY0rA+BPN&$wCJIQ-$`8$@QGo_Xq}VQOZr; zn2F_k@UIIAGqDMXpNVxNX(qOwlbUXgitS5`+Qg_$618apkY<|JQ(HHYa1xY}d`9vm zl0N}?X8iS3mrbVFrG!#u$c+ryks&`a!jMdSJ=c2-HXIjV2{Va2A|<*IDKUXGCf3u4 zYOrCqe~!c^87av~Nr{x~MjpxaoDS>!gKzZt@ZoN8)blFbSwC)=ezxywnB3aY5Eied zo5FPT+jJTx=^DZk)pS#tj((d?!z5iz7~0&+Y->I9(#~SgwvPQRI2Fy%EBXI25<7>T z($vh-#ZE+tOSfrueLS7VJz2b{(j2OJM)at-bePJK8q;68otcB$UpBf!DUjC3)$>w{ znXGo4RKxbC-tO}6rH`;rahCcq(l$g6VBbpu0Ng7OJ}yy2KJ_3T%e!9Uk=uwj5db{q z#ta#KGoo*1TD+x3*yBi`dS0i~GSy)SbV$W>hTtLR8u2`_4R{v1;Y#pFcJtw6C;D@% zvkdq@4!oW_$cY~IXiFS0m{B3?x%DqD{|6WWcZD_=C&OX(`Negoplnh!k~6aFZl~Yz z+&g9UPKq~pfcwOd-1;A^^_Tyk?5l+T#DsGXF9+Q-K`ZvhU1#>S&4})6yT@C7C~}j_ z*F4z}(a){Bp6v6LTYWq+F?4S6xWyWy0QYF>9ddBuJ}4jmWeDxn=L$XSlIKRvewNsC z<(5z{d=`*Cwmdg@3Qlj3wS-X$Zrrt_{cS%jueWY0C=7lorO4vCiDwb@6TnxT#C;LdXw7;#CHd=&59IrG&?B8|l(BezMQloPu z9YvR4ii^Q2JTco>m2=IetO+T&9vWTPLR38u-lu+nF6K7gIjlj4Gx*?Ci)cVPTI=l_L|5tJ!E7JLdB z^r@a@8eGmaI6MR?E$07#&9>1gYby;*8eI+V>l)p&;4^A~4YsZ#A}z7Ik@=jgyIq(Z zl%I<7aTwXw#7rkV29VN6Dt!#6&HfCc7Ey%6R0+M2fwE5%cjHJ~ zWQ^F-g_u}7rJ4V+p}6|5%EokYJVMQ|>?LCUlJG^Oij2!ok1;Nv>TLg6J6~&(J1RfL zx-wf``)HN$WxFaK*bu=h!%n^z{bYaS0@JeBdvGeirJet4hI&s9 zGME9Mr`WW}93Lz$ihKUKrkorW@!Bo*jY@ta#>rRX-~w!$1Y>%$th;Ss*;*vz=S z;0hqslz4u2p{BZi>{O^Qt*@C5m6Z#acgfpgv_{X&;?r^68(jb)@#=Q!K1z+aJ1BiD zF2jD>llg6PLax=h3L(274((wl;x`k1*o&OC_-?{C`uhv~DZmfGcM5(N;b+5(rz4>J zAd1(L)ERv|DV$BFi^Nq&L-9k5?t;&(Uy}ee%(}?L(#3s8Nb*j=ysD9){1?RK5e%EU zNmDnai|G+kzX4)3wX_7jIARm}lCb#eN{p%zVuWZnBATdEBZOVdFq$Vu2s^D7Jzt6~ ze~M8tCo+_*f+fl2VP_orXk!qrXA>1Kj>~h%8h!dB1>b)lw=;=!aSE`O;%p66@3m^H z1`s{|VA|+oxC=w|xE|bNLHq56XiIfMj%tb#a!`g3K%Ph2dB^jO@(uk)<$S9%&Dd|d z*TG~43j^m9oO^tlvLJjNc2XNhRo@k;egAD>M2l;hJm3Z%VZXF0YOW0$VcF6=>maVI?i8n#nVeBbIq# z1&5B0!UIz-Gw+ZI4a-HmI17@50;~6Ht);Wfvq7D~%V7LW4P;z0g7=!74);Z6B5dwlJ}Nrj}MWTYOa^7^&-)Q&A9STSZdDJ z@ZNa)>n{HdS+8;Imt`WYQGW{UN8%e^_RO2&JdM78G0G7O_eBrFTiehhM7r&T@Ade- ziC^)XB1ZJgd8VDnvQ2U` zH?F&>po1ic;kef;h^1%W;1Ma;r1*cic^BZ%H0fXmp&+dg0$@4tJ+6b2L7pgbf{xB# zMb6u`6rHiA{c-c3B#xqk{7`h}QmkAS(q9N|E`EaXngth*l&9U0s?huo0*d>!#MUqC zKYSf%^<$JvZJ9P1PBLwomRR^1#4h#|M@!$%^3ib_Z}=ERWtA8agZw!d3S&7eNGD>_#c~N?1cV}hkOtdYXOhR^G<^?4blYKJy z868M}LNr`#IOwoO0MV961>_R6KX3K#L7cIn;7P=fGCkTU$8zW(KcSar?bjgwr6MDF zC!Wm7UDYXMf>(NheMt@W0-mV``<}UfQ%BdpRA6vR?{s3u#51B1T!v;Gz7uspEbf^2 zeHKKpP^8J)$1fu-HTLm`5bOWWK5p0den|#^a-O#u!1r?It4n<;RfW3-rT|`g+!jos z8(u?cqerb)k7fxHk^1;SCs8h}O9u{sX-b>KreZl9yi;9=;0jPQUlU zcOwO9B0v5WRj^lo6hIY&?;2;>O|QXQeh^)@k@8Kt(2lK#c5r8n~*jsqi&cjOlp zw$CcRsAJ33W!m1%?Y=bmc&c>Udyp_KzK<+t+1Q@9Hs0Fx;VYQWDC@&-cie?N^h(l# zzSzRP$TH0Z$yc)8RzHsV!kJ=7MF)EhoNNAf1` zFn4i27b%at1*deHf-K;j86pp>(!rLe{30pfeCj~pxr%r+ZMYAQV%F40x+qG%8jKUB zc^g~t3ynIP7w*euu6kRKGj+bsOGj((=eqxI?R|G|E9p&pUu??v8v3F(kE6wwdlt%n zwY0&J<>TLoe+>CJ!N|vbVulVCn^hgzCgzP^a==U`7NdzukqwKzQd1Mq$-NQY@arHM z`!9z04d0*#G^35bN#~IY#{dFzsaS&b-2KJgYK&1meJY-q)Z0XWVlk6`;IVkg7vkL` z_&E{%6W;azGBC9NcI`)=Y;xF0ehp;+irjfV8`?MSJSP-)p8oIdu?4>$#*MhF@Ap?O5QLFZ~HgK?iIKu1GN3dBszL{eQ< z1!Di6_NMfa*U!c~_dRaybj=P);2#DExvpV0s4(jVqMUV`akRl2I-ZHTJkN%20VB-f z0ox30Op0&^AVi~tKIqZKxeWR{n{)6mIttq>=h0lK*~I#g#)v)L62`%`J)sg5JVGgA7N(d7b+GH|+Ndlyp$qgNtn{F5K#huz zA7rH<%%8Y;m%x|D!d3Q7V;lijEa)UMi)$KieMN9}#493K+MDT{olp{ZbATy7b-9*U`I_C8DG64u0IAJmq#g@N@@2R431? zramKK$~T&(PV*MqwAQWa>R$&=FML;2S7-b8L&vYz)d>&B0Zd(euZXS=ovl0QQDS>A zr{X5Q8;RHUmr6TO+mkexSogsD5l{P4=mKq8ZemgEmvpJ-gmhCVgjb-}L<_|O4alcO zZVWRz*3TPttj^w~lvC`|^PKsos7zT5qjgLOJ*eqGb8{BfI3n$^7qUS+cX*AK$H;^5 ztChNl$)xrhS{K^B%^>B6|AsuYZ&o(RX2);V#A`x{W1R=(dcj~8y~Aa zdOg|M{RXX9+NSXGUl;=ht1lR~giV0W1efichim>w?tB|O$d$ismi*_+l0W;!8dcoP zWqQ=supr?BNf^gJ<}*Z9%7oL2@C3t?5{|pV!j!l;r%%b-mft~Mo#iy3P_1(;EAk&+^^V)NahU(4UUu0?VbdmLvK9apBRX}@nbzYuJa$>N`wUcqy=u?Qc=lMkFXivy&vebR_~3(AQ-DR-C#iZ>0h^gO&PKe1uhOnHNo z!L^v82|UeNT;hn}x>a%AYjEwZxbVy+aY2xefGclti37NRzsthJp|A-SCXPs+-_<-H zGI`K=7|g2ZJv8H^-(B#FZaL zkKpRDxWo~`b(`XP+Tc1xajj5XD;sg`UBdIWD_!{?U=ZWP5d0}v{Ne!quWEbuN@X?< zGh3a6SZ+Ck4i_v(#ks*LtUlCxoAV^n+zwjYp~;8@S+SB4hL|G!4)qp+n>mhv6(TPx z7p4zVUyel2H^#(Hl{J&JY#H3uis34#HnBQlqz0mep?x;lcQF=ZwWyJ>E#tDSmf>YY z)1cbsk&{>a!ij7tSe0queOr|GSdhuIDev1OyvOPaz{2}Xw!_0aAZ$Id3o;?w;4`ga zOm5OWGdreYX5)6I)y&PB9hkeF?^9mXaN8>!Ho#G}FiTztEF6(?ORJGQ_z2ph?YSa_ zgfA*QwwG-$SSL9hkubrn4_{=%PnB>#2>C@WI+xhNxgE{!&Z_L+c=REe8wOcaLpGhrq{B|Q%7>zyS#*>{_&&HY z&ArLo!jlAHZXs2NIyAf-no~?g)0)f=wjxqTQ>Il4AsYxf@G6b?%1047S`e%%ONhM< zE0@dEfh`H*=-n#iXkd{nGv$Mcv?J4z$;jb_@Id0}=ml4I7(5@u#IxCs?8scpTCR0w zI_vqBkmgt(52iHRLU$_f#wRl4t0V~DYMZ2Ob(DlD+cb(NqY6P)@8BWiV@(_0dW-dB z-)w0!>N69s@BhLBmbicLdMRyxITY9$*Wi^o+(1is2U(hm9h&HCB&(r+bZ@YI7b% z^dB_Hsc0QH$eUn*6I`iYtq|?pBPtYigajot`1Mx35H7jg?MLCrhZdIz{|Q&72_o>fW)$n3q5diT`cs`5$M(Sqy)>vYSAJr zOB9zNXTPv&P?iKs*W#`MZ7_p?=k+wOUpT=8Useg8ir}0LUNOiCf?GQBF{tCx+#m*U z4NQb`TOTdXPN4K?Lh*T3z*n$)Z=bpiv(J3T&fR zy)z*P$A2hoT9gZq6RSbys*}%_==^y;rxwaFUq+Io-Y$-_U9vGMmyK=a7B4w$6qlB< z)2*&AbK-n&M$VaOzG>&Hh{r!8h@*3*MN~#3JZ1U0q3DgS6E0tr%!I_8ta#b zG`bLDQw;=%ol9SWHobTW-DZjDsFe`33u^8bGjSu!d3*_S~eL zVg50Amp}h^pd4pay)V(>V*_6|1d%>$35#wIJSciBd@quw0hkB?p30QzfV(Bv3PZQ< ztBaexAYIP%`3{3=OPT^rnKr$t{9+A){-M)hisGD$_W#}Ry_fA?&YO5M`Z;>el#S7_ z6IG(i9U^YdHydB!((S8Ke(c406*jM7#>QG5_u842(P7DVu_uQd^>s-%5ZiDTXDE+C zR{U!Wu08w1Q*Lryl|ED;+pFC$4Tj)ISHKO#8qgRgCH!VzTUUBRnlu{1L(hZJ^}AWO z79Kr|H_}!CDODdWuBF{u*h@#t2qfpsrUKH{tNie|xWYBhA~4*C`tal&0IV;N?c6^_ zrpdkmb=uYSW`tssFGB-a72TGy+I>y;NAfZInpj`Dvp|hNqwQ<@7#W-D=KkbJ-ADIQ z88f9c01%0_y;#6?S~NVC^WA{)ZyS=k<_wC=B=y*c=y@BNYe!nWVafiL8}Qk&}Cg6qoL(XCG2I-YV=h!%4B-@F;4_2fI$?thASG2Iu=At@%hwN`;_wN6Em_+clo$efLN z&3%Zg#nRg(@3{}5LF?NtSby{!R>{xEx1azDA`MrEeRXi4lNQ@HbsjeZHLOn z&zZ&xK94wRVK}=L1C*Wy^MWt1AnT^FF~`EGNGf|DV!BNa=ghA{xSn8usp>j-gx=HK zU>f3To-!L!XSkhaexo_8_8(?-96C4zKgrWmr%Gu!opE!r7m}vPUyx1-vMY*)ItBV2 zdP|`Hq1QO)^^ejM6#Go|B>t&ENV;&Uiad98!yAaO5(MaYX zsM&c!vYz0zkN{|cS;U1i)n@*U_aKnwA(jWLj|kJVpUP{)M%2h`rqX_Kf}*Qo&khKl ziSX>ab~&i@F!5({M-0rxu3F07LkOp@XLXh_u^5 zYV*+Fq+z5y`Cwi~X&aYzf+K@675(giAmvlcH7=V^{xf1 zXwHDwjSWxNPOuo7#m_(y-Zq6+5PSnpoB{M?#x_yCJZ~yj3QdamA-Kj(j`*K}KN_F& z!f1S~p;i3YKP*=f6`B?{wBepDUI`cMikiSs$p-4DfQu{Kn)Xm$M-^!?peAQyK)Qq8v87GDefKNza53*?+~~d z{uq7};eRiFpTe(r3;xN5(QzWPJh}HY7Tisy#q{cQHtCqaJ%JyO60V@Eh;}S9HddEA(0Bkz)pxI2Bcer7_{I3}cXLKO|iS<+p$YwPH}x7Yt~9 zVEp}`ic^dC^QhhygO%=VEQw{w`GQ)>--5idO(u$Xe5_OW!2-?xB4$6xvTvd@8;|Kz zAuL&J6T6YDzVOa$ygAFNGpKlJb~f1&&m@C|f=VN&OnQl_AYF^>NJkO|eCMVkl}QJS zm^LPNYp9|SYqN@i-nfx%)=-?DYL+H8zBkiigfJF1TY_)md6v)R^!XXk=gc`elx-Dh>J5-DRjt8Mn2&lnw&yFv-?gpxm?2*YMH@t>Hy_9M<^AGjw$>keSh&5oY$_h{JEqjzQrP?#0#&OmX zu$QL&c>ZTCk&p;N?|48zz(glHnIQZf0Y-R4B0d%;9ROymaM z$4{YoV6A++2adzH_zGl6qOkjdX#(sWSR~&?y0Fh(RA?~HevEm)#N10(loN%02QY3s z#cu=H1fIML%$AGdKmz@H)%o|X^S?Xd-&R2ZmAavSU}!Ah&Tr@@{cw0USiuvs(t0@zv7Jm zH?jNg!%}fLAQuSWAW#F?w?4*x5r7U1TNiUQDveO_l}4I{x>xnYU2dg7GZ0Ro9SA3E zLtw}NcRm!Kht!A9a3WFY9T)@{kO(L4LY%!B`F4%G*8o&j#@ScyYmp5ika3y#5-})~ z4fHLo@hz+I9cF!=o>^z?kCvDFC9~I{x>0BYsr|3LZoPVH`#$|8yeRS>* zXH1dpAx=TIn>Ym-jbgFYf^4cd1(^um)qfxcnav5ZzOi`C(IlHRycSQ&#evVX<#pQd zI&C@~LzLI-g76t$r!BA3QC_pV3a{Dp5ZUlLZFx67Gy>~1cXGu&v$K%09=OxiP5o;D8Ug>jeh>c(P;%DcIC5&x z`c&>wopXbq$e6rZ_|FP5wap6hv?^FZp7Ng+6p;$1Ip~-#b;SzO+7>}P5z-N|YFx!5 z^3g>khCI$H)x@GZXkvC#i9ZQZWH1)8o8jZ&+gI@|#WoA|wIYoAtooAhaqLrH8+;tu z)YlFl2P*YtdP{?L?9ppWBF8F0q>eqlTt@jj(K&YyOYefeORd&N3I+V@1i+Mvros38cP*+DSn^9uM^F1H~iiM_rdrrhC9Ib z9DJ{c{ED~2V=y-|fvQG$4zn6N3bsHZirUD$5c?uY8;MmtIFF1C0?~$LPz=wG;8oE~ zaS(LD+=Bl`Af zCXCAvdIgCIXS+o>-`d_2&fvF1OuKTYXWf+594(%xs|XO=gyFps?gwO};QhEViFO|{ zU&AB3MsdJX&q4X*&#;2>9emf$SC!fA7E~Doh`1_p4iMT^R?0=xSO=1er}^bY)BLuZ zZ;Scz;%LHoQ8d3(%-1*Hsr*he7d?|+xaDqVx)HzI#N+kN+>ajcdT)*A1u_659@;~p z#n>)-aGw}Q|384Y(t~Q>taZcv(Q|Z>xBM~~*}R#`dhJ;TSzYpV6)b_w#!W;`;4M>J z4Z&F=+-YZr-P8>|;3d`v#*KHN4rI@~I1mr?V>C=LY$qEg4urv`_Yb6V%Ljt3!D~bT zn_jz|CHN!TTfn^-DSxtVC8pe_K2xONb^~s}2oFNaw7g7>Jy!?A)12_aR}dnWpj^x5 zQxO+IhahOq<7zw`w(a$$gqkaf64H6FyN5jEzHHoDP4$UfBi%p5?@au@h~J+09gAP_Ui?e;$$vNa z7ZQe)EqylwoQLu8rxN^S{*MIrUv7fGF2UzUf`59PXZHI`IEQ1Kz2IMvGvRa0m-12>Z%(qlfE@{qr;~EDlkP6<*m1@q4KAW}cEzs+ zZvLUIvOTh`zSGu)I1t9OA6@u9jk>_ukGITugdshTFf0cVj9jqiBX+eo#1X;qjN(Wx zVokckXDJTo4>))c#W4-`sOMmjWnW)d84P5djB>@sD3Yc+WGnUe6iLg{a9vlta&yg;%ljDBFrI@m44`UNzlcM-2PQ$-KOZk0}IlYBe z^KH{Fci8qo`ow!n&)@H@R8*>#Tt_{>)~4jkeTdIXp1davYu5=NM}3--1f(9@U|18V zakAf@anv)UFR;$MActtY!2JE7N!NVfITRi#uxTq51V|v&g{;^fv-5f#PTK!mTXq_)P#xz5`LDjC1osNw3>wz7xDv z&{18vek6F1ZNu%3tkoG%Pees9ph=CO$&H{was*gv1Xy|mSn~+5_D0ymMo=L$0xao9 zf!(MoQvAH~Fz25`!F zu0c@m7^84R&@>svWn1KDBa8f#oYdb(A!UNN>eoHU?%WWW`SY?US1!pi z`5z4VAb0I}avzL=3e7V~Aj4&kh$pu=R>HA{DBB!j!46Um+7~D+_-ClvvEtO5!)hqx zINwO2TeHDx*zlY6ae-NPlC}Ry!Nn|xHz}CS%t4||toLvOZdq|*o-$P79vL^_+#Imx z3hYoMI7$$R$~@5q5YCxDK75&@$HMmpfU{4iNzw?5V5v7x7iX!{cTWiwB{2_)M6gx2dAjA{R3Nl{Log>@o`zhr%wmFmWjCGZrQeg{>wGZS%7> zOdJ|^g@uU&FpgDo@cjq-QE)OO8`SC2Ty~-lK#d+IGM$n^ll>U_9zLtJ3re5d$t_Q1 zpTEq&Xp`c2_Nw&D%G*?4X(!t+z4GS}7Zb$rni24P#=v@jXJ_DfP4L|G8`HmQuE6mm z*RkHr$~!I7bsD@Y#%Lk*3eA9Y&IJC~f!{0bf49LOi_jS>Z-8qbC{V^zucQoo z1L;PvLFL08DKz83XOWFLZy@O|HcTupAy=;?SIbN3yoye5_;ain;N_hYyWz_}fUjog z5TkqHGDLTW7%?n>APXP@FWi9qyznqYu`<_}JCWWb|AvSLX(e0vA0CdFczxpt;?#fu zW5{gD(3TZ#hzT)AY?3#FE|qT zOYcI}m(IuGl@QP3rAqtJdm#Ra7m<7B?Slmr$N3lWhZh1zAGh78Gv$}whq&E1{0qxa z+}esik64BqemD*6XioI^AW^*URphQo^K$5i4=inWbu#=m(kp~kq+DUgt6@tD(N?h| z#T{Znu&=Et8_#7E#mj&LC-4(rgz`8p%NutCW{AtV&Fx2W0v*e^DZMb)FVgm70=ovN zZ5z*o!TI#0I?}%Ced*ky?c|HCFBpwy&*u~y*rIpv`bBUAhw5?GO!lhd{iG#w z{y&b(aXyG0bAZz_?E(kc&+@}tS^{QC!&DyVs+wGakierZ;YH*wt;Bc|CLdl5pBJ7> z*aE1)&Q zj<(=9cwKyt$5%0(02kt&h|io~sJ*jwOK!W0@ze`HQq6_VNG|P~OS|TR_R8>%jL9Wa zpG$j9F736stYI#;p!6ttLvZ2w9b;>q?+%>qwxVRPO@F~1*sSjCyiVsO!2ZoXBYhDz z6bdF-jreY7>4s`M;5a~swEya8TWHBYwF4pC?&vCs5FsDeH= zbewc@g#ucqalbXP&ol*B;REsVMSg;-@n7tSJ@c+~E^Tt0|A@Tc&UT(zq zthtMIMswf$0o;;ZcL5Il_46QNVN&@dWH_UQ(QaifST63aj@Zh)aZiT3%eZ^to?zU2 zz};=!OW^J??&IK|XxtaTJ;}IlgnP1aKLR&&XwB>ydTIqG!DE{DB_JmA}wq z+2VAqrBOYUC$~oHIcwp;*(kJx1!#Yd(pCpYLX4( z3-QJ3x^o(Sm*BSvzgzKp0KaGPi=z&=!*4JAPQ>qA{I19ELHu6CuNi`E4t@vVcM5*z z;&(lM+^qC0elBwC#BU~kMaow<*vO`Z79;moeifc@DgG6EDuFgkdc}JfhL`tD!kV!C z8TRzZVIN@FeU-3EhF<|Z{3rvz%0P?ndO|)Mgf)w)qL95K*=#iUJ~nxQ((XLRM?G7ceC&!dU) zJCNo?lyo5jzh4iu&1Co%rMZ}454DEL-mCV|0YtcZ0|-lrP#cFJUHDOky=UUE_cCk| z!(6}JK?n?W8j#xwDUXZK?lT`im_8ph^wGcD{ix>Uv)hY`k-)ha+ZW-VA`$<%4|+Df zZ-aM>ES%S^f}Y_aKqq((G4it_--!5YFR6Qd?JOWSZR|o_K`98&H89sGC+N7)1dOJ% zvnUZ|s7K}!U~z7R^33<9d2<(Q(fTl-UW}OQWKQ9X*|R7;oeqPYS+Q!O=~TO4o)$0{ zAP22TUbbEBJ6wul&PQmhG;jrGDfm9Z?pK zt1>OS?Cy3tiScy)|-h!)K9ZTL{k<292 z(bcI(-#ebZ=xzj59>!1Cq*C%xP^Ff%y|NN8`dJF>3pL3-993yYZy&k@{$pRgZBci|dt7M=``Qviht`&b~b%izqh+s0-Z^^#~BR zHd%C<{^-Y`wUmUQ4xK`kra@xKi&&vhC_Munkzb1oy5s@+ka5oh6l>h53@Ox9;fbo< zaQ9EKo>}npTK7V@d#szcJ@gM-&oBa}TQ{#)?Vn*iOPJKT>RHVy3jKo*U~T_6z0_xl z19buH2?rC0!oKEU;t*J}Kh_Xpv%^MVn$XRL$x`)*dzreaUz&k%{y7vslRUsN(-|iB z$v2aHfn$aI31xWN5KN_Li2DsXc|MmLF8ssNvxuG; zWq?2O6n+C!Lo53uUx(W&Qivf#*Xd5$yu%SUgZ|Mt`fFAoB9ta8*<}+2yk8P#Cdm)k z>9L+Nj~hjho5K8VDUR|Y)S3H7)J>I=C)o`89+q{xFr2iJuiqN}gsU(khqr5$Xd2IFt;A2AtjTDh1yn$7)(nn5lmNSBBcTBI9vZj>pG) zvn3w=IA;NiIo6s}aBR*(YoyZ3ddmUMj!)|sEosqj->t>H=gA|eg1lAl_%CPk3KztI zIS?hsBK2&|iS*OA;0$jLh(C0L&3<+dTXKcqV#(xGL!LMT^m$nd=3g7gN4QzpY1K}#e*Mla~pxg5h^ zq!z7gYU=cpFC#Yvo9#h-yobnq7LGZ^tZ-;}Kc`-?KgJtWPeQfHr|NXUj;uAhEZb{S zk$v)2q?y&HTavHPZMb5}*vl3ONtN9f6q`u$bp#r&p_;)@5zOUNA*(jm5~=@O;rzN* z+X`#7LOha$(BR=pJy@?~(VUDEoKo2e`QU)t zx%A?vC-|7SBa){Ii4uA*j?RSQwgrH;%uJsTlZftg8%#17{>>tLln8!K#$dH5NqaYpZK_vIXo}n#n&+bm*Bcbu1YH$iE ztUA9;;Q!{^Yva2w7hO!xeI0z3g}blImwxxpeU=I<7nP41z?6@l>G-Fo7ymuh4S#k1 zG&|tpHM?Pi21(;4c9E&@e$fSJ+EGs0*3^}9>of3*EG`b@1lTtnOdJY(*1^P~ux~k- zI24A59W*_0C=91o6($aaeb>Rnp|I~cm^c(R=3wGb*!LYw918n^gNZ|7&pDVl6!yG> zi9=y8IG8vT_M(G{Lt#I3FmWjCM-CtNzg z*iRfx9Ds4{F&kh0*)8AxbCVx{M_}Xp&-(cbKc!?0AG@Csd)y`Lpv?Ls$uyM?fduyA`);BD=dWaegC<7>+vLE9Y-3eqHmrP?8ESz+=`KJp4UWP z5bzNM-$L+<3jU#hk0SUsf`6pomjrxF9sFYjzbxS6>fl!tycQo@uM^3RPc2L{{bJdH4V%eaN3sr zqXzy7AGtaxFsoc($q147=D!<(D;j}9I==ZUAU4_eyTGz}3(i2qqrv$kKl3+-rjHn! zzr(LkMU&TT6WHL*n~RSAABp}U{5DoF5z;AXN2`YBDDw|NI~2cz+;8>GFW^*rTCwUf zzl2|*Fj0Uz`3W-suUGwJBz7H>Nt3ndkk3YciZSH#Xx1e9eokNQ!{m`alYkLIk{Dq$ zNYypo7T#HqL#7~&U~mwH2uvHoLvsnDx!r96l`owHE{rSl!rSSH5*QH9OL~FaCNJx1 zczf1{XEn$lVVPp{Q6|UP-vQPDfNMnB019hmq#{j&vtiTV#*Md(hRsW0;r+-DqV74< zfsn+<4hiWwo;D9s(PN3d?DuA?Wb5EKia%10uPI-H#ApOFOV6%%<^HR0Qd<^b3KLi)ymOMVPBOf3$ zs|9~$yr|WXPdmJ=7CF9_^EiEXF`p1RyUUT>+yI6s87aEC0{%L^P4Rdrwn$u4Kwjob zgoe0r1bcyEUaa8ITm?7`TQm(knw&x=4JaTsS2J-NCpOn;RzjD{@c5f4vZ=Kg-Egw} z0-xG|mn^(*!FC?bh)~mS%$qMNoT`8TFwD`@40IK9hM^`5K z6n&_`uNrx+!m_};A$bu>0~m4#b3WjRaSN;Rl%}6qSK2jI750s+1E8;$j?##~Ln?t` z2h{`V(ZJs`Bk&#YIv?7wB_DC;-fs7n{kB?V~`a^0)w zXp!~AfjEG@=3wGb*y|1^4u$=~!Nj4kUpkmL6!t3z6Nkdya4>NI#`j;KLGz}P{-l6@ zonHpZFKf55``XbOe(g3oI~&d^;=G;EE;{{0sFln$$>YcBy8FG$kVmPJhf;MtrzXz) zGqC4Wo=WGnJL)+HhUBOK$zKOz?aq2BY{zo!p_8Q_Io`&XPUj=&k83?Fth7hQI|^U^ zRk3hC!(a6#+RQzv*vFhdjf_?kDnZH5QQlR*P9beVq)$SuT1}_~$xUU+hdJ?JaWOC1 zlIMsykKygB%RpTNdAvY0Juo>I17{`fLKd{&{0$NiIuQrTgfk1IB3~3g$qXqq&u{IH zurk`W)?@XZS3%Q>OA>(qz2G$J1wX^~c@??0#X~(nuZQ-wgt8r2w(~WwlxZXs?SDau zplSXq3kJL*`2ErN@-HxZqbh^@!Re0>K>?yS9i(y;Z{h+ful}i143PBBO$o9QVZwOFQ>p#CwFj9@IB&>@9g(b^hI`taO@|q{&*cQ3zWKn*V6l$rflZ7()`J zN=u-??1MTrfoT*Jn1frvwDD1?dd)S^K{rLAB~4(KAj2#~`52n&>M6gzVOxLwPEw0qIE}5GG)3C}K{s}lpHcy4p zpeit2H>^1wdy7roK>Mn|aPcrcjOJE>;o@O@7t#7EFkB&w52O86V7S;>!-r>@@}r>^ z?!uTbjMiDYh8Q1@W?X^cLSlRv4Y>lt<Gzm*}ya{Lk4FsYL%vIifY3%nC?@QF7oZoKn+yBRpSrNJ~mq#sM&0ZD}r=cFW1*7 zC6&2Jh+@&J@obw&6t2sQQH4rKSon&}9Q#nNG7119G5=B}W<5~|AX+>BicN~`VV%O> zCSgGM-tob_%L59TaGxE{zA3cwbV2y*H1N92;Gqb`N`nW`^zqb;6|QF@zzWxam94cy zorKM@*`ob$yo8;4S5<6cdcAG;RXMwF!8GqVB;HG2D{B=wnx{)yy=>YxENvof$+*lN z+Jj}))eV&)Df`~i&RlL_WX0F7R|4=Ae%m7wHxPXE7WaUc{bjLrQ3x67I>YaW2R12z_QEIS;3F@89PG7?>#Z}R3msdYX$Gf27B5mrX8 z<>9_M6zFpDiswI*2a!`yy^hLFd&cu^)CxiX

    q?zIcAk{U|VH1Lr>$qLBDkJ%l8D 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%0Dr|q4 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®FbQ_ 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%0D-B$lcXj(!M5VY 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 &075Qv=WA+vP92B5(O=;-8ki!KUdW03zHFK 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

    Kr!IOq6Q7?TzDzy)-fY;^MGt18Mq3kykJ!_S6 zOgX#-1Z{OPX1L(8Oix5$Q+TVPv$dh@mDo%0ApR0w_$%a)^$nXhg)i_P#CwCvY_glv zeJuPkkSrWFm>2zclV^^%yOTZ>U#t5n-J_VN_q6t(O3j8Z`vE#;JLcXjNIH<`_)aG7 z$J`UxH_jOZX&K-Xc%da6PqG90EYy;mI8`)o2jH&oY)l(&vpv0|l2uYIwDtSrb2t`m z_*+7@4{`Nqf_8a(xz>e##X^5fV$&v6?xOcV*mm7IXw(?1o6P2m~sv>vkx zAF$mT{0YO&j+&m~rs0lh&YX5BDQ4z0E4S^1JpkIAIW4>k&LGY$r_zq>#IughQ33dn zIu|SQklMb^;(wW%HgQ_y7ME@@PdA!JYTC?MSsR*;EB5Z%TAVmH;>+jYT1RqT($3_4 zT-nYkB*VfrcNf}MqHIg(`Co;t9)S#lZ@k0~vg4(8v^9h3L1MH7tiEtE=X}47KWugC zU{KMToS7KJhv;z|d-R}(0%dUmE;n6(9J-mf$0&o0-x~3>7LO4zcDzl|#9_9RVwA~% z7NcMFrpIK^>txW>b7*uQ>q&y9V-6t6+ToU)T>Dmy=||7eE-Ztnyw9?T+7Sv+tR0DG z!}hV%ZhLXN4L!oGINL(8&NW3@rP%!o3mfPwx&HbeDzvK@8YVycY(epLW?n?f+{kF3 zKCo}@pt^Jvu&gf0?um_Wo8?i5n-G-a>6F6iB=ouQv_f#&DH|eGZlgBWVjz{m2=`2XiMk1f%i%DzT) zs_CvOwYu&gs0tL`C1h1ORONX5_|drI#{}Vb z)s#x0K`aDSqblFCJ}4fEne_o{n5+*hVsL|3EMWa?shqW(GKs~cgpi*=NLS?^k#jFj z|MmpvC@%O4A<`L#WHMab5%E-(WT{HuLLnEdK8|8s08t^$(JHEJ4XJYPbC#^jY`B|~ za3?1mxsTjt4N>KWCXyvfUOGgYacj6|KH-wpE)LQyh|8k0&T7VM-N5DSgClkJOnRTej zwJH3mC7tylvTdEMh#fi)_*(>t@1jBH2x1%#)gZ#i?efSK#{#r z#c*Zz7cUsJP^v7`7B~^?q<}vozrKY+h8Mzpj<2mxZ4U*yno()r*qTr+;Ry`r!;1*3 za%)bd{fTq*Y&0$;kR7$mr+Nl(oa`Mg!@}nQtwhQ}%K}oTe=;dg<-V(eJO0tq+lv#K zl}M|_n9sLAEraNtt~FS@!Lz{fIe{S5)!hjcRCa~R+UY=o*tsY1Tob!ez{vuLX(`|o z0Yq#HI8^{;98^!kwPu&P=N4}%)#2i9V#b4TEWDWVN0(tEP$4eI&qppIjJE9zOX);h zja)7v{Ltm1H5P)Ai@f3P4^vy8Vv*DpB&Csy;B7-HT)XR^uB+?qM2@L|b$KeRsf7)h zUFTPJeUV!sXCzfc3*BLztuV*rw!(Bh&cWpVEq?FvlYFJ8cxKaHj;F9*f0cY@PfYtT z)hJd-g77JQ6(oEVcA<$6cr#3I2 zrCQrFy%_zGGyRWw5LotIJ=&i`?5AEpiEW#U>FKn9?Ff%Lg46P{*8gmZ6&>NsNA%h2 z7LFQID2y?kJqHvv9=<3RzQRu(zkYl}IZwRks$C_or*c&U`|ElXAilu(|xf>5zgLVpFJqkubv`D9{5 z_8N8c?-vj_dIAz^-{VP(!%3MT*)-Ok_Rf}Zpg3XnSP@?Nxk6o*gj(KVY;|g7e^uN| zzyz^e7g8Kl8njzVLlNlsRAd)wxOjjn;smY2o5XphwQG_HTA@jV7UY<4tI4>ftfMa@ z5@VTeE*8nr9F)SALe(y{v@gURoVp$h4vs-T!y)4415AstJ~6DyDMB*JWCYwAtsw@hK_JE5px9dbxOj?nCf(yWV{3#7Q{kO|EuzcyQiqf)52U6a&!0v z5*weuH82(l9b@JlujIRoAjj-npA*G&8jbUk0Km}Wqq8LWNIwI zbQZ@K!>6F*5ZmAC_*r=x0Oy37%v6mWKcZ&kpEb>&i!=rB~_^m}L{a(z(Y zB>m_J^x$;1IxI0lMdB>()PF$UT#W@%zIHh^>~b2^Wx7#6nvtFl_k2L6>1f6v-GU5h zTF1C&s#3JdWRkPvg}wJ|(XX_TMIaWZ$Kr_N$?6be{-IQYSJ4H%4D}IYT1u(4O1=iD z;T)bsiP@c3m!?!8Nz=3;P1Ds2Yfzj%NRigF)*@ExHxPWvw^-v=XW0$VS~Wm3ahtMt zw1&?kyljBxVankz!Azfj9-M%pyYhmv?)Rg^zi+TDJyczhpz%Kx< z!lZxi^1wASg$IF)9R#yE$ZI^e1N(DBc**t)wEc7VdE-2_#!ca`L}9+pp>t-buo2;l z^b_H)!3FX4gsZ&3BhNSRJhrE;-{$M3tBXw7+PRfj?bnNhC`Z4+rHO7UwVZj#nnTVW zy&#BhB3=;Rh|9OTAK1$ealMgkH_pVTDumX|`Vj<}F; zN@W!&Yah}OA&Bo8E$CB(@`I{53t~%(7KmeUk5>(qPuArn1?(O4c?#0-U*?j$*1DfvT}5;W0op zCBgIKdR9U_KcQ!(#`DkhtTcyvH>Xgq!)ulgvi8jq_bpS{VM)2ac{ zc*yg#Q?W?OMiMk08ew>=G%QU^tnB(LSqRjV<%p8&t}?swZ9mS|Er^J$ub4cux9|{r zFB?yu1eLVco0Fuh;`%Lk7W2R?%`RB)OOWVyFy1QU$nq))%KMDG>QlHX?=>p#USz|` zrhq7~Jg>ZpHKM!|iJ&3-Ch{iCzA>dF`n|FreY2)zU#>k%dP(-I`np!xzi#9U!KyEL zUTv`K>o*fFzND&pi!SNWmev1IQZ4AD%Be{)UPo_I!fCI%iMHiqtfXnR;Ylj)9FvOM z_PwYoozL%2N)8@s(SG`;`XsA9#(2LzNl=+ir1dEsKeXoKhvx`anM+H}_~Ch;|L5^T zn)W8ifaI5Hg0vBnXD(NG5aP$0F8%=)po@$p>=3LI@Y5gXOo0sIKbrftx$odcgu_+J2{nY-DndmkwKBfq6#X%PPv z)WFHS2C+hU9Y)1~?*Z(J-WTd`I9j*(cl=q_V5mbgLd&%e049W@!QU65*INccpuzII z6`n?DQ}`iJt#i@JPnNJ~B}hU?(%TqK{~%QKPdVe63z>PhlZSi)WHeyj{fICL5tw(c z7ZEF1l0wM5D}T8A;nd({RE!C`NKA_z1*hw!cm9}g%;Kyn2eEh%#DXn~5jqQT(Tup< zIQhRYLdNc_PgBN8pJp^1syRu96^9b6G0U(__Gn&>B2ymD=KmMrvWbF+X%0UDgF0un z++V}8Z}7eYik9|ms-su)dj{NBJUAe;g`EuSJN&#pPfFVq{@W!!dFI5zC&X>Dy7C6K zh`ww$BGX=~ny}m*SP;Ky?jOv33wLoYfhxx8DbdCvK2&#xYuZk$v zC{^Tbz#>NdD>aq30hJ|)h45;H8YF!+wHyqWXsSIoXsQerxu&YN7|j?g{zR$?(HJal z6wz*|C4>wX@;yy8su>qZQxmxMMA}YfeUYdv-=i~Dk#qM14e_dwiHc~YSVzl%i0)`{ z)7}*7E}ZR1Zu?B3V_euVSy(qMR^bvQvvN8mD@n<$M8^J(QvJ^398*qq9;0IrCSBSC z{ zof5q<&$EI4h@b5FNs$((Eb71(Evefqk^fp*IB!zL&v_jF2c{2DT?#{oX)m;468vMx z0K2+84>EC%S_daR1_qOjfV|9NM6&YF1ew)Q7bBd3fCgAIkQ9AU`l%Cl7hURm$>e{i zB130=mKV*`q+4q88AZ1t%PKis`}YNjzw z854d^Vj8jto(x%x*i&O$=^{$WpvDs`Q#iq_@7NpIf&9F_L(OM4=g=CY14(ZwYyUq5#dt;&7uv}- zysoj~`YK@?Veo89*gN|kUKTt=nPjv57=1`5VHF^)auF0M)}Zho`xN z!SqcQaTS*1Cst^_-8fg&eZOn-^W-KLHif6VG$zmNDX4ypGr286L6F-^BxXH)5H|ra zW<}T2>Y7ylQ|eeYsUa`;rkO1o|S+(-*~R(3kvN9!t{FD%T%>k|W&lCx!W9 zG=CcUED2w^WW6wn=V@5SSkEDHvhz>G`%A%h81Kh`g7-%dm@`&+i64i*vsNMi-Ln9- zGENZ7H5|rA3-_?(5J-!gaMYwVq;C>SlYF=g4*JzC()2ud7#~aQ^GQ4F zzIsH)&sZT^6YVaAXd=N%?j-$YR?(I1u_lT!v^`GBcJ^jVRZ$jv#4*g_-i!}tm7s(G zT!7g+t;Gu1GF&`aqvR!xJG}%C@1U6WImw19_B~0WwC_nOkrvNQkYDY@)#AB3RiXA* zm{H_VpQ+(<$A;iNLaTkJ2AC5Z%aV@EBO#JZ0P-;e9ZT#aY8WV@bwVL8Q1Z zje={k1+;FTN~-g_2Qhj?-nVnqiN@N6rs-4m&d;4-EzHv3qr0R=VAFV;1o1M!!zswL zvOEsRS?;VCP61d}q-+1HJxr?nja44Up=TY1&q$-k^lS=Y&@;DXWjS8rm#OW87ih8V zzAV(KEQNIY25;d#h?fV?#ys5c6ZF8&4~xbT0PR%VmZ-yYVMT?D`*5RmASxOUR6R~7 ze%`<;YkHh%@~TsD)#KbPeb@)`*fR)-9!K7A_f}~Gt5_t}O;S3&QE-3txg~0;p{zXw z%0AEJm~z+)!rF#${zP&*0rEvM+|o5n`yW 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� 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

    atVm+*N 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

    E-dX(#V9smO0CBt?_5MK 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

    gt|@rrlN16 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

    9zD!W!R&0Y)Zpyd+2o5G-fcVmRv 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

    x4)BdgdV_?M1t7FU}ls>IKNlf6BeA(7z)_? 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�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�H?s7>kZa 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

    j5h_yN4(`Z(zwoll0)mCy`^ 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 z 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

    P!%aBS7G9X@ z7pxBO$9-Qn_-H}?56d^8Du@fTPa98=VLXI}Tvt8x$p94ia84_>UMa>G-;^8e`P0+C zOU)QU0~egm)bQe{LG&)rqO1<4OawMxrllpB{JP&8vN_+rS;nnFzum^8tS}(uwf!Ug zmbM!>zHHX^<9M3q-NUqPc8r0+;+eDa8Lh!Jgnvl$h_sT=u>5< zQ;6!8OS1wHl!iE*S|=*Q7}%k-CV2< zr!69nGluCq1T$Pk7jj{%Fyk?H#1g($uYkY6F|;=oPje`f_BC{}P~!`p)ZcE0oT{(k zy2gm+NB3o59#@+NEHa;yPlx8YExk{@!@h4_qRmT8Pb~ee#z@>W&AF!;wXeS2=cI|1 zhd}rIP@3@{%EB#jiIo&=KQx~XrLB`oxSM`StNWsSv`IpJU^N8M;1`5nLXP^p?&<%$ zA%%uk&-wsprBEdp2*5Dn86B;<5Nv%JUz4HoA8MpGs@6*PL0 z;poyXYV8=Z2vbG&yYcv;af{aO91y+KenDSv6?#LvhTl*)ad^XLRwpP{71iTDtq)p< zV#YWOn@cdUiO@o&K%-hZgPiS_huJ4O#z=4DaGTs6j=&%sbW5#6yt*R3Zw|G=LN(*2?VL?j;BcY0SM^W-en>o)(Kz~tg|M0t>vN6AqE5jM*Eix!?Ycc) z+o{nMS`)jkM;objIVjji3B@qdWL(g)IL)-Ao!hSq{Ut=Y%O3RC44G)B3T$*l= z4#eHWZrPMl)uu^(rnePnqNc{~Xik6Q{Jp!7myD0g3Jn}|j(@dZGvzeq$|9%dekcNU zAEEX!GzKzu(YTpiotv|ffcE%q^ZIDSFeAE4c30Z&hyHiw{lebd2QTl`NHR+R^QggPQWXSxbuYHU@v}S{PB~QoZkk%EmIOImk z({mU!N~r13JsqIm>yL-6N3&n1%McH7Hx{voF&dh`mFT%RmkTKPmf+At=|~La+~@9< z!(fk5$W>0B+-#oW&T>+oPED1RcI4+u#~qz39mDrZz^l<3_PC=RQmsz;-jb-ZrFb2= zq7#7eEXHo`>AykoDS?{Uc(d2H#L%ol7Q2a4OMxCAZ=7IU!>OUrsJWy2yJvr`X_y5N6!mhMLv@Qfo6y7TzN^(zJY76NM2s&ioiGN4OX)mG%fIiWg^M@^$+Dbh&DYRX0^+w zQ$?CPloN(eSoa4LEIv%-#iRRBPjZdzFfSk9Sr}&6Jt1e|@hY9j!pTyYB++H97-NrW z@nMPk=~vM*LgQf@S54qLI83_UCtFf8w%FD0@+{p2u8h*tosIqb*mZ51H$C5_SHQ#) zN<~*05P8spo;s#;9Z(CR5Djv?aNApO^tOu#)^1&T{i@b9qWk3{i-<6;aZ&^@WHuHu zQ!Kb$s*Le+g|7`DRQ!UImeDTPS|W1DM4hIWQl8J1;R&(N#{6JHJH zV8tkqu_;kAUcV#v^1BjK_kEzZ3E}^7obbOv_P2XgB$o_A` z-cR5A(UQdeiD@zI0j)oH`;#@c$g}G*tV)Ymdza|5q4$Pf=cY)nKi6hGiPbH%Y-#0r zJWQ=T6tT%#`RT3bw|H2z+ObB@>X*@84fLIceKM3D+8xV<4qrRRICRAeT-zV?fOX{el5U)`ABi?@1DAQ{cy{L&Bh|(S!m?XV?t0xe zZ>+9G$^&y3;>jPKps{^i{Z=I&liK1vM!9zMhg|KOc3e4!Zn$rj7EsI9;fIr>T65^H z!@uQzPk-Rs1+0Lh&)F%_3pu#dm{u%dWRu8XX}vbi}N4C)S4D@Vu&M zL^fJUJ!=b2ZhH^3?L@38+C~jNr!N4l0|NIc+8_OSwJ%{CnUFpV05C1AleK8!bp&aH zgZCx!(6^BCcqe9_?)CcVzF)1T4F?w4wiaDvn4UO1%Y5lQhM68GXO!8jPq>adKK7~2 zD#0s<^A&e z##X!K>4LRP>bj#oT4aOGust=lgpl=6;8u;s2H~Jv*bg9tA_55c*Qr3A%nXcD80^r7 zhCs)e)}gd3bsgHxIV&<@g-NyvL-WTjU=-c&%J=W1ZwviNP95h4L+!f1yTy8MTm6n* z9aFpUbI)cGy79$INblRGbFEx$mu7dhV;dp|yr|apm0AQC>&Ot|3l&%Y{3X;C3=qff zqrNb8X;a{FXJ3aGR!90<*d!#=>3?%cu$VZvnE|Uoy+1{&kt%xJ@`gLRkP165HI6J| z&D1PfB%UT714Q}Qv&

    bnXPPs~ejzL5rzu!~rZ+F(?mw6HQ?+G_I%>o0?vX#i##n zE~I}MZQ_h&ITl(NpY~TCkZE15h+Fiya@5U3xZuV^0fl*KcdKtS7}v$Svf?VW@Wj>Q zqCi2y5YU!kT&eTdu>_?8pZ>cI`O=1+O53Li@d$SeF#!5_*benz`Yfamw}YaJvlg$* zsRqGjjp@)Skj;OMUKd8Te~Ov=-^a=jx*t2&Ae2vidG@_1zf}K2DAoTTWOw%9wO@8y zaCI6SJv#08EL*~Vnzw|hqFExYw+HQ_u0~N%mU|iQsVx#bP`%nc{SU+Ok~JdzSvZ~V z)>BWlfv~23Ki|j$ztDBmSp3!%!TKSL8_k#fglTLW0f8TK*1oOwdf|ETY8>SK4`T}I zTVN~Q^jTMnBizWC5B-~)$3#! zQjtDx_w$n4koHkYO{t&Awl>WA#u)HDl4ckaA&`j)XKW}KH*F${&(23}Vj17Ka|!o} zF>dRYXejGsytd9}3UC|r;t@c)%#QD;b{}FA8l4+VY-?|~->V-^3}}DzE5F0hO`ORw z#))YO+r(fYjsLYSU|)!bl;?@3b{AUCq~uP0Aoqh>gt6&0Fcu5_B0bRw5!ug!VBd-R zK;hfbj@k9`Z6{;*A8!YlD$`+Ze2Gl#>@L3smI_hcPqf5Oq?c7dN;y6EXYSAB-@lgg zoH6kS4fV%QW?;G%Nv|09JcYw=+ldc9L&RQ}xm+2TV|1`> zn+0-yTF$I?&%NpY{Rs}nf9@yvdG}A`C!A;PcFSinnVWh~dL`skyEAf)^Zm&#YuL53 zgOahAzl4DY8s1>)HehfY<|-(c@K6X;Yx@j_lW%b|CwckRd^_-gl#Sg1mi6LXj1859 z@#+8CnzFumS=}TaH878D`l0{8mky=EuzYp7KlF=KoZ2|(2=Rhc;}iL-hd{vG;yFqw zrad~`a;N(Z)o>s`oXW77eHaaO5~S1>+DQveeSj8Zofj}XNx)OP=p z`laiV1I(ufHk?cgE7x6vZucd5YE2vN@I07%?qA4?9R8Ju{&xQh`FlW`^RaU2BQdQO zxW`VEjrSeMMAg@uE7O1XdsC@%jadI$F%EkwR}Rs74qX=Y8)GTY2c`pPn!}#7Q4U`}XbNq=qt;mX zL~^vRzY7q*$D6_2oA4Dpr5iSkT@=2s4{JO{kK-lfd|yhzb^<#23@p9RUet8aUCJj& z6@4OQKip}B)m*#-1YQ?5J-L0TrSK*gw--Agunh{i(2_tIBhLNXH1?|MkOw)*;CUMe zyL~7D)F8TNQev-Q&Bb=IMmhWKYD~r*G&Hz2B|I0McHOuGvNQhBz~8K1vG0ee*X%1| zEQ&{!ajhS9@#r6oKDr6R(fjlcA=Go<2gHZISiM6G0nmZL)zl?}pZ4!#QQ6nQj>*cP z;V@C$&r9%9d>%S!_}uDsw2XFY?jZPo)-_L^m$Hn9T~j4w{81~$^T$ye@;0WuaT&UO z_!LUeovv5ep-+fP9k>0}rZ8Tyuq|C! z0RSHi8iAqGM|ROW*IxE{`7~}?brsKwKu@pL+t%e=>ruv%I?_$a$I@0KMq^+H`B`XQ zle(!< zXH;khOJyCNlkCsoTYXz3q9e6Bd%Gd`q=sbCC&u~8yAl&RU-CeHLMPPcr1$wnDWM1Q z`Hy6r^vCl;9ec)VP#>1c#GXB!t_U(zfk9lMGQ$`ouIL~6^D%YdPKSg*9J5n1bt8D3 z35-oKT(OrsAPX1$-Cz~gE~x~|mqh8pq*87`^zroX@&0Hjr%>3EpkA{$}W;E@y$o_*E1C|wqSU+OvJV+9`y5I(7e5Q5CFQmwNDL)Ni? z4=aOxW8^S)6XUU?w;(~d&!$&&($rnMAILmH7n1j?p=wh3n`YUb|e!pLa4(H_hVM7*V_e9>g7I&!7af=7Sc(voM zohyE@t0(M)VZ^G#;}a~?4-ZArI~qSe86lxDjP)T@qCe1mbSBSstDw}hJwu5oZ(Lft zK1KU5oZHkVW}$*mVgY5IInInN@cvB27ZAKK>^l-3x<>@P8ni{wA2xbf8|7Y(Lkv-Y z9$bIH2*HUqON9{+bdXDEJi!MLCc|!D~rr5$Pplwa&MvZ{U1NUE@QP>3|3i0x6e!S%nx5#>N%gp^ts7>!V-8O&tAL6hS`y2NWX? zv%@RXw4-a`t?Q{6C5HtRbayaI32kfZpxsC92IEF?d*}+q*)pTF79oTSc;Yz&bmI_a z@E~+N&_zWE?0WiNH{_$Z{^O?2dNW}~G_Dh4)=fhyNN7^9)ip)ytT?m(PwBF%Hi z&F~Rx?3cj_A$s6DA~OuTad%mQ}5M61zFj~^MI+$7=*j`LaFr2@z14x4ohzn zrT=?5Bf-q}d$NT3J&x~SR^OARU0w)#EbxS~-!HFm4J@CD<^F|?N&Z5{Xn^(5Ck5Uv^X#9asX^>}O#%X_&V=kLmw|I`0E z)F`}9-9n22zlWAWH%zKF@l8DOtnJFMhl&DFQNVA9-@+Z0$9y*QbkM&>sNa+GSP)d9 z?`oc^MHprs!n}@1VR&oTC9~SrUlz(OA&kdPLHTfnKlNMtKl-)SzqQ!+wa>YFI~Y!( z^!}UG&g1?ajF|>np4FUdETQ}OtyCeb65}$w*=#)i;+SxM{4Z&jwT=!Zb0R z&aIaG3XY`%mgzS)oW^p1ZuIa)wX=AC4{z4x5c1m9_KQYl-^^UGp)jL+<1QbEg}YMnm3FJ zP?GvD+D0=CJVF4y@0S+jl61JPc!bU2#eQzBDUf518Oj@?L5pW~XX^**@#t{t_0hh= zY2v*J$gf>J@aRY;Zn3m%Y-siq$@fovw4l88ZV?mkD4l77NYWzji{HpB z3()fRj9@A#0lStp#z8Xi2v?`-Y{n;4e7Le)>x(O$-14v(9O!7*j3Le$!d%!-td>m3 zYsiP0a90AdDas^~n=7?p%M)U2?nxx%!DbkCT|FzQhx2LuyNc~;HUF?ivk7ov*kY?{ zQW}5!m#tdW*a>5g{%p{9HwT^?eEwtW8MpTR)>B0})$*XKLnwzB^8!ElG#gKRjZyrB>Al8(m&U+lSU{b!&>HwXwJbSZFEjPMv?# z;`}uriRHx~H);c;HH3Ep>bt$;!GS_U+oH!~ zX~o$EW6jxsZ)_$ILu;&Fg+h&cvGGEnMt2A*I^vxLrR^%fbQdgp61WK zTg_3dPto7R2@YV1r^c73YGYnMG3yU+)X>DZQdNs%#vZVu@EN9V%<*ifjJvmq8g!5l z+R!^HUnKCP)#Ne;&Uye1M!vdF!FEXK_&4+={2fg^xrVYq@P#FrxiAczaxZ`U&%ssV zARF(io?n^s4Jx%$^TzySEIV50a03f+3z@mAAT25^?h{YV@(pJm^?l2zNaWEb8sNe4 zijb{mtBh<#TXUc=%WIgWqiP%VF1Yz7S!6?FI!1e&3(Yhc%4tBAcoz1oqT*R0ul#jP4%VHWa}sml+c( z9-XAnRYMm=d#Cy+%q>3wpy8oAG{*Nu_GdBG2*QXKcxi|Ch3+W=(tVv9MtwY5Bec4B znt3c&Its!3ngr8l`JJzrzu!Yqx!PF4eNoa$OJsqduHtmDsF7F1F37bINFLYXGYdkvj#Pu zcnlrXp})p^F3?-jo(NhHLOJ?TJlWXOe5lInCIt3Q52`<8>|M3*$L#s~sN}xPxK(VeYv9=nYkLO!^qv8I=LeDFA1E$aH{VA5ezPSv` z5E|6}S;E9k?}hZ=_`61Pr{%DG9gEdogdQ0-9#iGXQTx%=24Mm5^zY7!Wrj%-%Q$Xb zJA%5iFz(Q#g$*k011X07f+~tQNNzRUA^ST5&nHA7K(twKQV>tAgRT2+`ej1|vLVA3tkptYZA9d#YF;CZZF*Ut;n z*uqJ}YrMJY8V}`l-ny6wgLI=Q%*1_)0~aMd2AnqM6dr~(-*ewx=s)+0PAbN|+Qr8B z@S^;Tt~qwk+f%h0U5gkd)9|>-@Pc-k4dLl`h|!I2cV)1BEP2GUfZEMHE!&h2yW{d# z-#v~Lc-{fkk4=f&a%vI=5qK_JACNcjGxhT=FE0WexAp@VOZy`A)s{YsB+6 zFD3N1w3MJJxr3+waD{WZVdT;84)$l#r>7wh61rqD)>qOQ28=Y31)Vrk=5R~`!d}Pj z!~HK3ImDT~fR}`~*$Zu2;rBz2bH~hi1#| z!M{J2GqCi3G+=IT_*uSrG5!tBn%i?o9xnJRv2@IQK=eRmWZFD9=7gEO#gb(p69D9$jBeN|}IJxKE#@k-^eJ=l69^}(KZ_B}r z^7+eSkKMReuZVu0xcB5f&_N2%(%U!afeyZTLow&%8|-bzAi0NpS-(fjg~fPBl-{*2 zi}z3m423QYI%C_ui9>|KXR)uuy`*Vk4)>OR20y~^9(QwDoD+5*x^#~0sIkd3uPBq2 z1+JkDhvVm364B?cYx=kxqHj0GH5cwq56nS#5_t_h`OZBP7|?XiFvup2a6P>1XVnGJ z8U?3U$BSp6t((>5YLAwWySO^#6S`t!9hm+cxn5WAUHo*9mM*q}hdEN!6I|QY*AZ`J z4`j<`vg`B{j|8>ZgchdO^FzN&u!o^=Ui=vwC3QwnA5%K+m>5$ zpQ7p)G0P36u3hHFNg5Y<a7^s+C2M$WQVWFa%Wkn~|y%&{* z(!i+CJ+GW%Iy1gFdvC4?gRzJ0J^QVIhPA!`%k5!hj>-CsFs>$`R zY>e4`QNy}=7r&Akz)Z`wo;_Ao(!)FtxMdBZycVaqTbIa|kI3ud2R=TUmdJp+X^8~x z;YoaXF})fi+L7_4alK_7Zi%niid1xstLwdnYs&u%aVc!0i1ObwV*31bPB_%ihLk>r z6i+nLn?_^ccDHKkb2S>zN&7QAYr&t7_}iN649g~t&B-g?eU?{r+byp)c~95YeHHiI z=i;#V_n!Y(mP_R4oBrP~{lD^7hP|IloAg8ZgV}uj?ML$4kL36Gx061-^qz&`d;V=3 zhzvUlGE6L>N3XNp-Jox`q(6?{1tvVO&EvZ759{y^Tb(dG$3PhUWt)V;@ZWtJ4+@7p z_V~Yo0qcoxMv&$>{7?yj8=pu@c|{0rS`!|1Y6e;Y^q-KNY|Apjov zs>e{sW)6`98)zBAy*S)yHa z*W=}DhEoJ|gKC4TK5xS?cL4KQkG%YJm&W$$@qDiZ8KaT4A*dg29EwYNY`~8J15OV2 zhbbRj4sQ&&H>IX9SAoDhENG1%89u&#SboN^6?0BF78^ewmRiN|#>oTlu#sDS$b#9g z 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

    `$7q0mOk)0&n7L;_vmCI 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

    S!LAcQfFx?Hrq0eITQ>_vDsF1 zOam}1#THx5F~@;nDYn@9j%np&w%SIHIn&8(wJjavpXh(KZ5-pD=zq2y9OHLaez9F0 z<9AnnvArGB0hT{QE&po!I_4@cD}@>47(dc(vqK%@N7`+6j4*Lr-ELP3lW%T^owcyD z-8S8q@yR!Qv%d+<@3xO){Ik^`c84$pW*oFwJAc>;`>7W9MSp|VpLUUBo`MW5|7o`+ zG4|zRW~XgeR<-&oRp!^N%f8PPH~W#uOXnnBr%v&$d{(@|20K zrFgLh!sMF+A;Z>Nyjbfb8Lpp;7waI*`jQPHQwknt73<`f)4-Gyrn_T$g2@r4k7M$| z915mHvHp&k1g5$$d5(DzOkFUEVnda&E5I}mW{qQ3f?+!>S!}B?i|qz5$3v!6v2D)I zPB15dDP3%*V@jWcU#=1+d;eH=&gNx`Ra7SX5Xf-G-?vybVaA(UV9titzQx7~6Hk7Y zEjCq{0&@anxk)oQG%#LuFE$V-wXR%pry_gdxm%5>4OAB+Mxz zhea5|@Vl{yhzrXK)-}~*lUeD)i+h?EBwQGmklN0u2pVjV^NgYSqGTN3+tsa}Y z&+@6ZTx!eamh-LYov%z=CfTxub?xSkeA(r4Tbw_g_O{AMRnvOC@#WI!Oz;OXA(Z z*=t6Rrz8Pnp(KoaCW#@xN|MOB!_5{MWE)8y*;`UVj+9i9Gb9b0ewM_MEsr*xQ^>)REHXw?KyHuyda4oHAxcr zR+2%iW6TzLWHU(#*-cVK4wf{KlO%0qoWvJ&x0odfBF{)7$TCSB`B{=ee8-y3S){+D zfDD(Ekqaa>vmow@gu7wA;de<^ob%nN)pJSk~A_}l0&i*=TnQ$&(|Z8 z3bII2N4}S|kPVJAeZ0H4b9R>mkl~Ura*-s4+duhnyrSB4Z`azo|Rv(|7V+Wc8CIkztYya-JlQWF;l!AxRZkAZZ|9O4^9$B-6*& z&+XGk5<~_{oKG=1olla)k+dX*+$PB)Pf7~NVo4cUC8;6noNO94k?kd({%)U$#E+aR z2_X|CQRH?>0+}aCBkxLb$d8gDvi>QiVFd|F>c~No7IK=z8*;a}LJ~mok}&eDB!(=L zB$1ya8DxV~O~X9WS5iU_l~j?lBn>1ZX(O{GzCGM6UX%op41T;kc&?d&<-r2CO=B_U*pB#N9RNg&rs(#U<195P>0L{>^F zNRNc+Q%81`w2(t3-o4x{MoR)nRuV=Yk;ITik|grIB!g^lhUt?>c9)cp;S%S{b?05; zQb_~3Thd0}l=ud?XZfv@6f#qiMP8B=kgp_VWW%#eRt?!l z(nL;|c=mStWF>y&F-ZtnCW#_{N)kw5lu1t`he>kCg%al~aOcsuRZ>A-mei4zk`}Vw z*(S@ok2_}%NdSpU!pLMv40%YBM5>Yu@}ne=^gPF;myrD>RU{#4AlFOU$XtnUUw4aT zk|5HSM36qCO?n(TM3O?zlVp*cq<}mpDI@PoYDinsM7BzrbWhmrJXqpK&X9zVYb8^Z>gytBlQ43;=o=sNEb$4R2d7)b)TMv_MEl;n`7Bt@husURyQ z&egY0diM)V=N7W9#JNVc^IcsMKu(v0kt-!JWVR%Uye!EepGfk^Uy>5C#f7F}6$wik z$O)1*GG5|bC+ci5T@pkdl|+!YByr?RNeZzpGJUehmXZRpkEDzoBdH-5N}9-2iD$6e z`5}oPnJ)<;DMdDno=sfbhE;i`_ zWPeE*IZYBnu9hT`ha?$fktC1&C@CT9Ut-d$$ZnDba+IWvTqyBH+%0BEf=EdcLEe?b zkzXV!WYbGcpDZ#!Qb3NAl#%h08gjd&iIgRtgWS%`CC;^X&U3Lw5<+^8HGQJU07(KF zDM=$^B{^i4q=?LuRFLJ8IoU_Pi-aWw&QS! z3prEb9qP`>N&?6ek}&eIB!;Xv!DJTWSr5=35Rjw)R6g-Ceo024s$zOlT5lF=`9H% z`%9uoT#`V>OVY?JNe+2hQbcN!3i5}fj%;_OY1l%Jl6a%;7HLTUc|a0ImP%sCpOPf9 z!(@}?Tx;UI!jG2ZkqMF#@}Q)O)Fch$Z%G^3DPyvHhr3w^OM=KKNd&o05=S1Aq>zP@ zEYg$|kae#z>1AXWNewwt(nQ8cJV&^lr%C+C6Os_}jwFh-B+iuz&f~nv)uvAx*+-H? zPL>prjHH4*C~>Y-a3(L3w2+@9-Xq;(dR}AF1IT`oFmjqChFl{_B1K6CSt7|Jzeq|* zuWLQh$aINsn7hSuk|44|5<%9v&SW|NHt#$>{Upx6%{y|uB#T@rDIgC? z%E(el4f$QtMEYEB(mhAHS%*se$c2&+a+@TIyedf`-$>HPMpH~y4%tUiL{5`bkn1IN za_1S`OVU72 zlC+VlB)+5Fvx<@+@{S~e{4R+jTTeCVDdZ4I78xZeAX!NnnJcLwHAxd$Bk{!C&i)%s zx*r)R2_Xqd6uDNCK#GzyvRINsT9P8t^CpvCLBf(ca)P9VOptg-xLeGY1dxg(jI5Nz zkaeb+^d!<(l0k+^^2kM!5;9X#MV^&3kh-Le{4Mbv<8IMsy6F={4wgiaF_JiPt0aZI zD#;?>N(zW?hRG@;`$=lZnUW@Qqr`Kp+j*YEk9;NxA?xH!Rut(kNg#1a8o5%ELyD3j zvP@DzI&L;ubz~<=3yDdbD+8RL_X&~!GDi|dmP%qsTarY!n`zQB$S_GB880az1xXco zNzy<*mb8&SCBEa_E&R8b^dPdYB!V0-i6i4ADP)!;i##JKAj>3W`$P8QC~*(rZY6NfS9%;yKanbD6}C+$9MiuSufFN=X9w z*BvH3jqEDPAxBG!$fc4Ba=WCCyd-HMpG&+axm&Dtr%4YW0ZAA+ND@QNlq8XBBpGCm zB#*o)DIwoTs>r|YGJP6IP|`*Ym-tS0w>VD{L~fKg*GV|9pShAavP6Zqbwkkbgg9vckwfNenqhl0y2_a)7QDnL#fs`a^WSJy~tdSIvUXPkS6(lUFBPU5($V7?v z9CwR*Bmtx%2_s)hVn~n2OnMUOE6E_oNb<-Pk`gjUQbm?X8p!Vw=b9epoqwCTCfzsM zm8c|$Tr7zocS_>O8z~Btc}Cr%hG_IY|;nCP`Ar97z`W zkEDS7A}J$VJY%wINJP>^MoT>ByPc;?{K&Hs=XxgRC*@N~6j^JY$x0x*NYcm%Ne)R% zipbrP3bH^_M^;N(NY7_Yx_6A*aG)fBjFNbuz3Q0?{$la0xQjwIAuOv0ZTQ=!U zWH*WDLbr2F;z!0xLP%Z`MP8F6knbdEWV07cdJc(5ipcqr3UZsIj=U~uA*&_ci`*?X zf6-(GkRg&Va)Bg<sqPLl+XDUvW!lEjc@k|ffWWRN}; zlb%NokvLa(Iqx>-NvcRr(mKjhfFyt%ED0m$NMgthk|Z)$l0n{)iGd@gAs-i0R1 zbD7(44~ZW+NfJV?kwlTXk_7U;B#l^Ala)iZmlTm<66eY`=MftxsU!DDTF63)H|?I) zk_3<~-ZtrBWQZh&oG(ctvm_bh6-gfXMp8mHUSzVWNLbQ9j+3;J@e<$V?iRO8f=F2s zK|Yeik-sD3m#U?$3Y%Pf* z10@OMWJwyCAju(jNQy{VQb9hH)REsMEo8GLrlI!=cZ&g%0CKD(j9em#Ava5sNJ)}G zK9S^+j-@8OglsFRB8N&E$oY~sl9Tu*x?4Oe2_hd$B1qSFOnMyIL6Slamt>I(B?aUb zNf{|iYRG4jCepQL(mj*h&O1u{$dQr|a29%55~=QGwE$) zcZqMZyTu4e5E&DtPMb>%W^hqE)OVUVGl0(jw6p^Wt3i6nwjx3b4kZ&d4tK2RA^?~UVKz5ddk;5c0 zWV9rSOp#=ehb4Jrp`?U-E2$#?`q1=gAUjLi$YB!S)$SIfB|+pmNd$RV5=Y*aq>%3= zS!Bby=~F=ZOUlRyNe#JF(nM~Rc&>3fKQHkkA4x*U-;yY@^+%>p0y$8UMlO=%kb5Q0 zb)wGi<#!|%r0d6KavkX}X(6Xeyw|#OW=I0aYmzYXlO%?0^NGnyB1cOy$Ye<#c~VkB zmPo3|_mT#(?x!ZJjqEJ(UFU8wR1!qal0=ZJByr?kNeX#Il0`m|6p%k9Wn}ZuOv4(o zx1@<2Bk^4Cb{;SBBlk!`$Xk*q@}ney^jcxk)5u^+4mn3sM5aqB$a9i9vO>~A*7@9I zd8fEr^pgaT<0WC_N=Xd4SCT{)NHWMONgmm#VbV*;UXm&jmo$(`k~VU`#FurqSSSf1 zt0fU+lP^qq9N9k@%4@k`OXW z5=CB?B#^HpX=Hd0J43t2AlPIc#Wd}Xo%$PSV)GE5Rf z#!8aN-I5HlK$1sROG-%3uT6Rt87OHWqa_^}tT?ixB!vu< zWRXiH1>{ai8F^h&Lz??7uS9V@eCrRqaBuNV?NW9bBv)+&dkZ&YmWZhLJJ%;QiNg_u}GRP&8JaVg~gp?&! zq%LV79p9PsHWHBdrn_4lA_*c%Nd&n`5=Tms6tY~BMcR@A())YUr;J1-HDr{eiDV_7 z8E)sf5rqvBt>Mgq=Nh+sU!YhOnM6$Eb-prZgILKfLtpHBacX8$WloX`BjoZ{J)y?JTgd9 zLe7*_ktvb}GFQ?@-jz7lsXOnzze|G1R%=Xp1c^xE$Z3)kl96PQ`y~ZrfuxLlBdH6bA)zoAd^9h@_32Bk|qtZgG<& zh&(NcAazL`vHmn!DP#vp7CA!VTwCwFR#TEPa+{=vyew%VUrIcAcaHZjlkP|QNkYg- zNfenNNg#71X=JG+hqNU{WV^pjdIcFKsUzbhEuL11+j*(P zkF+HrWV^LZdK4KZNg(4TX`~>@A&VqMWR0YP^jXJb)sdl+7Lt;9?{&AhOAmB@LvH*JQPk!zIqAES%pdVLm!yG=l(dm?65j*v7Pm=)$n%m2QkTS$KP4$-%MDGREOLOPfSe*JBaAc}?P(<92RH{7A<}Cf)h`hV%OAEr}unB?;sdNgA0b$su=3ipa~73i7F>j@VzR z!Jk`NNNBY#UuNN=BMSVaa&8pvsqHZob_ zd&u3QAPFL`OCrdZk~p%~CMG?F>>$Y^LnQ^|97!3ODybn)OPa{X63@eK=kEVD>3(Dv zNeDSc5=ACR63G3MG_pvNLw=DIku5hh=@n#%q>h{?X(2Nu-lDt3Q<4C(ToOk9ki?KJ zdz$nlGDwm^5|TV}jiiJ;B&i~AOB%>(NgLUCGn4Ln#NA>~Nf0?s5<$|EI5JC;Lgq=b z$Z|;mStBVUJ$soxHDrLKiHwwZ9(6m9mH3fak`OXa5=E9v637}!8tJ*Y>61eSNQ%hm z66f$LyD3l@}VSyth0rgoJaPSl#o%9 zDsqdYfy|e*k(CnPTz3oamL@BR>@JBQ$4KJHWs($fwpMdWfx1-VC3N8XUMkfy}@guBIt zTbp#}(?`zha8F4XIYAObCQ6dXeUc3FmL!j?l9Ui%ACq21_LVe{(C$s!j?3dn7eGV+R~hI}PyB5MUqmZ#))-bvy|4wr!IC<1hNOjDEAc+%Zt<`rfGm=Pksl>7q}O&PJ&6pK zWRP){`r=!K~}m` zX7=d1cbAU)o_4-(tB7oB%fp>gLd>^x4YJC}?@S(S)sWshxLXXinn*&2A4_t`uaY9N!H%Y31=&$jM+Qq;$O#hfJa>zfB!Ju?2_yGQ zV#rI9BvO-PkX4dA(tRh>xrA&bsUia;4df_E8#zbfd)D1zvLuM)B@yH)NgP=uNg*pG zS;YRbyUxFr47Li$W|A_}S5iX`k~EPMC7$Qp&KFDk$PJPZa-SrMydX&+?@H3hDoGCM z7BpKFku4+@WDiLlIb700&X9PYcej`#2_R2N!pJ9*7_xR>(F=C3)l;NeOve zQbj(LG>~q)n5;IktHf7!w>VA`L?%lj$RmRY4LM5E zM9!6XUT`~KC-EcqNkYggk|^?#B!T=UNh6!=W*X*@-6cij2uTGwUs6YIlC+S=CEgd^ zEtX0G$WM|m;@jQyi6MJPlE^WV405T&`TU{tjy+3KLY|dWkq;yd)>^CfZQ21yEeSdvBFloXJak}}e*zv)v$wvjZEK@!i)Zs(IFe&ljV2)SJn zMV^-=kWVCOq-)6Z$syZIipXJ-3Ua=rj?9p>kY^;`SKKW=lmw8!C1GTnJxre%a@=QX$USrR{zm4uMTB~fIVB!T=PNh7@nm_9k=AW0E9M^Zs< zl+=-uq=mdM@mAa|{*nZcZT2?lVPuFThMX%&A~{J0d0vu7R!B<7+WVNSDzclTfgCGo zBNHUP*WE4dlQ^G5b>8c$k_hsXB#!jj*QBSAL6R(Tyrh6!Dk&p5Ney{i(nJQ zk}xt(5<_m6B#{>+8RQd59_g~bNiQMWNUF#|k_K{?q>WrB@hxz-cvuodUXw(SPb6{V z4@nBy^Z?T^i}aTikRv5!WVED)Tq9{B_ewl(x}9H=_>m7KA>>y{6xn#7X_!EEm86lw zB{^iYq=;N6sUQzX>d5Po7V^2o`RcW=b;1^O8LBsicH-8)DL{$WD?5a-^hn#gYw&wt#rwm-yV`H>Nl z5HeX3MIM(VkWVCOWZj`=at_&7Qbf*{IG?q4wzx%7M_!k-ke?*p#qL?X4mDW;w3+Eb^$NfGm-ek(Q)}Y#CiEb@+|fcz*aBbyv$`qYpC zk|uJ3#PhD(d4j}`%$9_ZiX@7xlq8UKhMV*>(pQp0hDnOZMUo0KQ&LBsm9&th67Mp1 zi|-`?#Cx>q6GnEF#E>D9ByzeWgG`jcPn7tPdnF-cz9fo#ElD8W zV@!G)*;SH5hD(abSV;xBSyD$Hm9&tB67T!&7GFsMNVj86pD@x#5Tj=hG#A61jZmt>HGBzfd?NeP)GsUmkt8psQhHnK?K`^eqm zb4d_cBZ(mE#!crq(npd)_L5|gsHA|LDk&qENNUIwNfWtS;`!L^{FKCxyd?=CpGcy} z50V73)`@1XG_r*xhxC^ek)e_bayjYSkVKHKC!0QTq>m(p43cD#QzQlC z3P~BcQ&K}-kTj8o#PgZkx$7yWk00qP2_Yv)qR4fU1oDg|jeH@=Ase4+vWmzcNd-Ay zQb+EPw2*}o?+SN|-y{KK`_oKT7#SgnA(JIZ|k|Oesq=I}UsUuy^HCZjBm&E&(yG4IV0EtS%$QhCtGC`6=Zjoe=xsp8c zrlf?dkW`UBBn`xOp4p;}^p*I&cDLA15=4%YM36Hiab%n%h1?*?BC{n0vS;3)y0f z>FoWMM_v*@PLza^%Ox@74oMPuL6Si}lH`#;B_(A23rwFXvaO_n>?>&_M@f85cZ;(m zLF95t1eqa;BM(Ya$V-we@~*_Wn~C$j`mLmlbh*%MQA0MBG?Bg%&nkD$Are1wmL!B+ zEr}xcNfJm!l14t41NcW3P zALo86&RGFT92qQ0A*V>3JFqxsO^_6jyrhggD5)XONt(z)iD$Jtxi0Y|t0W=hFG&kxwUONkg}wX)FmyX zE%CP8E&P|6J^>^w2_tcdbMG7Hr!p-`B6&#$c}kK;mPtxTOHxHPN}E0nBqV7g$4GoX zyM4w=g2-)>2vU~Bk&h)Qq~mgvo<;gd3P?m!M$VMfkZUDP)>6p=F}6(lXGBhw`PM`)R3zsO=OP5^PAh}Er}m#NPTDCLbklp^zr`gP97);ASX(~$OK6Yxl58nUY2B#&m?)onrzZb$TpHH z5|K2JGbC-~YKiX;cZ&xkL1cj>f_yEBBkN>LpA@pAB#T5P1>}558JRArAx}w~$a0CN z?RNe{;zzc;%Jc~#gCtQTAxR+DNYcndk{t53q=>ARR1ojgCf&JrlJlwyN?J%%;{DS- zCMgLZSxFcvN@7S=l0=%44C1}U^vNSZNePKcsz_4OK(dlHQk3}qa<_O-5=6RRYtkdg z9+Ehckfe|qk}UG7q=5V&DI>kFGg&p{NJ$f!Ao2X|c78Qb)#1TF6|9x5MgujeRKzApWeG97cvqV#u|UB=VvpgR~@h zWTzX<k_eKK#F3{ZDda1ObB`)#a<3cB z;VmOFXlo6KZCa)=~^TrPBTN{Mr?E2p!6nwgwKj*=9S zt0fiWc}X2vEomX!PB)XiUEQqXB?06{iF3~^r%y!^L%x$F5&sM`IfEQ3$s=PWCFFid z6{$%Yh?O&w+sJMbpT})@k|c;^B@yH~NgVk~l0yD{v&qUL5lI0#OHxLrN@~bck|t7@ zc)GcryUsLOeq<*}2sug;MaD`J$X${&GGCHIR!NG8?-r9@LH3o@k<%nCtT&)ZC&8nU;fi5xHS^l&?0Ch;SANeFpC5=B0iB#^%) zX{7h@viM|v1Q(51(2bVFp`qQkh>&F+MIXV=OtO>8%Y7# z>@G98j2t4VA(u*;$o&$}zuc^MC4R(nx0xJ5c9KMqm?VKrkff10k{q&BQbgL43bNg7 zlU_%LNm|HwiP!6HQIG_XMUpVGMiN8%++(tmNK}$RQj$D!x1@wrB~@gNq=5wPHCb(B zn8dfPyG2?OMCM2$NKFz)ItpfT3JFTG$Vf>6$wM3GY@31osKjpQXcgld$fUQBZ6w}}+$|!K0CI*Tj9e{=ArDBB$O1_Q`C5`k)_K_UDIq&csz_AQK+cu4 zk*N~j#_kr6NrK2?Nd);p5=S;Fnm#F{za)#qBn9MRNg0_bsUgoun#gjA$LDtbP2xv- zJ!1NVkbNalBrZuHmrK&fU6LH~ilm5qE~y~h9yRH8WP3>q87lE^;%+fo55Z1X&^UA+Q?%P-@n~07DElQGN}gLlgJ=R202@jN2Wp`<0L_3k|csWD2XFWBq`)KNfz1qDU)76j+K;=Ya}(~c}Wxb zUgGKHcHZV`Gue+ED+wV}BvIrgNdoyvl18?F#!Sv3CrFCOjgkuTnxu~WDrq4*&oh&~ zo4Z>aDhVLxO2WuZk{I%&B#A7OWRTw^dBp#$NiQJ>NUF$bk_K{>q>apx`26k`3nfA1 zJ4poD@HvwnM82avraVdQK{47pvB zMBbKUkiR8)WcQa$RtY&>Qblf-G>|tWZRBf-Z!33;^!Tr?=aAio}mRE(sy;Nuo&iS4~y|*;|rEl9C*9m!ya+ zl~j;!ubIhpWPqfFjFxz}cDJ}w5HHL|JKxL+B8N#L$aRu9@`faZbbG_h$sz|z3dkf$8F@)kL;jRB zk-iJeWY0Ek=Tjwq(klvPe}sV{Y^7DjhrFLA-773$lH<%(&a5Pr;h9) zX(4AzyaBh*9g+aDL=r~6mc)>53r$uM*;5>96MN&qdl+=(9B~7I3Qj_J`(e1Od#E%>;2_ctBqR73H1hP<)Mt+jy zkj>vQ=|yCaq=Jl=)RCJdE#xJMcPDp?uO$Iw+TKu(vmkqHvt&hF$pBtfJsi69?J;>hok6tdYe(M1rCNVw5C+Op%0gpl7PQDn1EO`im^wBt_&_ zNdRY#7Mw2*5g-o4!|o{0Rtc=mNWzbWw}-$+8pzgC;{C=!$;ki#Wu5<_m6B#{>-8RRob9`XEW(o4wpk}7hj zq=B3(X(KmDeEYduJShnx%OnxxH%T1v|77~4kOL)InI4-ZEL9 z{oT%eC4M9(2_ctBqR2gx1oEaNjjWdBkWGI!=|vtFB3%Nz&J;2>!o+N<0 zF9{>ROJd08znDHrBrM4wCra|j1W5_GOHxH%mNbyhByHpmiEp60#b&>nK0#zJNdy@o zi6a+DQphw(7I{okK;D*=k#8k6WbHMkPZQZ*;u++2K1kw6PM3s`Ns=gXrzC;ABuOKm zN^(e--%Ot((nnH34wTf9grtRBC2{Vm?7XwxF9{%TNW#chk{Gh~@1{=@*-4T?4wK}O z^CczZ7D*L(Nzy=8O4`W!f0%UNf$kQ2NrK49k_d8*B#t~LNg?k^vdG_(0DE|k=e8zoJoDDfQXc79XhN4}JVkggunCyMlzB#=RpG;*dShfI+ak-3rz z@~)(g{4QxBTXi#iyob44L?i*^Y)KfIDv2RaN|MNONe1~-l1KV102v_( zBV!~nyN$A~Ii6LB5yNk)9iwbmt!K&b!SZ zi8sdUM-o70NWw^25<|X_ICph-Ca<@#$;u#mN%F`kk`i*Aq>4NtX&@g++DLbw$?}bG z)B8z+$Vrk2a=j#uJS|BfDNfQ|$@f_!N9wzZ4qa-0@q9lsUk|dD1k~FeFl0!a~6p=NO3bMiG zW{WzqgQSHFlz5MKw-_l2AQwr($aF~zd0di27E3b7_mVuap5HVqA$=uPBr0hjqa|(R zdWr7@cZ&xlL1cj>f~=Ipk?vcVJ}IQHB#Vrc6p+c1GV-XThP*FnBAzWxmM89Z-c{m9 zj+caxt0c~S@SXShxsn9(p(KrT-^yg=kliIkBrd5S<0N(DHc1P4UgAB`?NgTokUu41 zWXs;BPYgLgl0;6CWROXcJaUhuguEuHA`M9c>9(~=ZzJ1Dd?&eE93}}ODM{J^ZKPv6ljS?r-C|ow5IIy5LC%-Nk(?xjJS)i}A4>{I*X>Pu8QDQnLk^cT zkqafB)7;KCO8m%NNeEdYi6TEr63E6om_BJFB*`HoBt_&BNd>t@Qb*=VoNo?r-u>Q} zcu#lbcS!)*d`HtKjD#gIQ#jFI>f?iRO5 zobM!XHhobNLB5d05%10>D~0rzWRc?~1!SD0jN~OX4$ysECq<~y6DI+gQYRD={6WMBCGud;V+xaMoADJu(Ax}x7$Vy29*(_`(r;)=X zIplIl5qV5fK|Yhzk&X8=lUv9^67Tu$7MDr_NKO()o|43nWs)TFt0aT;+~1_K;#pyL5c=wAC@#N+7S>@!WYZnw{hShG51W{(r>v$nO*I>@>k z8DqTaK`HxVZBX>sW3}+?FG)F`Y84<6B!!vt^i-L#%;a zJ4V|w+?sQ#o4$!H<7^pWIo|=$(Q$Rp*ZX$qxWV4^SZhG1OzWB0rAtSnQ%3&RF;Cl% z&#~61|B@^1IU}u`I_1kQeeKCvTaLF@cgm!Wuq}C8PO@U--1H-CdBB!athvZYTOPON zG|RbDzv<(7#_BlT@{V`p%P!~J$Lv$GIue#2x!jg{_E~3GLF77HUbN*bYZP*;EpOR! zwlx;H$Cf3wB&`xswB;jP&a)~=*_KtdTwv9Z*KKLplCqq8_d9+5gIr<-E_3(#*p`m6 z)iKt}b;`^h|2eQr$J(}xvz+_#+t0fm)p6FEPWiISas9ehie-=1^1mF<*C9nR!{Emv6c zI_00q6Rnp!<)6tDt;NjQ+MctsebywajSNMuw04-#ncm|fTl(3@OtwOu^3UYSR=89C znLOEwx@UD{n3J)_A`c>0S%v>M=W46?|K?n6l{srEXI*1`_5aSg)>{4l&broFU#~Ie zHGiGeqf`EAc%9X=Q>JySu_rsv#r4+6|993D>lF7GJ*QKwyWL}Ycm~_ARr{tywa7a zwrpkhxyec*_i@a0D?HgfW}YohpBdJ*$a|7C$oCTGzUod^*8|O2$xfNp(bJX_?erPe zrySGQ7UvxxXU)0FIqRR-*v-!Wwf{H2+aUXxgniaOa=0x+?6YpsF^-&PA9JhZjs9Ia zkIDa!jJ1!s^M7QbEwd#{IqUxa5$CKq|0B*>4@*Yc>DSvb_kU!XEsy_?+-i&c;$*M$ z*us8G{4a5~cvf;5$Jod*jyT7>XwB_>#3pyX&#z-Y8n0N3J7rSG)%G#YPr<8J$JNe> zlRIYHGSYq}ylVOWOPuGuV(oxDYaiptd@GK;ZOgrO)>HHO`z#9q-xlkS%XoyV*Z< z=J}dy%Uf2gQ|5Qvw0lR#1$O#ED~)_&pXEx{J*%T(%QN;_3#~Q(B`?_WwiUR}&HBkc zrkCAkk(KBa_qE|<{l^;HDgR_Gwr07<^spjbJ1(}<7h7|f)5{iT&SI;A^hcIhHRNzx zoJVY_)#w!WQFW!+DKmO>-MdT2efDFx)CyhiG@Q|6Q(GSHlrXZ5Ept01f}CzozQ;~~ z$BH9aNeU@RvPeTxKsGwa%qb)LOKQkyNfVhR@l0_$zbx@1Ur0j82186%6bVZb$k~!K za+@TFye26kt0fg=tAkBe9T_5NAy-JeS$B()B!GM)2_st^VkXCs;gTeBg(QQ_ljM=_ zBqe0?p=NRwIZDz%u9dWrrzO4{+%3MA1d%NcHIpOAVUjp9UXnr{lVp(*( z*L&yHJ48}LE|oNqCnTP!?pYs6{7BcRnH+MZV|!a(wSP|Ev2vXiPwIFmoIVx7NMCUvZ`#raM2i8ZQI zuI~8LmbG56IzF|o<(N$mcjYr{96A*x|B-e7aeYmH9KdhgU+3OW zBNpPDuMi8_LMDU|VzF2lLI^|OX@r?ZpOu76Stf)=V`vsa2xCbm3?byJePu!{7Hfp> z>wV7qd_EWZ876&2T?@52#!O}T05Nn`VwpKCUqfi6=b8lpp*9P%nB`Y4CCoA z%tGdnS;aB`f>4`7W&_I<$Qg)McQ zsay<4N5W2Kxe~EAVrU!gWUga5Dk3Qls=7{xw91%)fII{Fmnj~K#;k_?+pLwMW-V&- zu4a=GaS8I!KHbf1VYvcAec#P&XITWHRpoBxAWMBj;##OKmHAznhrT~fGn?M0dzxiR z#DggH1!DFz>HFh|5l=v9FYjr#uyjPEi}UnAzLKSk<*L+Y5Ngj9Go58qMCjY%lzGxA zINnieiaCcRB_gF#!p6Z6s(p&t$C4Y7%!esY*f<-qN#&7JDfCg0YSyvnF`sI7uv~^x zvG*MiFEN zWPdZIm0~K5xhxrGiK+0&*%cXPQMTRqc0j z%)#aW%fk@5Dmla~enQ1O4=F^cL(S|}sy**QXsc$KiSi<`QhW=c@qCz>%JLh8_WNOG zx|FaG1!_bcW)`sgJ0kO0rbASo3YHwmg{bQ=vxent$YoN7q;wlQPmhs3JeU0%r=&!h^&)REv80flw*#M zNIdp6%>V@vNo2VILZdFvOpy{cu7FT`PBe#EsP7~vneo_?bW|=x%nI~trkTfbE0@YQ z`&gPe=45k%sS&YbpATSjO$RPc8|z>mVF^>kmn4umE~Xvji|HC)l#aBV_6E#K913&?rd{} z)s;Mcu~c?!ZGKW znJk|}X#1RJ4oKdrUmo-fJE;R?Gbj8f#%yZ3Q6(jWe zXReurElF!Oz1o>;=CJ71&RnxhiE$C~&|aQvRs@9Zx6Cz%0`fg-zuc_Df71L+{n~{8 zJDwI^Pepqw%}x~)xth4q?BY^iA%@OYH=09I zDveDL8b3Fh<1DeWwM<9}8}Si|?^64HPskMX;zlz;%KDi7Aas}bCNo`%+NZR|ZZ@+5 zLSJgW#mo)J!H`)*KnT5_Ww?G~+OV+B)7a^3aG{YqtKQRQo@q>mPY~{}I#wkC?0vs6D~jJETNs{|L|&6OtujCStypF>Ne`5n0D_RYXRmR2jEGXk@-? z7Jf>3s*EPc_sFx(tdY`Sya?F@dEXrRjAFvZyO2L2ADN>8aj+iv*sT3r#e9hvTE%^0 zu4DNLvMpjhH5=DcOmwvT*KC#&HjF~mp8uL{QlfLz7iRqbs8n<$d|^&ViRSsjw7!&? zMFR4qqOLE@IF@}OQ>7#-kz1a={y%7@D~a4+U2kTy=zFm1&3u+)ktYkK)|AO9_jIASF`9RE+E?$@gaJca*0}tVGNekRQx+Db?a-2#x0- z%uJTIAv9KhFmqT2IA)`n$FiAYHkz}gbbH&Ljq6-w9yN=kyzV7K=x+0J7+dbGDS|I(*!$lY%>4 zhQVfT+3# zHYr&OQEg8BS;=D%Zu2inUV*6g)NUpT8y`Vb?fK&*)yARE8uIM9#cY;RWsD$ZLbkaz zASSM2el*FV z?NY+VaS`d0vc#ALNkCmOR?2TwYKc+I5^EJm2^;eu|3ZvuwMbbXQ_XoSt4&ID#b{Z* zQo3XGTxVNDQmVx=l%nlpTO%y5L8xE0HO}%S$2gWTLG7s)6CC4MaV&Z^cC7>!JsZ1L zvJyE*(H%2kr3EAfz3{Befb0YDtvrQ6VBHQwrD(PK5< z8eq|5KHeH)(PKW|8e!4nIo=v$(c?MZnqbjKQ@j=TJ8g|Mv3i8ZTkE7m|E`BpQo_cr zXfti+cx(6%Dit=;BQo))lEWiX5krS+*f<_SE4_GYkfi`}B(_GpHO^85$%SlV#l@;p zmq7BQlv_%!fXsqyYprHk2%&8_*&4T1Oie`69VNy4#TbPsHQ6e5mE4UOI-@06oh&OM z=OJc0D?_N5mmt*U?X4P?w;&fGW_zoNuSBbnB^g33 z+|g=gIRHYn?`XA3iO$bES?wyuI2JJ#$h?y^CZ${G+LNqtDH~!=Kuir{lB_tN+Ppqy zHslT|2~wh~og^z&iOftbOtP}2L^JPf(Kk@&nvpW!g*-c3v!z5c?`##RJdw5N&Q@7K zmdR4JO5}Qj&U(984N{_Y?P4`?%#Emvw$CnB3(FD+ZJ%8%`j!gK63ZYo=98@smZu>! zw}?gZ z(8__v*gjSX3$58`5AI{lR}$G5X;y`lCB|=P^ZO{3X3dGCenrP~npL}%>S^eFwN=xs z29|$8Xsf1K%~Ea@`#@;#>}###82Wqnr^vjomAf_NsT2nwhGu|$tr98KLa$r)wI*1O zLCl~mWyP!73m_Y$#Isxg`5rRWN@Q68*(4=}MXv^@S!pbKH8{=6WT{7~Ur{RE%4T^C zLU#_+t$ZnK%ry|2TlTXGIA%S>Ma+IyAG$7vvBtS4yRf*&UK)H3cLMa)ed4 zo!Vjz$V_>Twz9V;Sz)lw>rBnag>!Rp+R zGIz)9#W6Fi9+m?l(#N8oftg_qupEUL+FyCr7)w6Oi54C$keNwn?mfw(?{`pLBuAj9 zGp)pctgL{{g3PjV146S+fmINY*@!vSDhkNikkhP^fY24< z>DK&!oR659kTm#TGQI*vdkONWIjno++r26=rhQzRvC*v@7!wDu;{bHtyUw8zOJmb zx}=1S9WGR>om#7pWmgDo=i97dmZ=b0dERD?OQ|#t;!?L;%~MprXus2lse4u!=Es?QK@#KGf#0aSuvWBJvJC%hMg%hP`NEJzBWdN}NXRiMH@9D@}>eTddbgmlEA#y;dfd(p#+88e!3Ge%ESD z|7+$CtX3(}E7m@%onv&KK5KkGRZ8di*lOILq~7=dZEi%HKeMtklza|(5c0WY9QfC| z{%a*jiPrUnmGrlmFRU6V(S8kDbsVGHGiVh~|7&}`w1y7)Yh7PkHJPeC8_}M}(4Jwd zpT)k&G@gQdYmG{Yw&y!*TuOAme`lp0^4B~+So2wQo>8k#N_5oyXk{O&O3}!C9(Da} z)kul%(_gGcDbdE@AM$jgu2{Q>B?r^3RUEpOW`hpRU0z6(1innO0+#m_BtuitNtW=m`mvv zCfUiyP#!$VgW5ks?Yr2iEX|OwAiLV@Sg6!S$nJLGv43sPo_2$ju<;m5(MZ_aEyG=@TtR8F+a?HMnp{HLCvD@*c z3YE%+Bts6hJC#JB&FNa{W{Jb;~3qq<7|2hg|6t|L0!k9 zJ;&J%QZ{(Hr@8hz7TwcaJ9#FR+TiJ)=Gy5jx~I7|U02XuP~Fqx?J|zhJv~A9)czQ? z&qVD}`HE#mBxZ~yFCy+7RqDiuB(j_okqpRb$UHM5$3xDAoDz|9A(uc-iwHeAJP$Ja zFESr;MnvdYVk&jkUxey9Tg#;DkhuaeV8OJP)Yljz!m15viT-byJ(e5!u2mjEZ%M z>Q_{@j!3i2tlE4p+8nmqxGtS}k-eHlXI^BlW6_xx*@G-P^CEjxO1IFn%_4hTimK~D z)V0VKr^x*knYAkIcq!eUp0z6NWEP#L(xx{|Fk^dq)~dAASo9oKX{WR3IjYjmV9|3_ zrJc#5=cr0MTS;V&s??$SNsCQdCb#s_jyh zN9catWS2?V;OVh(lU>E4$Hq-|1B)ITH`y&LdTi9#?JRn1)Yx58RPE2A_M7cKj?w${ z7JGdUc zf8A=AvFN>XtKBF?op;uv)UEa$%%^lV*XN5`yGlw}gU%-6{yFrSoYj-Kls+7=m zEw;y`Y>3hG>SEhERrV`J&#SlF2`qYEt+P{D^t@VcXRzpb^$t6SMbE2CYd=y~-Xdp?VvSDWnGfY3SRKD&cO&#MpEy#b+lb(uY`Br>nI*h#1Tb&Ivw1yaJ| zY;3U)P-?kdEJbaxPo$KpQu42gG?P4RSFq^g;$gdvMenai>~<+C^C0p(Vs}YVnKwvT z$EEZUx56G|(V17+qbxe}qc*)ofc3Mu2yOlzc^q^QiBq@+uUj>E_7Y!+SDV|G4^ zuIn+oNJ>~#AoH)t^SE6qMP)YdRP*C@`QP%i+O>bn(`q-d=ox9H-NvG4iIsL2i|*G- zdss?XzMbcyu9fz<6jl2qDb{Q?e)Jjb2|Ha%x6m`&D!YV5_jHwA&Z2v|%C2S6Eo`%! zS#%5A>~<*|V)VJP&F)bWIafYu_e-fa7GsOi)8kLtgHo!+Ll7D*PuasPuR-Ws`IJ4z zvK~U`?x*bumMsvv;&|E?XHZY8#Wt6!n07m!B?Uq;?RJus=nDTCyIe}xI0!L2qdgsV zC(99#6v*>--FGykr+){Y}?sWspq7ykd8;ltYeythVV%GK#r_ zrOQsiUzKP^($^O~c2lv6X-3S6DAjAP!xbHsqGw>vfxKt0#yXYcNyJ=Gr;Wwjc@z`9M*GPwkfO#a-6h^+7fPu&icsn& zl-gw1u*_u{(`ypD3PK~{XDyTT`xjBs?_d0EH>tYBk$Ap^#@Nqx3rijH&=~vKZevNp zU-l{H7rTRHPYA{QVt27T!)v6?cCRjlcbq9^v)#{f7c$dxgX8uf%Ss5{bsV=xSk`ba zw%AEm(DtboA3$iVZn4u?zT}u+?LwB#9P_JP!VlNAse2{BHNl%?WUZ28G(VT_Z<@&M}ESxSKt<74cLR7k8-6p(2U)9DFF7Q}J- z0&+CObu!ARUrS}46Cs|H8<0~VzB4-@r$a){oPeASiF4)$8^3+2T zoiZt^r%jNZojNJ1)H2Awopvtu5lTG{+099~TIC@r!Tw5dGNhLAp1BSftY?snzJqtGYFaLj09r7hD>uN0x{I) z{Ty*kbT4m2%>GVBKz@c~IEmM)m~YTik^`NTfcy%X?xY7K7VjTrI;8;#K@M@+00{XwrLKUS;tU4l8pteXBp^3HPIbluQVluXv943wClh&YgUoi~0Rpx6Dvo+*OCzs_`$WD-}oq~Yu3c1Fq3dlZ?Yn@J( zCX|{EDR+7Tau{Tx(-)9qAU8P4*Q?rBq0~u`MNV2kPK8uDnE^Q$a-&nq@-j+Y3aN3* z12PYCvr`k0YazEfeNv)#n-@E2H&E@>;$7sSv(;iJLy4Tj>1?&wDGUhB&$m0p|B#Y^ z(5!yDGe00ys?Mnh2*uPnwE>~`H0zzlfY6(gOPm%dOAPvJ*CO=dPNze~i1lbQorxNq z)hrt!be3s!dRczwn7f@m79Z;uin-evR1!H`-Q$e^LyQWweRe>p+fe&Gj$oMvSt2EY za&HNr+JjFxg)Dl7w#unx(JQo7P7{k>p|v@^ zEP933<_xgt)!>s(+>NS*dNuf@lcXdv#-4Ig0z&P1%E{nTdbRwtlO-iA`q5_U`_oP? z$LRHQyOYl`Uvo^mQ^+y;3DRerVvZT-zCYuXs+dT7o^|F2gxd40Qxy=J0iJW}0zxyu z^G=f#_157x*zzwry;9ViFa}xe^atb*$ZO7MKtgy|_jM<`T5hpOd){<%148Y2(Nb8+q7Cj@acWPMljPyUJjz!N%|8v?|^lbB`)5)S|n=hR~ zmfcW$BWfRVhFK1Q+%F~WX4S7#Aj=_NISDM6Lmros$x;h>3bMhO&2lfKLrM_~U4y8J`fb4 zFw5uI^0eOg$w{nLEgXl?TH+@sRZ68X8Q0Aev&qSn61czNbV^w&S2FKo4{mb00@5#K zgk>7?P|TQS?1J>+MnypCe3jUDzejPD?uo!WqGf^2abrK~Ye zMJbZsocwxK>LLg|5AeHF7?9r(^M_Ls5Nj>2*4?UrOoGI?byC)tS0E3G>E_-+nemlf z$o3H1ZD>$(2P6j)=ce4LYCrEF!=NuGOm;H@QU=-1%?`-*kVH2>AT^MGxrI{JnD-+y zmD<@g?xxI@MjM1?(PTH7<#k9MVv^l-DN78JM#!#i8OMAIc?7b%+a#r0=vgbp?Pbxk zR*E~oqGzo=+_-yWzl5H(_HdI}^lY=Io5!MOn?2n^7Co~~acf!h%r?bsV$m~Os@uz= zXSP&#fQ4q8C(w(%+##0#p-PtVq%($Oh#G=oP`?)17`V70jTgIZ#u=~3eEI(qauEAD4z^!5V4MOMl z1Kb7{J%?wwJuG?-&v5%$^gMQ;JHn#pu>;)+7ClEzcdh%>_R(|Hbhm&-p9>Cht6228 z;2^hwMV|{Y-7Xe=F35EISoFEzVAr}|)uqn`2fGO@`dn~`o5P~d1&6o=EP9?l)U9IC z^ZcQ11B*UiWVu}|`h1b)_Oa-5!C|iTfNGCE7aZm$u;_XIa5t4j&+~`787z7ZKf*0$ z(R26_Zkd$m)p534t70N6#%#AaAoS&^Y`0%Z*syVD@g0nWBi*=WYGK&e8bT}TBi&S% z9U=6@?@?~aGK#4;_JH)E)X{E*l(3Njq3h*bH{n5*Cl~SsVshQ&fDA#7cWWO~F()JD zTgVKzmE~-f6J4u?V$_$w>D)BaO<~b*(avVGX%!^3tOG>VX z9D>?UcN1S$ax=?pw~Xac2=(F&H}4e{^9<)X)1A-qN<^Aj-i$~O3*BR;ex2!#v3wbk z{M9P+pAl(g`PWstlz5e5qHji@>E=qow+$~-+we>`Pl>0mM$dFhSoF2$nQpn1u-F@! zt+%K>%~GmG7KE+U#>XI9cL*-DH>yiuJIbRxmsKX zp^;hW#<47b(0)JLO<<{k&|W^YRty@_+(HWvN1#kp<| zi+&^HTz8OV<^}40!ntnB8fszmeUKuzK}xrw-_bbF?Fb0H!FRr!)kUS&#Ok*xi`^V4 z_!cF4L3_E_t&-AZ=y%_W-2oQ;?pv`t!lK`OD|RP1Pb>2H*gM5;-0Nz;>-RV=atm1W zdmIenUiL?DLt`(GYGlirL9y&+QWT5F?1?}IFKQvyQogIw?C1ccrPxxt;!qTfQQa64J_+g@R}PYS*y z&tq(nJIXQyp?$H)o&6To9yUm5UsSriQmVx-kZm!ds$9`aG5E_q{;ETAqnjh8JM!Lo zwOhcVzs*wZ7PII(RMl=7i=Gpz-6|=s3q2=PyEPo6zYKGe+sLB719OwRLW+9xcSp46 zCU-RpeVZj2QsauZWxvEUw0Tb{i7ZD&Bx9ZG`&p258PmdY5hN3Gi`yqfT}9FxvbVYu zO2mA`(EBpAuJxYUK9!IoP^#8VV_6J27IK@LAth|w4at+z$g&DD3$oZvd!O=j8~TjD z*v)6r>x9K_8H-*gEOr}N^r~R7+sUF=1&iH57QHH1>{=hFy7ad-7P}cz@C*amLo?E1 zx8-BCeU2@}lMk|m$)76uoO^M*yN+ceOP$;KnTo+DFlA5c-2s+KEO)pQEIYF-ap!-o zN~N(hxa+=9k_Dmm-05}_eGRjI4E)ZK0) z%Po*H#N6Yi4XK#>AmxxIH=E^gmiycSmKPwEh`HZgA!U8c8VH@6n%zDn-uDnXGd8=% zSCo0Zx6^zrX;Sd(5|G=Fr`gS7Ig@3Xo5OM$%Y$wKOF5(gr5`KvE!`ZVOBEpkW*cdC6@J$Wf4&-C-$9465rS$SZFA z*Q$km+`?DgWKxSTQP^tAYri|;F&zaY`<=mbyc)xIOaXKiDUGc=zVwf zx71TLR%vc|-|dl7ZM2{iz5V*W8~2^u8pe|>AGrA}G**8??R{<;%PWXc(#Y~=L^`E( zd$i>zWT}3ZK8X2ttnr~crX+^OVF>cEn=(SRcYB{BhPHFRo6YidL<*I}&^X){rTX1s zDb)ta&Qi)bhDI-a#kAjT)$hsO+y;pexiL|>6A~+i0&+jZ6z#Fmm{y1-(#@zm1F^+G zK-NGUQDRX{y|FV!CVd6h6?v9UA|O*ldqB29df>;&0M^admqvbX39$bOK0#E_Ke*T&Ms2+ItN z!y^!rCNOmIZ;g8&gw~>IBF?3KvEEw=p*297NR(1-{0yP%lzm02lqE*&b+{fxo_$4? zl%>XYkXevvq9Gs@lP;P$PcmZY*NFBP9RZ=QYVR-deX70MpqMjJ>Hsk(AQwO~M7xxw z#$Je_Z$VEN10gwnjQt_BFAfqpaZ2cyP$(u-@#&Wb6VtEKc?}X-v5zg}>gw_B#VoXZ(4tb7f+nQRq!FwGsk0W!A=w|k-Ei%s#DcevByJD_~ya&k> zB`owrVL#+V(JrN1=r!a?qDxAp(Ttcc5Ob19-xGmOmf{zGOaIl(9Gq@ijKc8KPr*Rcb2; zZRfK@;SNf6glvtNvqT-s9uUfWwrFPAAF?B2&Jo4(Lyk*~!y&W|FA~jC)|j+rqdez} z5h>j<^z}trEfb5@P{`=9Wvv z5SOZjOhL?LVua;x&U2ZVU}=F+PfH?m-4l>~QL02(J5hV8ja{&&rP}9;gn&@YbZ=*#XkzJRxk3ylseXL~p;`1wk+U<&`k1dF2O`gvB9A5Edc5%sDHHQqj)TyC zze-fG+yp6=H~EQo^cKg&36*mg{-CatVvXf2+PQrkgj z`z#i{EXP4;eqJobIM0=kBIH>t##tWVnA=6gE^>=`Z$c=~?V^h1*ND`x>|Lc}YL&#C z4Y?SZZx;O~WmdWuUe5zQR)KM1vFiD+Tj=0>%58bm9XIs$SnVj4snOBv(_ zDeWvPAk^jt(ZTXD(o(-Kdn3JCNrtkrA&nv>AT$#07THqP#Oiwv_lP+x`o6@yqEyOK`5S5vAkV#G zf`wKWDk>qfN|K;ynPN zvGJ5BMs?eaL4- zuaxNcc~-1bF_F8M&x)adtVWxk71o~75kZGWV`3Bnjnn+EJws{?7jmVOs zzB&9Uq)X&UiCzVCi2@ZP#~7{fyF`hUZe!2sc*+ZV`E}92@)qvf&>5{;v`C4rD!WC8 zl<5BI7OSOf@Seba{}Q!#iwTz3Sl$qsd&zO=eFFIwF+HM;{GR zS}XbkLdW}CVkjVVy!Q%x_!nb7x_90d87z8b^^PcD(d(A?gtd<pNTFOilN`E84zMBl~Us;5%OQr%tABU zu8=Q;n5JUrIxZD5C=vrQ4YFR8NQsW;FGYuxYU6I)$EMo95?ui~7^OCdqIAlPuhF7k zM?;21nUoE3eMl|*PE<)*A9D&~4#DyDy=YM4wL#|KSNwhuEnJFb5{mgj^y)l_nTb3b z#RQiM)!_aiSs|XC3@ukB8sJ`qw;3N{35EPbj2*VRXsECi)dk~W!Wscq^ys5 z0Mdw3<6>Pv?w68zfa=#Lh*<&IBC=T~*Q)m&wul^-yolto+zfd_mda;&4MM+Fv_%xK z`~jge{uVKt<*?iEq&KeCw}?WPDS&1qbwgnu9A|FA&;iW8Er2Q!yEs)?GeP3 zBW5ozNyao7zd{y6_VI?LMBgBu>W!*ALfo!?#bc^B&ay3}6;C5f^(^^8>~2G6p5|pp ziMDw^FH4C?LaDn^*M43OODbfUl>EQt+25=9Tb>NBhD&8|dosK_mczL{8D0}hF2@|` zwXo!K%z<7T%WRIB?sc%7$1&5rE-BG|9psHk2^*Ip<}tMSU{6f{>vqoa;*~^JAX#1_ zi(Y|bc_~t&nGf>{{+8zmuaHY!fx4bVT}ODuEai~rrIh|HPqx?mw>(FAE2PvL)hI=8 z(H`Y>a-Mr2uOZLTUYC@xco;&z1$MNzE|7;-GCAIaiZPx-49$nfcq0c<-@`^HA?Jg@jT6|)C~TA1gR<|>&Ep`M=T)k&!| zj)rVT%t>CelqFK^KHQV>#PL)ry0)3+#Y>5nd-X4OOR4;WzcA$>%sXR zK0!}g)zIsx1zv%aE`vthPN?fTuSQDP*oZu|<;%Smj?rUvp_h~|^T=x%TKnDLje8xVTlug+@<2tD0b?{x-*o&dbV z>kSBv@Fm`ul;{;ugO@Uk`X0R>ey5izrQX;MTYeU{*qvUNlqCl3i?bkidC8|!sd{4y zq!@CKSHzM5xfIgmB@|Lj^a`liOOk?bP+W{T95KyaD$C(0MY7DxV3`3ahdk(Ivz!)@ zJSp|YMUX`@rs-_eo+}~skQQ%9N_37|?u|%MztczOl;z$S3(e28eU^Jg=g6%QnUNm$ z28vWK^o+E^OFB>0RgJnHKwT@m0x26}=z954$Yb6dDbXwF$Gv72eFfd>b+XX25cG6J zt2ZE}T0Sp9-#={iMx@}YWr%4*=9S)fK%Rp<;boss?TN0R+q`@!>tmLng>=XDNv~1L zhL|?UD=77p*U2$2K)NAMd+`@gp7k-GLVBenvW!DMfV6wbER*lRIvnzhm&!5?vL5oR zm(FqmWEk?Cm&tMwWFw@*%Vw#B`~rF2%Vl{0@;l@OFQ26oVtt6aE8c9Den<$?=@qg3 z4A~a)l2^jA?GoIlg}m&|XPE{`hP>icu$&0l3$og)VJU&^4|&yVkfP2qheFnP%>kj& z(&e>EQSSyGg_zg9q+&H%^trOzOOaA7ZbD{SlXQD&EDewuDAgTVt1pAl-LN;jOc@hh znfG|vT~&tw-}1cYmHaKw2l!GX)uoQpGSvQo zSHVI@CEY3g(5w4fsgJzIfY2)LBd=46I?K?R`eUzGO7s`*KJofk^fR}gcmpi@N!?Gp zAr}1^W*1>gRGl@#aVg8(;H&M_nwV5V{BZ zsW+-b{2CGbWC^xU*a$V?t#E9gPrWjh9U%0#(a*d#mSmOzZ-Rw>pOLoD=U&fcD$f+e z+=7+ff4zPw(Z8gB;U$$&%=*Y*(!cPESoB}gzwlb5bVq*i>I*OBKUAt(WFRxGvA^)L zmB>*?e>?udD-H;)69&B!DbY7O2E9@i{bt9YH=jkn*)izVN>RU&L74}=4whXnR4c3X z-Z+=iZ-1=!;^tBdyAA#J$9gYCO7!iI|9NQ~qu>7c(#w$&Ht4rDYO&>qyaFkeQW_u| zyml_7-_aQM`dRcl8sB&$EczXdZ#?62)t|u(nhZ(AhaSH^*RGWtEL~lzJSpB=O=F@AoTvlCeJEW zy`UD-`xj$gQb1^h_Oq845PJXO7q2)V^!~+WuRI{M(i`_00zxaaEna6pXodEx*B20a zBjY!3I3Tpvn(*-RI&!~L3u%S+yO$UcTA}^nrAb*T?=n z%B$!_$S-C&97i0*#Q7yGGawWb=g()E%`ubw3YH5vW|CjaGM8hv@*7ynIc6)rnMHr8 zZ)<-AOA>#nZ)?AuB?fxjz z+0IX9aqm)n8{%V#f5PCaiXTO)_PzdGux8KK70HHkp_6J%1!!f(~ z!z>FqW*2{qW$Do|M(js;y3e0rxeYOsq=+)LPn#h0w$848Jj*i>YR|5I63aUf%CnoF z!ZO5pcJtF&euYq*clR?{67N!N-rdh(nGT_`n&RiN91Wqdn&Qu9$%oK0RD1YEEN4J= zMD2U{B`oJd=(yO^FJrkJLdV6Peg#W8gwCE*{2G=T2%Wp9_zf%#5Zb4yeiKVGg!XBw zzk+4K40YwQm*2*6BZS(#m)|L+QnaEJ^=ogxi{*I;#q8~`W9jCYef)lw4AlZ=p{9!58@(S?;$N~O%Ku(5a_~}q^S0sg_!AnofP#x8jYxf z{C*aCAB{#`rk`{T=hSq==&q+=`6pIB^9z#N(+nrl172Q znniy}qrmT#5*;n4`h7~|@6op-VwjoKG9#$JS+=2uC<-(gYLt5O;Q@+RbTzd0a% zkTd+YfP4-)%O8>wHfAEvH;{Auq?=V;vsupd=dfH1*@&1Te;vy_$S;ud{e;_9sYQ_3 zkMT^PpTa`Fq_Y*|Vn2;#F=7%Sm-t0>s?Vo<{-%n(r)dlr^zMsNEs|$*`)=y)h)dj^|>u0j))x`oon?x; z*gMzzbu4toFO<^6LT7V|xxsH?p|d%~+~Bvd(5he#q{8oDp;ZCBpIhN~vCv9}V#0ne z3$0`*ChYgK=oQf-e~?A5h!*)HEPCZo>5sAKl|!YEA3&thEA)z}$`>qpMO5V{u;>-h zjeZh~UJ>2sr?TkPMYW&KqE{EyeijR@E@;f(Vn4nO@6+T$P8KIS4mO#$L1oY z#vhPUZ+wqEcpcNC4SyLs?@HKHz7;?VwQth8vSx9VS~Qy^Z{b-@$;KxsYoyG^-GmRuD0&= z=Sv9-eYJJ3U&S$JApV?M4QUla9vIEKdj_EP#dhQ{iykY;~?g~sX>DZ?x@Rw-tgKgvR5m136p z6H4UPpjFC)e$jojeZo>`t3Kr8M=fa_%6&Q&rI!0~QkEK5qVESm9`?(n)En1Aj)FYm zSFzj(p}$kF@N1-W8T41G;}P?yUneCxKR@O-DiQT4MXS@t{AMXt;vopFP9O7I|5oa8 zf3=iu`D>N=$o#mU_&{_o)0(Z-&yo^0o3#A3MUpuPMpBb8SGnV>aUsXASba%rV_DC!$mxWOYQ& zfZPx1^5@9RON|R4%OS7(^QA;rU){14R=GBPQS5QVbo+HOW{G(Hbklem@`m5YEv!Hc zoiE<-n_2FGJTGHbuyjCPk5@sl1`dES9+guLsQN$HCD7V-;Zo!{50V*Z5u0eR2QT1kR83h%=gbU(pc z#{Sq7D&`U8Q6u%ZEOGfK}FhDI^gwANd_D)sR$3zd!VpidhMvFYJBlk4Om{ z-H;5#eCAKE^g|AZ4EPgItGd2}90U2>A8S_ z$OgZH`<8>g{*>n=eMxD0(lNH z;&-vom&s_Xe(zf^P^l%xmyj1RGJo*XST?h4^lMq12UN_cpZp?~syB9oyn@U>`qoP- z&t8!CA;0*AQo3TYApMZde!|PDg(pJ3hHUY3ST2T)LVop!rG$;EArp`Zzwk9GgCh|3jtwOC*qI39Gp$;jp z8@kO~g;ob*a*${1&^jsIhW=~mHlYy~{Y>&UA<<2BslVprq13h^{9pX*wjW1(WkZW& zooClj0*kIIC6pm0x;6F;Wl5XW0y?hU^u}l@iU9 z7Mdd^IzOlBeocy9hNBy$B4Td~St_MWmfGOym}#MMm02VrW*K6pg=(aPja0}ANP4JO zm5R}M_6x0eliD0@Plm4D*3Z&JML&TvJ=7K`^&~PM6zY|-Ax4+V4CSmO#Fi?=A=+R3w;NX zVonOBy{+~Ieea#_W6um_u+aD3=|1+%P&P|CN_~zN=7(}w4u^axr9euh$m5ukLxn8o zbIi%1Ib3Q!auxb@MJR=1 zzJ**bC0&X-U(oouGBomu8XK_>PP6=M!Xi--;G@`EI7cIC=c)Neo|_{vl!w+5w?>5Wv?I^ri0C{^ z{*k945<_`jMX99`p*-(G?urQI`4ndiTZ_`xbIxTV9@FX&XKg zDw0xZl;CZPLlCnf)W$+@f8;(8vrSgqaXRh&9U6LMTl_$b=9=EM!7U zvwSv$&}gK!Erbx-d|&VDdSBFvmgr~ulo~O@*t&< zH~h&g`4Ady_@+OVr4VvEG9CU5mSV`AkhlEVETxcpA=GQy(P!yf;bknnogG<= zL5B8PAN%WBZidia>tlbDEag*Q2>Qg|!lJ$q^of5B%e^Q?d(l3BKg;6~+5`0Yhgj%~ zMKsFdQ~xLneX)o}S$yiBV0i_l=nCFver;GT_ihN?Rs75!VEF>_Bc|(fzr(T#GA<;M zMLluQ?@wacj12Xs-=D>z&Zxie&t*|()L;1XSc1>WGomm3`7FCZ=#1z~e-X=}5IW!Z z%3s2A41~@%zVcVHoWhv_e>KawoEh*pu;g=Qt-p!odd{r%x3b*EnXmorEDv(#YkwC@ zD}>gKZ~Ox+??C8R+c*AEA&az+IWy?bSTEO#{QI22}y<|1(GMFJO;^x92kh- zBIQL$9waqT#PS}5-tBWlpqgbhv7AytqvJ5^^i#m_RSfCP)S3*uX@T%=`|y zACehJn<8cE^Ha2EAg2VJ7%6nMum_S8Xk$_19L^1Nuq2|?N64HP$lF$ynhE&=azUVA zs+8j(>me5f(tJ|RhWrM(B+$xo8B2a(daTS8L$q)3Ycvoaka8EqgcJsvf>NG=>;}0$ zFv+rlGdBe$44L^DvOhAn1V$_=!;mz{ZGmc6$~fdCNJU_LM=3kKfPEC?u0Z=vQVxP# z0l7Djx{H)KkV?psK=iI8725fbTF3(dCsAhTJE2cO9tmi>OSuY}S0PISMJ%O|w;)Y{ zAr|vsyg(Q7OkiveS*iw^?;tM(QumbdBxC~eQXpSQjrI~GY7pnxfdZDVA=^P-4HUBY zU&OT($ZLUOmQ+>4s0LEa7|CdpDuA%{R#1futm@)G1k$f`gQOBdvP$m+oK zeP!kg$kmX(Kt0P3kQ*VN1(NrZnW?QLuOmOFGBu;`1ApmX4DhC4tG!Vu|s6d zZ$aWAhF&>S$|}hIkT^X$H7v(M67-bAq|nm@XFzt-jl-pEM5)UlNqXWDQlehM{s*$Z zo^+%X3qrsCX6ThH`$6tU<`8}2D497D(hNCVPoE`a-sKoC0ZG?q93zF+`Bjh%y@=&B zl==j6ygtElA1@pOvb!lJ(Mbc)`=qQ3ET zs@}_@zVURbKER^B%9pK=vZ$|XW$TkH>g!tBdLTpgP>r2CO;2D^W9LrOlUdXk!RF{` zEb5D3bM!10^|i0l^;{P9wXf6l0v7evu(^5(i~4HVT)m2g&h+TZs%Pj8Eb0qoXXq^~ zt(dE~V6L92cd)3heVwWIvZ$|pouv=3sIPsUrH`_xuYKj{lPv0MUpacwXWy^7_y zi>7FU@8GDXH?XL$Vx6bAu&A$Mov(MWsIOw3ulKU3uVP)G53rnY9>!F3;^?W5vgAST zfaK|uEb6ORd3xY@Ie*rnKT~m5aG{>SqP~iCp`Og5zKV5`p2niSigl5m#iG87b+Mky zqP~iCv0lKUzAQFRFJW1Y9@6i@d3qI#`f}DKdIO94a@Hk!3(F8n(QnWBdIyX8`q+HE zmqmSD>r#DyMSWfCQhij&B8`qRUt$w%O6+ZZLCx3dV=SeRKOxuYNtx82I_*J7)VH{9 ztaq@qLbiikulr7vnGYd0>>>-V}p((vpFOcG+ zku!U|xs6t;PbxvpQnF`@Qob5U7V0V0^M!=(0+;IbLc(`=OZ7$}72X}*QoTir_j{*I z?~$dvJG^Cj{wdT}h4v!aI_hdZt|OpDUY}PYug}jx4=Xq$ug~W|7JEY1 zvFAbV)JJ7oUVrY=$0LO9SKg%?r&52y_baRPd=_=5_#VAe2w(qs7iX3Fq!g_aQ$g2T zs`WrN)f4{CTD6|eqMp;N){9uwbDGt9GmHAhO0_<~qMrAx){WC-&FWdsYCVHRJfK#ovb4Gmur$+B#p=WsMsz{CA&!WDGQ=^Ya z(bQ9rHTr~*@N=3q`t&(872)SJYxHau^_*snULr)!XZi(QqbHnBr7FDne4m~yq+6rs z69_n@8?A@m&LLwX^LdUo<*y_!WmU-_`!8c~X#XM9-ii;yx%gFX=<^z7s#dcqmu z{?L<>kLu|WLRY9B(;Fg$o>gqrJ0paif_z*biV!*$EY*EyhHIwh5TDSKBZQvQY|^tM zgr3TLQZI@SdNT1Ty*@(d`O2sD4i@!gsAheTMLjqAj2?ZKY+XJ5`m8>kWfsn0=_{ z+j=w0I>C>AdBpLFVZd^c_ z8Z95C(ji~yc`P?TPKJD`2l8ZwzRGweWUZbfq)uyvTmbn-96_)T*LxteulrVS6dAb$ zFGuEEy)QzpfqbWr36bxkE`bc`2^UgZ-BIf8rr+!7EcCve+mQKQFJPg!n^r=G^(9ig z_W+OR?JVkzKqLA9m!h}pP(34h%0;p*dfO_!nRA1lDK(|x=}AIrv~^fs)tDQ<>A5UFLvF{tzu)x+ zA;Yn1nf{@-3#stYb2oI) zZo}_o^yg2#@Dl2?lt&7^_NGEI=b^(L0xAvA(?Qg3HD5b``SoAn+cHQLdTHpmt| ze?HY*E4~lX3He7axm31wIx_D=wBX!)DRj?w4P=|(sE`_s-fj2=BqliHGRo9w7opS; zBsQ2?AWK~jp;CIVNl1;h2=X(;2&P>rGxd zEYCushH&j7n0&R&v_o{rj=>3*ZpaRhU4qetlnI}UCI)>s{9DF_RERG%(EF?sgIPCH zrcC=3^}N-ACvAiA#Ztau*)5pDvKg`)+S)x>bd$_XeN~p49_+eViU~=hhi*&A{IGJ6M&63T@8yl*gDNS$^tGKV0uZ!nJ~9dZ;TIoK?uR+|es0kU7vSSaez zE{2>AIUtzJay?5*u$kp{NG>u5274pqV#q zQaE#Bu#@E&2(9y{22;yrJ+mQ?qEvRUIznE6oDm$jU1lysrWV z>sgLpERWqc1dY2yCYIiHwjW9r2Mbu}jlMI5bg|Ieda3oBg7H#|ARj~Of+=-US|Q&+>VwTJZ$d^P4+T>mkeStx2}nb*p5tZxP~PWnG8sC zF!~{?2X_Y`vmws}(^-y!Tn2d|Sn{yU-B5 zK4H3=@n*0=NR3vFOoPa@N%5X#=m>TRsn8xn=1F8af{Bk(%@x`+kXImYsr^sPE0A{~ z%RT9Wd<1#hlW!qwA)TI3%^M)^Y$d-#-t~mqie8U1{H?@>bOlR9f5Pt#TM;Z5QltHi zQqz!G5$qJwt*QR33?@HDQ_-!dK7SBw7E-2#-oTL&rB(%d9+w%_=l=zhm&&=i4>E@% zvpU!+q+84%nu?Et)1Q!;*~lD=%*VkcLS%-ft1pO;jftgv88TVOd>YIX(k8ZOEJn=?`W-Df>fngQoqt$l(yc8+%?lvk1luDriy`ZReVkc|%sr5AgGov+c|shvY6Zbt)^ZH;Tiwk*CNDE6M zgvMr!1lw5lh0xfHkzl73?@V|@u!l2;B10p=HU!rQDf1lzp^;!4f&-j61@b!D+87+- z%sG%QA!9P*)x0Sf-7J=ccqcqPo3kmH!a~n_&{)|Yg1Id8<;Q1n?l%@J6e6D>UW1x{ z4wgj7mylnBW6x5}b=rKiz8>;>aC(cB>mk2F{s^W5twO?Y2HqTOXQ69xbS&5$?35zrPb%u! z9PAe&pPi&@x&H(Qg@m`$e}cI$Qh&nRsTLX&Ql@pG^`lWwR4Dx=nNizmOvv}L6t!>J zHq;d%v<*%T&3#2?)V{?R%4`b@ZC|mW>{m(3v_7s8o5NZ}u z=i7i%=b}^~)G9MRtz(LIp^$dYY!AtY=%G%|><+nBNDpTY;7l;IhBL=-CK&4H%o&^s zg$6luDQ7~V5zgGi86z~tnZ=wjLKB?1AF>dwn<4Ern)Vvs3y=ySJ|T6!_c>#Q49*O2 z#tOxA=4Z~>p+wI3-jem$p(M`i3ZZFtLMfa%975CXgi>WjI|D*<%ngk%qyE%smqMx` zaiQdPDc3;gO3wD7QkDgfhmqMKWV|k>!aJhv5K0hIr`?6jlOmJNQqQtesF>M z%gc}#P-@puAIn>icF45QkdRuf3-UH(w~+QGwO*?YLq3A+8A|C8{n7O0Q?&0P`-bMS z9KwXPF1dB0Hl@~x+0ztGUzBz4+FC^d?D_6wzUO1TyCE98LC(7RF^ATb;8yD60a z9!YqMJ1kTvB)r8P7Fxrij*N$g(z>Wrx2CqQBSOtAYWqqH4MhlTUq^-#SIAOo`#LI= z8zHoP9UZC{65g89LybbhTT^x zAF^bGiXvoRWR4HDuzZ9}IwUiM$=vF0&PgotZqD(@WO+hQC7cR5#S^-la~@>Qf9g5i z%h1yev_Cw<6RPJDlnM*gb2a3w&?NWpYxM9&NKR<9M^5QR$U?|Dp~RI^Xbkyp-MDug z%3%q-jV%tD^Fu8xJ45Kr19_nymc3Xm3=Of&fZT&p7ll$kpqgv7lOR;{C82yF;iWS_ zR3xNMJ0F=3Q1kpyA4@*u0n~G8C~1}K;mw@M50$bkf;@)IWua=88pxB7%R|wy32WesF@|Y6K~Q$JvW5nK9;4vgiJv02@SDqfJAM?ovcvqCo(e$iG|dLhFF5{;LHJ17s~jQGBw&B zkZF+mP`?oQ{sg+8`%q{oLiR=G;gIv0tobOEIvDauC^Aq@^K;o& zKI8;so(y#fsnc$QoCbL+l-)0Du7~78nnRUBYP6-0D^RhTJT-@oOpYvh-DwhE6BVa zDq%SR@&@FMP&v!R5IVDZGgKv{!gni#-kIMKTEbEVp*w3Gp++g*dFET8wg{ojTcI8) z+Jh)XcMO+@0&A&<_&yPY?$o>;%3@L1Qr->a2`SSWxvh6Y4MM{AyWb17a4Fi`yo;%L zFVw;E97^>-R)o5Qg!d9FLVYshd&|oVu)GhUDP0j7V)@LIQ7K|dsn07y(O=V4g!|JI zN)%G3twX5~(RxoPBSJodtO^xG$RK2Os3Af&LHa^#gy8x->iGlmWoU#mhnP8?rkx>q7}Fc`PHL=`2@6l91UDN@uy5Wm9OL5P5{%ADJIQ4N|nc1Ea*1 zw;w~jLgbrx=~~=Rq4IBK>x)p&;V3m0s$#hlaxCQM&=QvWA+#6$CDg$3BFnF#CYCo@ z#zQSED_MREwXv*&(BAL&PzOtElcr^%tv^CtER(zsp9uA`Y~*_W4E3>`c8uK5{}mcw z`GqrohlW@-vrL9YS*CW$sn{GEXR#r3(fXE9@pp1=kem;RGM2C;L4p{mGR5d&IT~^a zGBL&k%N$4nWUApCqI&p>8P@q&BSDJqB4lVQh&7U>XxBlmMX6XLlcj`ZJ7aEy+=PtZ z$d8axNWdr+QY+pju^6Ho9YQL66{zQKNYLnFp{KNJh4iw}`^O#=(kDf1gHH+>|DL9z zOshpb^frl*kugkyYwy&<_wn1oC}vs3Vj0aWU$EH50LwUp&TSkceZ8z_#}#;12yMj~ zT`aR8uRwM%v=Nc<&W(38&@}$K^*PAUmD2xDXy0=AJCT|5P>M#ygiERKDu(4MWIE7# zSZ@7yTQT=S-i^$}G(vi|k`~Bn$WE%yG4DV=gCrO!8@8UVosCQ(a?4$d%+5xRkl|Q0 zrMnopQljV@^$0S%7zIMY*Qj?fN`&B78`}CsWXgre_gT?3qFszCSx@Yz$k068#i(W( z@??pWs4b8QQBR|g@P0ngXb}=VpHDQ}xE|H#M5CSSQGHG{x`c%LoM`k$)I(z!5{-d> z)icc)WKqjvnlZ$pme(|6ltnG~X~r0fTFTRm2^O^`Ofx2>M5$#u&2To-(ve>fptWV1 zk-*}1%k^iPFa-ci><-!6=w&&9WnUw8 zlxnWi&Vi&Lv!78ZL@v`b$N@&Z6yMdzoB&BN8d+|FP$tD_;d&N9PJbhxo0bx>17gr5bKXvHyT7{K#E37rwww15&a`&$~2nxH-sdQ zNulYY{v2tvvSgsB4z)Z94EXb@82D?&ZAbdEQgSkyXyywM^{iRrR&2kLmELr9%A{ZvhxKwFtckC5XAJS;nLgxqT&|&u1Bd37Rh4so`}s$0%Y^t)Fcq{YjZ} zAHDB=ca%EENRgtg;I_^&@>o8B(A~Flj5e0_kiAjrT%%V=xb6(dB^NhJt zwBLBT<{9%?VtV9UooAG@s41Oi^t0H=9Eo}^F|xOanl&};^NoBVa=NI8ml{Pv!qc8_ z1pe82DlRkPg@mX5a-)SsP5Tu_w6-ng*l?`cvlSRVDN$%_n=VEVLo`IUrLF-|e4VkxIvUxyxB+kTA7-dm4FEj#EsE6I&w|;Ihl36a|X}`rt zW4Rh~Gupbv$QBar&n-rd5ZRwnk;&&$>TKs$qnJh2e5+B(qH4ZX%^y8n3f-d~>fusK z!lfESJ>mX@>rrQwVNqw5p2VoL%3F;lswb+#`%P4a;b$cBe3ix$ml>ThqtVEa#hB9D zj2Y3Csq-CuGmgTLMMk<1yyY7ix++p`E*|hh@-{LYA17s^&_TcuyKx4)Ua(CDW5NEEjt+!cyXi zHdXey#*=uKmpw^gS>;J4%aA8|EZcmb`drL1&68@D!#!zc$?>F<mlV_D{j z&nKtiBTo`pHh7ZC61z(EFqF}h7KWltJeKJuiUWz3T`EP)SI4@X#1Jkhq3 zeV*+}JWGKmDJ-R)WU|zIlE<>llVTxw(;8$sw&i<`QkEe|myk-9pCEL8c&||}MQq)x zMW&rIGzNGrq{irE`5UEf!dZ8X(Zdq^KY1LiG1jo`>PbIK3gkOc&!7;wU)>Jg(~h&(p! z2zk_)5VA-+5jF1xdE96>s1&}Z067fugi&Bh$%Ujtnhe7xk@aLjo-$ITXxAWf3FH~0 zcxTGgXr+)_ATJoxcac&Dp=-G>86_;wLGD22Wn)x`thp9*^%bKbkxI$$@ZN_^o6#X; zIBEq-JqUT#7-#te@+9OnqhOloq4q7LRYjDiDx+uLZiIiFcMi#^(0A(SjX0&KW`ZM z5%M|YEu%q-b}mZYh!N568bi~mKNx)tp=;Fd8F_oiskjM3$I~vOU{5LcQK>g@#olPx zOO*0{f4y(C2?>uCdEe+@c?zXQ(E9sEmlV;%UxW;D<`rbNKvo(fEbl;~e)Y z$YY6JgEyr^J~Fz5;4RjWt08?x$$qk)!yvaoJ~L+QFY7rCau?)tql+aM@-E~XqdG-q z3Lzgt291V;rIbUygA5tYAyOWKY=nGoq(w-~7)Bo%y)3QBOo#kxq|cP4-h~_l`OO$& z`37<}WQ$RfDlKj)L3|+0IN8 zB9}!2#Ba7s@tupzYmkuH$#NB>Lr4!xnI~&l?uWcDGW|m27^)A26dpmX4@Z^Hme*2j zvs6fh_7qC3L&i3jq)|rphklW5Z}tcY|905k9FZBH+S6`tj3iGleD2lT;RU zKEJ)0&aw|Ohl+YKg)H)=LehoI<;?MrlOgeDu8=Zc4&+QB`BKDodJ$v?b4-Yw^G`u` zH=~cDX_xXYB*~l*BIonBkOR!Lqr-E49CEOk6CvCFg6nMNya=%&hns2Xa;|1(ESIB)wAVVy%w~BGd(mkqb+nnoGVesWUp?B)W4RWk_7a(Vmc@_*g%q(gKxp5a zZkDh-523wZx>?Dx9Fm4ov&?FiPaw3N&N3TVMj&*@=NPkzWy&Y=cgitlE6XmBV^Ghr zW;;tNgi0N2cCut~sbkGvmORL8l*%ysSmqoZrR}kdWPoKpWM3g8EH`keGR=IJseMzlQXz#bdqD0KQp}PDp|h_{vy|mz z2ra=(vyvsplWHkqonIm{LsGOWk!goynNa0wnfPH=+D_^(ea`` zBC|i_e6vqToz{O!l$HURXBM0!r*srG|AVuyOU)7?6+Sw?pN>qvS(Sl0yFXCt>JsTUFlk2Cb6h1T?@<%7Imeo#LN*=rag;3{}26HXqE_( zJ^UPUi>aL<+fw~0HGM3qKc%L@qWV*6#tV`4(B8PzoE{7@zO5HoY-Sn}jJH-{IAtbz%7n>-8zwVg-VGr;Y&bq@w`-Ep8m1cq{C0k#I`Fy9D zETlV1W$rS&SX4cCo0CGiqIxgEnK??`V|L|G55x7`XZ8sh_UfrM3(l5Pq3XHcY!OnX zQ9Xa5o;ow_9Lm&aZ(vP`9>@4Gvsy@n?+Xa+qaHNtSwqU{PnVjplTgN0CWH&5dRX zi#pqR+)QOrXFHFZ87#Cvq_&otSu8JdTT9IxmN&USPndZut2y(8S-|ogWHEk4Hkm~% zn<0ClKTT#S%l4n+DO$*rW+h89Bvr@~7Ig;ll-a} zoPNF#aV(&7{uj(vA!S+(xAlVA#qt#70@VDX*(an{dml0%(rQLuK=nwu1M-SFD5OUF z8kvV7ubM>{QKm+lggggXX7;fJ`|)0V$m?dx#WFJu@*(66vr0&vwlCxh$eU(kg!}|~ z$DF)OmO25M&~NxHY&w@q$%e#1J}`4wE`{t0S!EVpAv4!Q_JQ=8O)PXIIt22e*;61h zcOf$y@{ws=Ddic+m5?vYF(GyMk`;$2^+uxew5pp})8ZvteWn24lX1(dVM#>QoYHNd; z%aX;i(adL=&$7uZVp+&CYE}!u(^ZfvwDp6jT`OyT0rC;{t3R6YLgfCi9+@#SIYOR> z{A{L4(RxtoHOMb!wya0ot>_ezBSrfJnNK0Vnt2hj2{LY$M#v=OH?uNAtlu$q&TMA+ z9QEu9`NNF9j{02V%RVMbT-E=}Op~Jhf(*@{zsy{ge^~xDdswV5aVCswxxX~w-nnd z5K^P<1{p-gwNe+z%s~)Zd*iH<2w9Izyfs!rnOZHA>q)TYE|hWs6^6Hc0#MeXUXr5&Ec;strBqLyw(Wq- z9AM33iDOBzx>#mHXxb07(#p1O{U9qtNcarxAZwnGI^PK>MO(o^Rs+i!o;0)MdD6~u zr6)Z?B5NKJ5*|}}kToi#*1H>ckd=5F^|02b?gk!YC9$Zxfd^SBEH|MoTI&wBGFk5P zBu_|%H}>FQD_=;N?}=P_W_7St#F-aSY9}n68CD5rIv~@8RLYDv<|aW7u^JY)+QsaCEKJe>!j%wbkWIc3W5&UhuALh7^$$e|+B$KqQn z3My5nr6WT}t65gBkQ(g-NIKd& z#_E&eUHv}R8W0j*UdLKvQoMV|$6DHAs(F#PcYGY`Io3*Gq5Hxl8CFt+WI>Lz(jw$^ z$nn-(A>n(+Cs@@oSa-DOQzMwqSls7Yk*}orj*u}6RmNUYdr~6 ziuvQa+mq=mOFc7{U_PH{%@8siwO{%aEl)@>3ynRv404jSMo6t@e}i{EK(eesA>qB& zY-?Odc%k(I-;781RTWS$hU-=H2|Y!ybxu8?_FNrcc{#ralMgtTDV zFS8QwrncmLVOm?RvgQd1k5#+cTEaq47}5MGwAxtI=(R$tLr8@-f*!t#nhUMOd*oF7 z2$7|dSpN1Tg(a{~F6BZim1WP9Ra-4AYK=ncQnbtORi*l+h`I5mXg%d#Y8|6qQS*C{ zBCAJ8nNMA-EVkCLT!$+aG*^qQ0U>hBCArBOiI5Lb&&}3kgnSJtv2v=ZtupN(wDmjW zRx6=K&Q-N_ms&}+GBXF6sS~&wX8D##xdLKA%B*}LHQGW*0%VcZ$WjB@9a3(^-!Dr& z3z-2~Y$ex8d7Y)wYGL^tLT%k)H9tU^;V8A=xYL^Zh%7aX44t9fWfcjj(Y8R2K&iW| zHA04?)V`(4G9H!nsC~=bR<@K_wQsq{s^pB?liXtsaz^cK?zIvh6ZOQZecioQE{odN zRa^B!$~5a+d@BL{sj(VmCMpp^-S3MuiuC1>2d#jR;V4z=L919ug_e$b3Xyrp3M`fLN452kl`f=4I}4c` zka^ge%Q7EwE2P2dlH#3{JYtP<=0;>Hka@(?o}ilLl+xDyh?OHm_K-45g{rqEU{^+!&)QAk4#$UI7@=dCglD|*?x2!nmnO5a{Pc&PkFKe@)9!7c(R)1IZs+3 zYf;o%RNO+4|W#tPAuRp7-A|YkI;CJ}0 z5PsFJvPxt>GB4H-JVud=FG(mYwhk_n+Jz^klAA+mKk>h)T!5klL=hgL^~ z&{1!-)$p{K3U3L1Z1uCKCHRTuG|P-y7JXJFi&}zxR<)1{-(2*Eww*q!SqR>M0qMeW z@3Yz>WHsb-EATAUT%#>OW&ko^rL~aMX-gnKK-O8&&x_W*<^G*jE~HFrL5B8q!&U=l z)S9r~(q53I)S9rtYG6@o!X_)>MVV1+!jINCi&_)Ltm>C2Q=@gGt-sKpU##YrrL2QQ z{fTQ|R@W=C9<{doVKuf%QESUzR`#n>)Y>v>^$97{enCA3>e+1hUXwLX8N#noh-N3U z1X;GR^H`=q_CO}uj$THkaD;^%1et2*3c;Jw@#Px2o)Bwyab^}Wha=;+Cs?u}CqROB zTDz?063ASLY4@>Q1DOYL?2I>LW)b8nNSxgz1YcdjmFS0+yZHb>}3zK)UhPl6D%)q&3oJNoz#}xPTxkUz3rq3c^|T$of;t@Lk_a5r1&~e z4{cwm_7WjwzAgxD@2PepXXq_PlsU|9W>Hr>4zt@>dbys%?GBc&xt_!A9v1cc;s|>U zi~4e&!~^Ihgj74 z^HH|*u2_QJIlxi&kdQjf7?$hLQFioul&Qn}?W7!S&tOSrNw*7ygqP_oyHZH4_7%q4 ztVe%l*?lbOC`DJyjlrEngrET*UWlC7CLw{l+r`e+{w?k~m z8Fpc}EcF0nXUN(15|*bRdqK{#+gV4nUE{(9+tBp7eET_q?J@pt#&cwGRU=dr;r-$T1X+}Iy>_N*%rMm;YLW2ox^f3 zGPgjkw})7sVkx%MSIJTxkj2O>u(O4Pua7OX=SlIdk1e!|q=@Td_oCE7yPAcrkCEJB zH$+GsiLLPyX+C4(T*T>52=w9ki_&ML(>;Q}Uiv4YNJj*BOGwl-=*@-Lz5ZZ4n zvXg~`$DNkjGi1iQ@>XuA38~e-N2wseHPD(of} zdW!!=)U()b5fW~FvE3#!Uh9kP9w}Ni&Zud$^I|*kLow|_Xeui03?XIO@91GWYQDps z%bC~_ymb?Dr#+9whI|aU%PwKr4e|}7%C2HL0J0HskDarI+A7m#LH>YL+l4~HXL|S9 z#s86dDdOwKG^O|1jV$lok8cP6P0}1uil*W|yC*_iWNPh^2uXz8Z~HzH(=O)EzK{p( zqzFlcJZNV|$cc~!J3m5lA&=RW5pp$TsofkQm5`_Go(Q2a($Co=5%MfD&)dF_!~J;! z(rPC~$O_0Sc4mZp23cnJOYyFlEw=|*&c=MEIkwy$VYwJWBLtS)V=Om7=-ha@J;Cw- zWD9CuZfl=Vf4ZZVLZ(g%=@UKlwLpT9PTR-wE@THGhLG;4k0JD?h)z3^MX$lR7BcVJ zC9;&5^U07EcHmQ4^Ds)C0O_$EmI+T1SYkI|?Zv%-9(y{=G{|Y9R0<0{AxqooN;{S1 zFl5e0W~H4jMYK+9%St;tLh_OM!0r+vpDeo((rfodWa!-HLwit)?|9UF3o;+tBP??u zl|shU_2)CYT9y)hUX4fXecb~1~)H}RF7!BT=LrMneh*|{tadQ!ylh9^}lUwP8R60=d&)4{U4Cw(j@ zc{0j!jVIAx(Ny4$Glb5FzVgmV&ORtg8$=HWY)53|{*bOqthEy(WEk^j(5{l=dlL1G zL5A!lLdtwELVg$0$e9GpXW9zBx0^Y$C(rrs?KaM+E7HSu2WQk3>0!HvGq0m&s%O2u zhBMs|+IH64146>boe_ITNS$vrj!m&0c>k(BDkOYvGh)vhpt&&|rKWwvt`btC4dcp* zjZz!zULoP5!$!OBU!^wM?Q7*+{S&2Vu5Pj?Sc0=~g%kCR+6iA%rcBg49rB}{BP3k& zPj;S=aDRTXD}~@Z3ia%ZQe$=(%ZV&M+uAo&bGV*gY@d*DJ-^r~LTa>fF7>Nj!14^s zxZV7(dVaH8|5eX#c0ZT;m`nX`JA+%d{)e3)B;5KRcE-Ol6L!|WG81-@kQ!|QHPf8` z({B4$slV(Fnel!*{AEvHCtCN8JAc{9Eb30pUv?@>+N>yT^CaFPYp1hhLZ)mc$zoCK z>ZCoFMXjrob{>mbS2x@FsubTn*=!fFr0_bw#V%n<<8^+EUCENknSbnRmNPl?kKG_e z?6qh=uQ^RZ>a=;3L7(x`qHk&1@$No|35jy>FaEmqPq1C=0GZ;6I*SX-Cf=ID@&JA} zo!uT$DrPe>^k$(cPQ7R=ypBzA8Y5(P(bgIvav#1AB-$C28Q;`Ra?6czMp)t?wB^P) z<1CNy+}PHcWO;$-#loV&uL@X^H5E^A>Zd{L)4#c@rEn5vn{zuM%9I;hf^Zz5)|3}IpboLdl`SJgV zTIa)=H<8(TD&GH(^#4b`|BtAxAYAj0$jsVmDz+WPb3j|kbjX=o$&=X6=WQkQj-dIG z5<^#?u2~*2r7@4=s@e+t2Jt(satZooqGp;d-Dzhz7DCHZce+?gF`kVwL8q7HRL%sQ zewK5&o{%%has_8X&M3#kEI#j82aDdCLTF5;YWmg+0yoR4#=S!he4>Du0@XQ6#KEuHP1CKj~>6PO3a7U+)GwROlj?Ms!y4Sy>Gr}^+_l|dR##lyp{_NyTvZ&S* zoakY>lvV2qjv+)IJu9#*c6MgSjMtxCoHQZfGnrkSLaygmv_yEq*} zhGW&1va8c2q|EmQww+qEwX3s+Giq5RI{jRaS{8}U5Q|zC)0|NjwJfGN6I_qlkL~7Y z>*bWH^X^U}3+?MDGu=sLIfOIQoeUP**HLBCIjs2Vn&Zs^1{*E>xm)CNxXMZOkWH?ss!w+yA&aC3h0Zt-IALJpdQ7KLr z%NS&-kX{zrhd&27(CK3d{D?6XLIzprSkMVM$QfbT6`2o&jI+#yP+JE(^&4cL=Rl~f zgPlf}DW?-hcS6Po#|*lkc9UwGo9%|YP3vb{z0i!r+_6FvfUQkcW~AS37`8N?(}o! zMr3Sc4tJa%spcB(LCB7fBb)@5Hz9jL(wtP5wUGTGM>?4-TOfx(j&ibDcKsP6v>``3 zIV`6_PKKmARV=qcav`&v29_5g7ekJ5npnPp6he-5T3B}a1#hl^WH@asXF+a*9OsO% z)Iw?@$2$`&t050TPH?oJ=(ehYsbc&-yTiVT#!;mR< z*05ASj)L6eWNjleOCZNV7C5aek3zB_B~CxfOOOxH`a&l#MV9J<(BAJBCxK-MLVM9$ zon$HAl$JWBLc;IMEp;k|$k9-9&{nBaEo3-K{gx?pmi()p+nh!ra*pMo)NM|m6tQm5 zul{mpfQ5b+%txl&84@xat9~z+JHBX|3R%xJB9j&&3n3LwrxdY9-?EPL=&$?DRld>Lft*dmRW5WHRs}Plr5g~LH;tnT4$Z)Kx z=T0YGNR39L&hA26cRIyFQzNZYoeb#K&Jl{3zwMx9kT zfvIA-d&{&+O;-$!qprgB)hZ`mWaM0Z0yS4VNfGiqd%#)tbSQ?V2JyGLip7BJDlWFlp zjgxu7N%GO$kaP77OxKG}ijZM%M9_;)DvRp#%T5N1>T{cu&7%7Jnp4T5`uw`n$)fuF zrZd5!`uvuY5=;FVj#7Q@bn;nLpWk&Fg~+8t*W%uDnuUb-Nbfmq5t&X**LzM^gwPt* z<*bR2_aWU*?sjthQDehaI`df6$g7o3y%0I_Y7I)Qbb9?_jS}Om)lX?94;G&PFpS0~Ap8MRFRaQa!)GX2xZjgzHle3XkG{^g9bs1Zt=9pCmcLnEg4 zKxVU37*A58sWDyuIF&4FOjnfK!=lD?O>ql$kfmtE)B&hxTeq5p#z&D%b=z2IdMJDJjVc7?ACM4vx3MtbvAQwOkw}<6y7SkPM zxe7vSxaCIgL^aEGp2jsEo4#Sk>cHA z7BwCz-YsWQu}-o@<`nPG2)_O7mP=kOe(d6?)LLTWYI&)~qkm+uVkno;lPj`$n?a0(2v!|Q53)Nh!t$?&a_I4YD)M+0o&NL~%L4Jnp?`E>ZOh`Gvtz_95GJ#BryM$#Q z$Tm}OF6B0{%!I^34t85uG9Yn~8EzZPX^_1khq#?A=R=N$9O|xNDS(^^Np%NVZe}^m z9b>74WFvF9J0YYF&}L&0wKXRo6m}a@$yFR88gG1oJ1RszK@&n-7rIG%Q4hmg z(?#BvqMjNH3vC7TgxWkeN0gH10CA}25;sps_$jta+$I)P&wO`MNcbtXd^eCpt%r}x zm$`{T!dug2sz3Twn63o06_$k%x>pjGyLoPeAw@-+yc@E@ecaZB*Q+l(T zwI8*<$a@}Sfjh82iTr*y&7TFXaR5p9d5{u!28((gWTD$E#XC2?#U13#Af}XBzr`K@ zPbMdYYLN-I61v#6$Wa54-Iw(;?qL9(8+J4uXt8 z8r>n5S&%^-i5_<+S!P3MeE3ptt2_rnU)_DelPmut75|ai|47rnq)S(Ksh)6+qi8DX zw3m?i2|awmohzhVdkaEO96aF`Nb!DGHhKM_Cxd=NDNkZX@ZPY0gcONVa?WoXgR6mV zd4%i$X?Dwxrq;u69Bpx{goK|YZE@>4^C9{}d+g`kM$UW-p*{BVZVPAVm-v3D`31L) zGk+kHDx{M$p-Gu}(e2^Po)F5s==KSb`|u1%tDBTgJq+)|UvdkCRQQfWDeBKlZod@m z3<#Ba$&H>Rrc21lkeA(jA$8h83$W!vUU7|MC?kK-p96W-O<#=1vzH0EcfBGPcA#b@|EWbkT7E*GY%;=l(!~x`Ow?{~=M)El19k=p$nVANm>005ou^a+< z3DWJ33#rAOf3ytgajPqQ9uT@-7nYe2>Q7is|BqbyAGsFtGv3z} zE>#No9#iT`%w4$G|I=3T05UXACY({@K*I6@GW7fXQ@2Y@SNJOfpSyiRhGW&;($C!i zo*U|J>F4eUXVe&ves_#BYV=XRJINV!xAY4)`eZqu)!ouBTtmoktQrUMr5n!~x?4)) zsK0clb4HB}`N~b^4BaiI%vWwIXVh4c0XLm9beHq6_b>v`&Ekw2J+juF%Ne?(N}088 z9%s~elCRx-&d?oI%6#n>aYiloZ`@)QwcNjPOIXw$)oeHHsIGHcIHT^Uu5;Ttqwc7F>vnQR-BJD4?d6QRqxzlO#~F1;^*eWvGwN>X zkUPQ|b+>fL9p{X?Tl&2_$r*LG^n2HrMN2t+M}F8fgoN+N54#DRQQO6OH<3kc7wg?5 z7PVchcTL6XXnt7T3k%)1t*O zH!5z86z|BmOX2cv8Xu~8<%mm z%&58Hj~f&co`?RpNftE^{c*+TP^mI)W4e6)%OBUovInMu&OH5b9V|3gY266K%{`Y& z)o5wRT!tR%ar0QthTH%N#uW%D({6y=4hh9IvD^Wvf*5gaT0YcA-+i|Hv4&$#|SL36$_k`ZQ_#)a03%z~u z)vcruZ&0E2IbM~Dxfc?T?JF$NQPEl)enE#N#Ii$Nj_6PLxV)pP$Lr6Iarv^(zQc}> z(mK%kj&UU{8IX5{R0_d6TDi|V#Z|MYKJTPz_IjA0L|0Rh5Z59~bw{Z_C&aa}s6Owk zO2y1PRMY;Ctox6vd;I?g{>qx2XoNZE_3ND1nPp}|CKd~A3!xFhY_UuxghnP?=vZ2B z@>c4dyfucr#XD~ygb-Td9g7ViG;<9S`r>-9SOe$Jow+w;1f*Y)~!UO%qa z^?DQ8L#_nTuXiC~R}O}J0y)6nA?optB(wazQ9{oh68*^+h;7xU*2RJTbQaaZ1N|97 z*87e{&4*!x$$|bH8KbEsf1p2~MfKu9e=&>d#cY4M5X=<8y*S8U$D(?1u)m2#_2LkJ zn-F}>0dE`(qhCq>i3_RCvR~ATL;b!Lo_vRx!~97?y4`*y`_oudzmomwQZ&`(WPfR% zSQ>bWF1Mc}{9Qu4HqY~qv#2(w_!BOoQo}K-%}4uFg><{iXTCpANR4(1YW@{1obN9Z z6491IXbm3Y@8_5+IA(!=l4I6FXq_JCuH`C7%rxAY+(q_)q`Q)UGuRoB#jebU(0+QN zDP^YGJhJ2IyYYC&yc0u@%+pD`7$Pk#zK^#=4JkBA>I}1 za(^p}nzv`Uzem<1{$V$u)N;ReF|}vCZwxJ@<#U1G$FlowN)m*4+t>yEuoQQ_U*J#X z7`4@1;7=FgZBZBai&@kbwZh-PqPD1u{M%U6QeEk{^SvcTN7_sL$x%{+Uaa!x3-SK( z3;cybBEArMLHkaDzeLD--=UCuQR*^(8O!mI2ZU4!@p^i>zmY}t>vI1lDQ@2{_uH4q z{X+HYa(_09>Q|vZewB<-$Al~W*+OdYgi7uySNro>RzjN5p4I+hArY+@@-*Zce`O=jpmMO=o>>Vs&SGKVn>&ht01+K&v$Tr{Tip}y* zS5jCyUCCnk(v^IcDGOA4N?B&QQpb|!N()PlD_tyWTp3{bhb!YOPr4F+ne4?@R}xu% za3zgpFU+eZ*H;e9A+8j%oajoq5bwY8I)7u7{1;o)8h>k)Y=x}#cSQ+}h`!0cElNH? z%+3BmA@WZ9myn3R=yK|X+%oBXqH=$WkP0y#iQY=M)!!yWjz^-JZ}oR_Oar!XI$N&r z_i)U=A#?<&@Nbhb+RKnpU{LP=p z@(0W9{uCj&OEV=_o94qgy}zGhf)J{w+CR=Q^C0vM^csKil~nU^Olu8}`tRZ$XMbsw z?1y@4{jpbx?7mEtG9h*TM3x+udVey@N|pwH4$D<6|MVBKL|7XARV>vk_xYQIc-LQ> z{4GN8Z5_nWQr+Y)zFM}K{y`Gao=yG^A>MQ02mGTfYMzP*{Ygbs%DapHpg&tkxAr`0 zJ_PkV=+9^Afuum1{B=US^XEtWjZ%Eu5OX|Y9`X0He8tl2pRt;9$x?LX@~FQ~ihH*6 zZ-1i{Jok&$PDMTc_KyjPXmPQz+BuL`f88~r%~}wW4|&EvB&0$+3PSI4KIflvEyYB% z#VjxQn}yV9%OO{x)Jy(;j=3IkJ*3m0T1=&CwFsmP^18oHNJP6EavNl`zj}?VxfMcp z`QGr43z4%5(9Dx>_>-@fEu>Li_n=gdI&+w=u3_JDMg60B@(OCE|L*^~G3tEY6LmiC z$yStl0J(bIQeQ(J*+u?>&^5^0ZpmTD-|s7xw4UEt1Hj3Y;$D`%lk^EF2tKkFQ7di>>{s2KH5dzhJ5PE4%9=X zw(lYoGqj6*2pMr@f=i9=B2?--CDYX!{LvM)20c-0&=dNC(stA{?v_&P!V|TYJyC1f z6SbCqa_doR*^{{4J*_YU=}|HbF;*ZeO7@2Y z1NlPaKkT89aG*=baExkCVxa#9dHkUnBeM{b7#LbBh31Dm8**S^Y@HOEoswjBAooTo zC!nV!2L&dD$T=jbUvmOOw@^$CZkNPr7b521K-zi|Ib$UCbZ(%KMfLQMK#P!wM)O`? zj#5d1aJj69=DjS292UrBp?NRYK@Jb}vRsW^6f-ZdjinM&1vxS>!14g37LpPeVtE15 z2stV+!Lo(r=s^6fGW!tA{6LuHSI9#sl^U4CV)&#S6G&k>j^)@uI?H(w%C#Vn#j+am z7$hx_!*V;zae-WxhapcQ=J-G!%PSDdenOyxKLU zlE6fiOd{s=K;8z*Ug1+uoU;Q3LU7lb-}}oB6btc2JD(XS)QkKh6E~QJ>rUW zKgd~uHYq;(YHApAPN0KJ-Gdg=-LP{4JshL%NfLrC;MYC%3&@d>rGYUKX4E$52@xwpxErxS7}O05iZ2#IK) za?Hhn!rLjPE9M8tQpDs3idgpCQ`WO8P|V`6TpB20nFm>kQU!d>>=NtZGRS3tQW0~j zb{b-?fm|Nw5K^NpgRFyG5g1^(0#Xhs3}jcyHkU$fhg=z0%CZ4+5YA+-3KX*32cb8o zt_~Cn@vgFq0;NLaUO?-;C{QV+%cs`h>Od8XT866w)hueAt`5{m(Ny182U=KYtD~M? z6X;-3OXJ!=r;rNm8MN>y;#Depn zNW`c1rW*pK9PM0HMNb&jNW3>+&*&IK6uV z1w!PAyVyN3&MHtOWH?T(oqGc%ENboC8z^T{Yo{?#B_&3!oyI^li&{JP1sYh?+Ib+b ziAAlQ2LnwkYVAA}Xl7Asrzz0FqSns80$yM%i&|gL1+s;7$EfAp9w=f_%jfw(dz8@fc`>k! zMJ=C~0)s*#+Uw{A#k>+ot)ccrv@P7PR|8E#x?|KDd@YcDmpB5%s5SU{AeV)<7Frsc z0|ik+dv|wWl!dmRJ+Ni=1SX<{_V>2}4YjgnwMD%h(CehAwewCOQ^;_PT02_;B`j*~ z^aYx^l-i=+4Ro-mE$Y2MAB)-&wg!e+)Yh^skoXVEUasxH(x9Ww`+-~`T`|A&^7$Z8 zBxE>7Z3!O++Jtn+s4byi?YZtV#E+Fs-E(@ZHUmrJ<3Lh9<&xWm1^FaUC1f~GJ$)Mp zbV-R(r3M1wyQ!2M7dH!~J`K!aF;Med$Y+6Mmbs84AfE@)gveZ}kikH;5P2jy3o;bw z5i%TeDvtag4>>m zNTQUO<&ay2q(wcqiD>_Xd;l2>EM=kg3`4#TB-|@w-Z(NwyAAK3{uoFWQlm8^=6l49 z2l7~`J-G3y{TwLfQf-KdhfD-|Ip!6J4*4yR+(+z*n7m_GxR9P=CG zNXTD-29DWxuUKs{MANqk@t(QF=mSD3d~*>)XTmZ15K9(>#_h!DV=Py3%x?MwOBKiL zrpIoi7FPHkgPf0CQ}lQt-9Gg+XNqpi7;$}Zv4}~zPm~gJ6(m;Azn{c=$~jH%5HcL2 zp7>1D=WL=F?`c<@Uc{oV9ro0-AE20s_TG88szuESdXta}?M1Y(7P7BCC}cQBJwu$K zCp{=@R!=YkdX^B3dq=5_C>78Pgw$$RKc#7H5M8h4QtAnmq31m$>ru}lO}(v2ih9=O z=#xU^m%%rqo&)sphbczxl^;M3)F)X!L-tQ0v-Q}2$rzf`X$W$V9?!A^F*_l1berX8 z$T;L+J&9$vz43&1I_?$dDJ*+IDAyr+8jA%Ttb*1$u?FH%jfDrHbX}Ufn#Cv|4u8+x5?sLzDdVDkWt6Nj! z3Kr_VN2RE71&j0!Dej)KSfBBjh;c^|oTz8AsAr=m=}TFj!&1EvJlppNE{SHwsy=^+V{){2aYY z$m>%^Ad_^jK(Bj(N_EAILwZo^JiRMQwm_EZ<3eh*X$iP;fh^P0TV<{ggkmnxi-q7V ze#jtXg~rFY}Ff>M|08A58c!>_>+LP(GxvwvcX3t(^kBPRMYK z8ZU9VJ}#s}`&)$^1$U+Hds_DWZq!2~Y_HTSg>-3Z8D6C~LqGy_` z^`0o1g*LC&liOs?k0a(N$hCUxGosDzn78ZnWGPx3VyN%e=@~-g)x-%xvV?e79M|bN zLcG2EIz3m4yDwj-=Lzx7gxBbWLge0kB5Gcvw@UG;@z14tyO4-ajejoHyEsOT@wid% zo`9{5;V_riq&OyyL>4Pl&kmW)~S=1Z?H|yhE56xvk_a$!DwP$JhRQSF{Df&Mx z(|tlBzCHGl|EFd8433!%p_qtnb4)tNMD#gAyyt_r=-Djl`QUoJfkjddOc5wTw-+eE7wb-ghnLZs#iwIWhk{lPj07r>a}HP&oz+S^n8{=2#q_vU9S>S zp(SB1!5a`$r8h*$dLf-Gx1bb_F}p(_W%)bHox1(JSYr5^HO@RybB#VHO8$;|YW0*T zp)o@BdM?XDD0Met{;AhV@x2V8r>^(u%|dX_26+fE_v!6X@)YDDef$N=UW4xe$7-)Z z9@R%*B*FVlkXe|ax<&WBB!zmh1u>87O)NCq{Kt@1z3^pOPsyn9N5~lDX}yCbcHdZS`rdfARv%#5A94WX8GV#xHslz{v%2<*%yldz6Y`vHvz!jO z7}Bn1u&jivfjqD0u&jan4f2AXF9fqmK<obm~JxrGz_j-+F5YnZm2pNtkUm}l(oAnGK-f?5IUL-|(64_}C@MgVONUi(Dhs}C3i~8b2 zx85(LUQ=Iucth7;6-(Yd`t|6^Lh5}lqh|WHX^)=D(&tJ#%QvnJO2HRdWP5t_5g}fi zdvxtJ*;5lSJJHh~J)LDHg#Ity)SIG&zRdELZoe)|%}317DAlWDapBiJJp=L=WQ!}y zSo&O1BLv=cMU4=6Pj3=6%OlC22~)JKdYcq{{~%V|AF@riyC{1FzGM(9#st2vCkgSc z2jACIgm~A3@9Sx@l-OEmo}Bmf%qTen;|4#_^Q8FJqh{K>`}G1L5nm02j%@vUF~{5w zp*MOy(n~q!X$aN)kzOfdL@pa`{#YN4l0?XWp1zrSA^)uogM6mv3GsTdUGEa&^iTq8FBIb4Hy+W;g~)Zf2<;is+l6>N-Jx$2;`MZgKJfq5 zv%}q5-oSFEaTlI!h0uSTC*MKny3&=Yd(M#eSHDs9Or6Oxs$@ECnWv+LJ6)kIljK`h z=AqOw$ak(}u#730N=suEV!q!+u7UjE%K0c&4jFf46{H68lPk338z4XHqfyI{-Z`4k zm-fgde?3Y)hWh}&>Lo&k}>-1p?R zu>hr3{JfiXm@yzkE{%5)bGR`sqzlivasLN$gpsqAN_F8$D(*T$=DACi-euT{Bkhr{ zbZo*qzBubnab+D!ksR$xHH7{>Q(bw8kcCE}kQ&W^Jc&2`7a3(jWSgm9i;adT387Sm(G(?zKu$J>r1<8e zo&}K8j8P%p-OJOAF(Jb-YKfg@OtPpYmSy-pl>Jgmeu zg_e!%bOm&_kuAi#3wn-`C!}1v3^5DQ!gGvrj!}1n&M|sf)E%L7jkb?ud(?VA&*&4< z6{EJ6^NrY#DdzRv)E$^*MzfHJmWz?hbT4v(BjGm`^!oolz%awC^F)Hsfp5M)nZ()H}|X z8hJwGNcb&SJEcbF|0t$jn?$L8$c;vy5P6s8bI46b>ag5?rdt^8{59?)8F@my`#%w* znnm6Jxy2adQaVZvqn=xgF(Go>pnE&(jf}6vy3n4(_=KH^xz*S-BIRI|BB?OSzLwe3 zA@ohs4Mr===@8m4DvdEA^6Qy&SLAO-!VX!g05KDYxy@*2DTT!Chxu!aJ|P&P4WX~o zRvBX)(+u$=rpn0tM%J?#5{CTUSjzG_Q!YN-l)lW%NWzA*9Zjh?1Ki^+xhe*`9+?&z+FFjSQ9)NF$`dD2tNEApbO)Sr#Ft z1JbDePp7LnKR3EU_aSL}_C)P*o~ZrQlU&ri88vS-T175zHqnhnyAW@G-)MAkjLLPN z(aSM(&y)6@`;2~$QQ7Y|202FU@An&{9HZK^$r$Gtb==rwXy4Kj8;(;ge8BJtsc^rh z_khtNq(-|Az1V_YJZQv!N2O}DD#$00CL>db+qio=7oA2MBYOtrd7T$C z6GB((u1r-kT)m^}nK~aaG)tH#r$A`Ff-OdqY_oeOu+L}_B9DI8q8ELJ_LE!}bY!~` z@}A)n;;r|sD%bRLQ8UeK@5v<)Iv4e%!&VENW4{Z-Z+ z7m_u9XLPdYEMvx)5U=L%jY%QHaq3>>_eSb(Vj0G%dzC*J#VqPx<&Q=yi@H}iZj1_% z`ykzu`N=5yUDl)al%I_f7PY7RY?KS>j#GQeFGdy1EVP;G`Ne2pQTxt>u}MgU?-0b$ zJ~&}Cvm6bfeQ?5PV_C>CzZxAZXL8K1Mvsu;IJFP{X7sVBeegG9fJ?oDk%Y9(|85Mi zdTMGW0>jWLs0zT#55ndw60IEQhxXNsA@ z@;hSaovf*5CYPG#;JGkjrkO=TymdOwEQ^xe_Qzc#vq4C=I}6_)X0sHZTBm!M?JQ~y z?qPNcS?@EDD<1XiVJ7}1dqFeE(K_A3OcSy>X097kz%lb7`-)QAgw$&%K`h9gW}@bE z{|ovs8fvJTfHV?mqDcvD}Xs+6%&F zHJ75JG1U_`8(7qRo0(>_5br+rOtW1`g-^{DJk#tH67i|If@hk&9P`8g?h0V39$;?c zm=4I9LI!1w_>Wr(nPpBy2^|3rG!u3cTY^@7gr?;oX0}-974^9Prw5tgD4{oh4>EIv49BVe$~k7PjPV7+_%}z)9J7F9)W7G! zW)a8CrWhPa4mL|UM*W}8HOo2X7_MioSLI|lG!^|^uqV* z795SRcPE+KghYJHQHqW>N#>x85j`b2)YNw0weN?SJ|UR7oz8Yp&tc{a7IhwVgc%l6 zqg{%cS7E6hWnv-Y*FCi#^C+%{q?&cpsAf50VI5?F*(hWmT9FpQ&hxX91Wsx~51o!75w6!cUCpbpEceB{keAGhkO@YN` zypRfa=A{gC2FIwkRx`}7kl{G>zUPT%E{l5K^CYu@MZGtAvbl{#y*HX^Cd5(p;W+ia z=P70ui+bPlRI`#ry*GNA*~OyX8_hDcJ-jtog{85?)T5*ha)y}{B@aN(GTVd<$Eo*o z&ow((R8P+}dsx(4ndg~(LL$C!Q$1jThUYM)$E_hO9RGgp>>Efm~}gPp6o2tqV()-u@^yllPLPwz6Dj z_6jN2K4)2D&e)q`Dl~eBmwIu%8IBU_MTwadB{VW*t(hvMJBCV8ziu>}qGBj}#B7a{ zEok8_W=B*h>U+5vn?TtyLYv#O!K@Mz(c)*yUR0Xn9HT=%L_L2q6ZVm%4rIB_46_`` za=V$vaso@0xs>H}mOIP>mRy#|x+U1bXkn2vfRY-+KZ${Ibw$)~bkl`2-dW*K! zOxTy&BZZd6-DbX!^|BP|xz|kI&x@hH-)|NRsqn2uF8V)x&@5%S1491=51N%iYP3y| zpHR<3X0?nF$LC2%li3s{Q~j7{z#NT|y&?ZLC!-_)dE89E*L9+=ms?F+h`a)#?5$>< z5O3a|C(TA#${pqPq}j|dYLwSgW-G_2QC?4(9UP-(xqRB};utl{<m#K3MeW!1=kVGNFacZ8)&1MqEsCgzgo2f#!$Ek1db(`rd>KlCB zW+uxQ$WG@H-DWO}`YK^6&qRJdQ^>^93}OpN+o?HlF{oqAfM z?RJ11FWO_)vFru85&h~hds&hoHITQ=6hoHEV)?I`%W@%PBVu~Za+V^FdE0CeQmd6i zni2Dk*=$lhwc5RqXCZy&fF+i^m>ZLhB=4EYHc5pRI7Gv&9+)rJYzj(w4yCq0J}`YD zS!y%n6G*>V#!XwwgdGHn&mTPsn}VV%?9$NIl{6xGH6hd#&?lALb$$D;L`Nr&IX<`{Q$5=Wb^wq+hW;jun+6JNQ-|u?~p_p1NlWX3~$~jodiHONUOoEj#SIP>+{ES>PtYVhc5Zdbe zRyoTpECH)uNR4(Ei*AjuEJe*ZsM)Z_S&AXcA*O}NgT(gSz+zePLcD7k+X_qZy@Z&R zC}mr7Sl)ur{$*P!EOg8)Kupj|W1(Z_H9|6_XzEB3vT~y2M#MN)UXJ-9Ab?Kkz-TaAW2ryVH6|fCCH&xe6lR{ zA^Jt%3pmWmVEGo(jhMr&5|-U&$7)+4$yP7Revm=P5mxvJSj)`R zWYI9Tna(^~v#9qJ zF0^JGOQpQo2`;p3Ar%_Ed3PsjzR;=^;@wNR(5e>VT?JfdHONx#RltQ-6AN7h&>7JR ztA&NG0;s1etah$PT?OP>ogAaC0`jb07WHNDi>z%d>dW94S%WO<%it@m5f=4j@RioM z5brABVr!CP)K$R6mT!SrhVE5BzLg-P!l$kR@-3TV)K$PGRwBo!tAI4*)Ir6Nsz{+Ep387_JV70K!gB0Mu=`yQL zNW_-~`3KhEWmYH0tb$Ok%dH-kbr5RL<<>TqYL2XvMQ^Ld_kxzj~!LgQXR+_BE2Qkl{G>Er6@6IULi87}`^=vQjuk zU0YpkrE!e9wz}HNgxd4S#2Dnz7BAm)yYENW2L=m zjn%`_4WTVzjkS&CJuESbx!xLJ`2s>Q*IOejKX6QmHO8{%!7`@AniMh|r@kq0gB5$6 zT&IbMp(EQ3R)Ub>xcQhfpN_O^EuCXhIcBYu$T8}AaGjOJG3t77ot4V+@M3wCD7DgA zUVu=WORX#+5nm2!rheUM<*?*&n{Tx8Sk!&mo2+6X>wTM7PM=E^aF z<<_8(8f_oQ+laZqa+J_pt9M&zQ9|!QH&|Iwl7SZf(<&Cy9iv*< zXjQYQ7H+hfSX6uNv)ZF#s6F>vLs2m#4_I~vEsf#0^xfrbhYwjxS=3C1O;#O?ni26~ ztB*y^i1;rn{zO@in#u4HE0aadWY}z#v#1#nAGJDJ)QpIaS(8HK63as0|80$(L^W5q z?{`08O$dqj)U$vmtk{!fcJ)l5)ruDq@u_DDt(ML)>eiG3Ta`lAYcw||W&g;kixOIfA6uJ*498Fm-RB>$ zv~y*4HKXRBl_w-3>S;mELzcbNi=h^NZ50VA7csO9N3BvJ5$#p9hhlbGRV)J#dd4wk zHM9K0^1ao?GCfJg{9p~T9K`aYHOZpp@E^A_&X;{(gqRo6!k?@%7WItd7pp}`jaGn| zUc^jT;~cXVvRz2*GODLWdl2$7 ztTc{U1X%$2%gW)H%OR&iG&`527P1@?V;9I$7;7!(Ql4Trv2?P;+Ji#mk%Z22r`lst zatZ3$-PV>`vA3NkB;uai>}_uovfii8 zZT7YYWsJ7>VR-Kt{YtR)3n`cUUgS-XeeEn38WB_hnPC?Q@!ogX-!2v6&CRmEUA{sr z4fjhQx}AHG6!j*BX^*XxqGn>T?aqs(sF_%TcH<>d)EqAd*sUyTZk7Y=Nfz}*j05eC zOJyk%`Xa_bcI9OxHQJm{@mv&p?p(Wr#X;Yf&=-*HULnIVM?mgCPm}C%j#&h`8*;ck z$#MqdK1i}1d%3JRkL3t^2Fq&5!-$z@&k<7LTiGSA@sG4qrD)ee=*s0tJBOtdLL(AW z>@q3t=#iuBIw9URc9h-6qPDT4?f5H1-{aIaHs8)JH~Dh(jC(QX+bZJwTEOWjpTXAadu}R<%(#%kZwr2-N&N7H@eUs6e9N>8YjHi z&bU%8F`5I1MwBhKGg*dF4~-~0(MGlSbx%G1W89s>owt*Bky9a=u4EzROvovAmZ(QQ zi+mgHInB-&BJX(o53%Vl*fl(Q%Hrj6EY1; zEYFTzP1z&bZ;*W;EA31n-uzMd_EHvgBw1zGv8W?SfjuU~+v+Z}^=srhjZMb4Y*6!M zc9S| z#T4UxHSAiul0{uNU2B(IM=_Ye0PR_hQrFq7LcFi4t+CtIP)wJmz8bd1o@7y9XIo=u zTrb+AEkr#lQO_E?h2>mGp^%Ic8AIO@n~N*NHFmj>8f_I~)*$A3dx&G!L+B_`V$Zoj zma225P)M!z802P@DzUp*+95Ra?OHo_EtRU#UWaTz%sM+>NJQHXsfLu=Hpl!0p>L$# zXwP8@9wDDn-DIb-90R!-15?MC`UGX@%Tk_X&}6 z7e5DCZ^y5rHsiYcLU}LcR(pn!h;QO*c`xNwJIpcP?2s`P_8g8m5Kq8q`>C)~I7ZDv zv%yXivOTU4ZKiLDZm{!YOpLmw-e4CA@vfjZ*d;<_FR0BM>~dKuPQ9^GY1jRKr7G9i=L5yOjDR>vGG-Bo*%H6vZ&dfAF%Vd9(5h}fL*}#sOz`~>|z#m9rvJJ%A&609<(dDo;T3<-E54d zu^WVR#e4vX7t$|9Q}Z@A+2NaMX+*T1~I#5`w<|pma3X+IMGaj#m zwAt-KYP3I){c6ZFcJT&^snP6tvDi!S28~_Hax{cyhkM>GXE}-G1-nW}L^~I97fQWo z$5zUERzaSGbl3?jYap*cUb1bL4G@}T?qxfX!kQTKq;C7xzBE7*#V(Bko)XrAzhkUgYVkoENZUl_w3BSQ7>dJ8j-lw z&JiMW?Hj}lDt3twZ(i#U>{1rB&3|B*2`P8Ko%exVDJ0@k+w%u@9m}6+p^ch9v>RFW zI}+az5z;KAOH*4yzunHF<`4hKj=hcAJRGCuwf@Ae6C!)D5cLe$O+sWZvLV~;%-gAy zw^x2;XAAN6%CGEPj!}E%h@HqdE={eA@9b(8wMBhzH?gQS z_=DXhCFUYzzX84Y(YEgp^~Br?*#P;;?vbLY{rwkvLWsA&PuPWbQYpE2)0x$;b`{H` zsE5w$ezOOJVAc)@?M=ViLoA=OOxmL?aVaw94||+tCd;4pq>zYq41{X_%l1`McDY5> zqs>~dFiIYPObPZ1@y>*&2Dh=O^WLe!0Ty*`JT*APqRxbO4~__l_~@wqC~Dq4IL1Op z^(TZ(vMfOh>AYoHFt$dt(03JtW(=4Xj2AK-qrP7`EocjgXl00@clM_Ri#SHTvp+4^ z$fDla_XP)7)VXL}P`itAdEbKEGnmez<_U}sW(&a^m&ireM0*8`IY!O;yH~K0MP1eI z9UPAmx~knLSXwJ{Q449NwHd)y7Ih~_5B3X*XidoVES8TE9ATlk;9i25!NfYMN6!7& z1F?d+LTa>jlzJCp2TNJrgwV{2!C)oJ=PaRM9m~&8jV${gCF=TOriK!-6yJmbrf5n8SmG zEHuU=gj~tNL6+E~@k{|SFE|z@$3jwqDGjooc*Ic6M+fUzLXZr^%n#xsSuBkcAaobv zn4r#b8YBlX#|D#x)N1FkEC^O}Og`ii#H0m#S+0j%4>>+K5GA)k(u4LtDOZg~F%Lo( z2MdJMYo(BvAtwd*5Hz09?P$g zpHS-bU?EG~d|B#@U@^-P5IT-!2TNH_giNB;nZXv8^C5J0aaOR6gEE^zu zI#aZqV2>2{+TomF{6@K)>0Z-5h&d;i#zOmY5ORJnJ4z0MEDz>J$>ER-g3TuJ0k0LG3}Ay$dl~7*EZD z%`BflY)EZzh=t~DJ{VFT9FLM?Aom0_9+LIYKjZ0;jlrBK$%Q-+%#V^QA^!?)5>l(} zKrWJ&U~-e}1xW<*RIp7*y+(Hw>mbhrwTERcEmg{k!PI}rQhP(%5%X%WL`c0D-_i|v zJ-CTu<{)MZq$}uqM3zc}3_;!qrbfx{ke*-@OEzK>W@3Jy;26s#5EJs>;L>KQr&gou zf@H{+VBe#%<_KbF>wP!a&r-|sUT~1*5lA{pZ4HjGZ04A4!3mZxSl$n6kI9<PoA*mo*>#q~T}fs+&6P}+i(JWLiMUe2a*r$3EYG>p%rfFiC(Ay^srK}9?0LM(RlqXal`@u-U1?ys=2Og8BGy+cOP(9k!*a7L zgDe|enP7R=m4s(xFaGPw9F{L#NoO%nP;FkyGS8JFmXlnmWLf3PCYBprX=iD4rH`e> zl@XQ)-M(wja+}>4on_FKWR_oD$z<6-UG*Z5Ww9$IEcvcfvy{2g%+lmaC(CQD^s{{A z${5S=2=t>F8N3K+}jJeXxGUXK2!cLY0UFm1J zYe4;9jIr$aOo{I$*^A@dQel={S5jH7b0wQ)lPd)*TU{xWqS5(kGtOJgP~t0;t5zFC zOeZ85O6nBZ@hu>nXF|fE@z`NvQ*5exO+JZ;~YXcLTa?%aDM2A92_cT zdHAFl?NCTksD(vGsnZ}wgmN}hJvCYqWEJG7P%g^?mZL-YET=-~{BVA#m?alN=ZC4G zGM1|#bbfejsG21Lq4UE9p$3*Z2<1u(ZDM%@awX)rPz%cokO<_2P@9l??QO`-KVinv zkgr=VjfV5&h>k@eo#nlLDT_miLTa>~knb?YBO{d0F;hR9B4$iFDOAm3LFhfQlS6|n zhp?OyN_s=)8bEd$J#t#8R0wK@+=Uiqg$6iAJ1thb7qTQ|_sCNFLLP#g5z1zn1)*<6 zWry-uj)%O8n$HUP-W2P?y$g{ODik8`uhKbfPN*bG=s9CfXhN3q9q=)}M1+~`&k1R7 zQ9Z*kY6QhOq4X%B5ftZ!%2?D0it|F7ghaISP|x{@IX^Tm1f#sT=JP|D|CRkZ9c_LL z{W?F?#IhXn6l7UQ@0BrQwRn;PSsq%-as^_#A-SP~D0v%lL8yeK8vDhEkQJd;mSU9J z4#7N0Z;R!l-3XzWm7!#ozd=SI`Jo(^dpPEj&^XH@kRK6qX=qYNz4k1G)@eZ~{vFxo zS0MBT-({gxmbW0Z)mb03)VQfMVM%0JeqGVsxvoF z4)sg%-G)-1;7!{{LgOqgkQK=FNXYjA)q@%BAT+-2k?Hb5UsOQPhHkK;Lt&pceliOvfCNA}KXwDZ>Iw4hvX$$$j zl=3-*dircAF-rb{nCC(bEcE|=Kjei_-w>6m)fR5XXmRxYrBM9;WIYq8rwuVLhf;*p zYI~m^tGxtyCA5@d&Ugp^Xpqj(CXONLhrAZ59Hx3|v{@)c(iQT3CFKOj7m)5y3(I+s zQAkfHc|^t(L4Jn36>1hztK9+F?Lf>A5USfjF|}GZ*Yi#&{To?ow=-h3Kd0gOd#FlC zy|yoeM*F-MYUP;O5ITx(4YjkJ$+9if!&1ufeyE@25ta`^BP{Ph;?bTDLm8to`?ruV zq(79!vPU-FYlD0g%4L}iSqk|il+UsVav5YGRLHUdas%YkP$^3(q!RL3s7#9c-~D+g z^(V?+uN{Y@=(#xdejX}kxd){hQR<6OAIp=Fhavw9`F@tANS=m#6-sB>4A~6%I@JD) zjOk_hCe#%r?;>VrDEC*{_YXK`EY!mC1>`%#{16&qq4_F*g^Y(Pf0LzlB4+p5c#A(2 z{$0v%5F7GaXjDkOw)>g*Mm%IPlrbsWa~^uS0zLgR)Fh-v>ws*4;8V#g|AO2E+0B{p zhphQdmZ?sYkb3Q6$YqG}Ica~&m}Abxs5D5Nlf`lkVu~PpI0GyJwC5|L_IIjSN+8!m{7xOq?T|7^z-bgB z|1a`!G}fIqDZcv3aPLrilz82l(++2q{@hm-@>u_g=5N~}Q z?v%2qejV=gv8Y_hjvXgzcDIdWCq;_y1Jq30#ylsD<#Wz8&&d$t<(lWTu&7+~9BmKT zQ$*HKO(%ded4D5sd~QOocsXMjcJI?74jbJtu)JEcOrTt_=~ zQrv!}I*ly8v*rGk>NIgZDp#r#A1`ZGxl)}x7S*p~oE9Nou49}oDLx%F(=uG(^s>z2 zTnn6ST#w4Nz)73FYpw-OHH*rX<_rk&a-})rQhf6`*YVCI%L2}Iyc4^ZtXbtc-YH~J z{W{+1WKp?JaN_r-QeLhToJ1+UlR4KyCy8YV=UV8b2=TU!g-#=j%C*oLV^O&lIcW*I z=33LcCm=PMZ|pUEHrzoeq|#IoGL97uTb5o$4g* zCu>%@PIbyyRKHGhdWCqoPIHE&xcyqej~lPJVnU)fF-i|SXlGsvQHo#`a`Ma}Lp>P#m?if_?n zxJQEh>ue{B;knKzi^_GbldkWY>pZ7Qh?na;r%8&N>wKq$TKA$(Q2hy2L4Dp?^=xb%|5V^{8cd zi8H{Wa$Vvihjz`i$|)7%4E1YT;m8;Mh5aQ)3bjGFl zPUc)!Ig>0)I2UI7o+)cqxvp{wSyaESaynU5uB)B+1E`dj>uM)aiZ7RQt#*=FuHam& zofIM7wz1l2WKp?RJ7X*=*ELSstX*?mn%e~yM>zz8TM=itaokv|{qz+H2dIE_NQTqRDM z6yJY1*IK88rJZxFb-K77m20h&G+WlJa;W) z%A6h{Uam4{P>Q=H+~SO|e9F0QamKhFmFpH~>A}0^y2WW>QMuMT6GFUP>z#zTRI0-F z4fpF-M`s!5T(>%5A>LMZt5eCM*3PZY0E^01;mkQi)a)K|s9cp!e3I;`%JnyAsSvMUe{+hY_@6hYDUx>cb8D!Z9 z?P);Foz6&9DXRHSXH1B9Km1N7;V^Hh-X}^G3-RXrs&-1H#N=U|`R%xuTkVVpiTG^f zdKjhZow2BT{v#y!aH@GY=1|;8?u6Xq^azRg4nwJZ@Fvbir%#HO26-Pb8=V=+R4SsK z4f!ABK_^KFo?AhFg#63NWLd-Vs8hnS-{+VK`xksY+^Lk}-obm^LACgGPgmcpcV(*T zmnW*tPdg2w9=R_5ME2*Lb|JD~Rk%am?r2AN%aFdC+~E`m@s{DsPLULM8NTeynI}s5 z)SHQ2PBP2i&@Y-nuFFXk(j7zdeos9JcXyqU6e?AtH6msoNVk)Cl$TwHyy2uo$pMfz zojNJn15^r2zSoIAno31{Dp#+QFQh_zvxA;H^g4ws^c@y@R?_Q~upEAzd^hK9r;KG0 zgx zQ(vFc#iC~F>vQ^87TzoCdDrP@*~0a_>kP3h`Ag1c^`7IK?=3@W&wEb7{}DY(s6FpF ziBYlyveiizBHuqf2lBp?CPdDAc{tX^hfXfbCuq+xkdK^VmNCde$S2Mq%U~y+V?s8>-x(^4)sx6F*OfGuvs}qxxz3eBmWN#_7vlAFr_&(Co%3O*(=0{I`EUuAGkU>7 zb3TxK>-0rQA>=z}C`zt{j5(7+YBl=b*?^})-#e+tdfVYz#Qfl7OY!~w_7v>~>^tMm zQkJ*T=GgB@@`QNzmdBkU7WI$zlhZ6j&Yw_@ntyV}IY#|k{p=(ykXzJesQGrp{OoiJ zsqp;)se}CD^svM)#gZ4&$1)SrDx_bEyLbQM#HNXUX*=)1lP(dHDaDtBQg1>goNSg8 zAX|mxvYf>+zdHFW7jw+7PLUKh*KbZqlzfJIesdbQR542Z2>HX=#6o8de+X%2xdk!P z=1@#)R6Wy$baG6`|L|QV%*^?x)5FpQp_o6NZ7jE=9=b~U%Nby)gV0&!U(SdSZ+&Uu z2_bUr%s@Rc;Tgx#67%Nj+%23aMDEKDVs;DXNbym7XiJz9&SjzYP|TEY0gLKsY`BPJ z8~Q#QF|pxNmW^m3t&6GQa+ZHXXkAPVSF=11IRd424>z#%Ku!?S#PT8JbjY-D3(HrK z93kyOyz?<%IN^A?)%}8)<%scxON7*De?hK<#DzyVhMr~L35gGXU6=b7PBmSqrH%Ljz(ST13i6>ef#&7~5OI7<`R=Y%VTc>e_lhc`*_J&01Y-VY8p zvpfNz^?q=;jirNQ=7u|1dO2opxJQb+4;~Wki;|1coQ0^?baqpXc1yxz0J)Ifq5PSLD`Uju3C0FAo+7 zk>mVQlvNQd=NNUQzAacI^KrM}ZNXJi0&7uv9a7yEY+!i?QZJ;Lh29zaFl0fng@xW3 z`-G59Qrw&?gPs47q-@zgFCynwq^b-WEFVE$6_U*Iiz}%t`{m&cav~;;B?9RYlEHEk zgnpHk!7P?+2>o^{gSkSM1!hBNet3JZNQzbk89+X_2UiKH)e3Mn`Um8Wpmw&{6WnvX zMZt&=Zx**Gm?p)Y#VrbENfEQSm}GocC|JlsvpAB)!4jVYAWMP^eX>8KI@ln@o5kH3 z>=q(N+Jg{tSFq0~H0xd(j6H|y+#91twwho(iyGN#gRMd;w8zo*amZ&`Fy&m)QXz*! zRs?&5RA?_CCLOXWn4BZFpxDZ1K<)|V2=PX(`+|j1+%f9DU^|N%qZ)#dnX-mzjCwd& zEkxGmeB`_)7<=B{^=S&W3aQZEM159a{mWN93`p{^K7t(W7Kt|=Yj()s_h$skqbrX^4E=28-lq)dSmvW^p%k3gWW@3$UDKQoH!p$f7av4(xsSv3$uOg|{)Cck2tsw<8Ej{H*p)#c zvVUF>F$u+#k2gEr8BF?zqzjR$UJA?G)w+(7wMXzxKj6jCUpH||@G`7)SU zD(g)BvkNg_26JvCsnr7c*vEvF3Xx@vJObBJg3EDLj8%$snbq@9FEfag2`o6dYwkUi&V(>!CaOz z5pxk%7ylS6Ww{(O1u^}>PL@&#t+4$in0>R%XAvX;*G>n5+l0tgoPkuo24im(E!CDI zCJ*v^utrF4%wv#`U&mL3f=w(hK(0p2U%^c*Z*q*Lcd>lVF~jtJmY*RvAk_%HsGQ2` zjiDNrL-x^)+oWi-FdKx#>3NkT7&9R&Ap7cFEJs2fg~aQXx67C_AkRWZ>-8)JkhdWF z>6?Z0#>|Jj57}Su^2wKwv3hHjES+NdAqjfg9a5G-{(>B&7qe`Dj5-p}O6v_Qlxi&G zP<62)0`@* zx3hGxIC}BjGUhYRXM#RvnUr53^O1A1-p;b$Y$=E9rORbZGGqy2j?l-fAgR)(L+*tf zsh0`qjVXdW202RC>L{i+W+CKx$T4~f%L9;h$gz4g%Tp}J>-9ovwJnf$5Hm@ST`BYF zfqV{0)00_-SWeP&SPm$_7=@UV^#T^hl@cL%Lq3Fl?-Gc)v6_lX*68xTWB{L}PqA>K8j)Aiu}vd3utvj;UiT~86>jiQ-)E{hsPr|E@4 zyb*hvUgj5+HBE1lB1X0mDR|SYp85clg?HhiJ|xriqK8SUw9g?lYnq`~vh=fL>#>b8 zM$N3w){BHxXnPQIAo4j!Z+S%K9CsPs8U)GFv(`u%&vKrg)FkC-$W+AS>g6n1kbKC6 zdJD^CkgFhhdg5A{su)6Zt&8-G$EB39T%zZ&+|4peFA!4YUR$267qP^>Bk!Kf)=OB_ z+bL)3Wm3d!=O&asTW=O3k5&sHm+AdNysa}w*P5w5-Yj>n9%NB7*tvR^klvW}Si!y+ z`OMXq3#ro{N1baSg?ft+xlO;v5#(~c-6yLNbEV!bC7|}YtMwk1XOK@LVy@Qvgm`BP zSL@mnRKo@CnZnij7%AdRf!^(WwVupEX9^_6`b3}5IqWrhrcdbo&-3&=mX}dF9jUL? zONDsn4kdbv5ZSILP{Zr=oj##d*X#X0X+g{l`jAiBAUEm->!=lSo6;|?OfO=gRXX$y zkutr6WjpFazuYptlI2T?OjXVDgDdq?w2^c0Oq572TjVuMO1fP-Zy1|tamKs+oSsrp_ zIm=V7G_t(lN~aKSv?siiZS*AC?CSztp z=xcf_^mZxk?6gi#Y^NAGWBeKU)al7S8Fdua1L!+_LbJ;I^#Pwm5YwPHy)N^)0cFwA zp;1rkAd$b6lMu5;&yf;Xftb@FO?n>7I#&vW)CJyxOcyalLgZFHS4f!Mt@wfYc?y6?GGk9~t`xGbRVd#=^vSw2MRbY1H)-C+6Nl{A+4LKTz45^<$S zh^+I4sPkibCkySF1(0SvvD51xniV{u2Yqq{VxG_^3h9lZXN73q@}!>ci=k9c>4h9a z$J}d?>M1?;P0G19hRV7b@{C@Lp&HtMJz{yIjeD;{mGsB0H5DjBWL#9wwror!y*&cr=YXX2iy zGjUJUnYbtFOxzQ7PVI?0r}jjhQ+uM$sXbBW)UJ$BXGxx@bD~#NOGl{lrq^6iXGtBd zsI#OuT~TLAZ@Z$-LAJP}&YQNnqRw~T-Am|vXZv14XD%P?C3FV#kt^y9=o44e+0CbW z37y@1?uwedf8mOny?^D3n!SJRikiKD$Q+w|$(QpDV* z2C4e=K^B_ZkbJMlZl;_UXe28kKj?`*xgYYQo+8AX$@J?*LcBAMpY&})ssd`o!cTe^ zOD^h6_o;uwPTOL+GB%&-x&Xy2tU0u5A%xOF-S@_(hLrS%6eDml)6! zSZW|NLmSY8Eb89PuX=<<-Mjf!Pi1*+1x80anfRNY#7tj+}qjb6M!# zdM3V}FsK&`@s25f=sRSLd$sTny-9vThG`=?W)thLRniNS}6Wq(NZ^6OejH!*FQ0# zlz+rz2$8EOcOajbP>zfdU)G@d3=0(qk)?M-hKIU2hSsHg1Bnd{3Gv!BGBoi$s*lW> z=HVklnL_HcUpmn1NVQL>REU=<5Gohq)j1GK*eFhnr{>#pQKRyhg3uFymDNqTu5CY zb9k&a52?n5s#$Va#)nq1OrDSP7{uryt&8%J=bpDiLZN0M-qnL}s6|MfmWKYRMoc(V z@-d~7d+$n!5lZ_+^q9N%nxPCK-ZnKuxiSV{vyyLkFhlt)s#ncW5zA>P>we^Hg-Te? zgER^$XPFCm9AbwSvdo7(C1kk}uU8|Xv~E#D?M}qdwuppsKb7(XgjQKZLWL}^vP46r zLgcn+Mb1uWhY;@!XhNumMV%!jhq68s{Uf#o?RCkaTo&3EBu9h_gn0d&5-OGA9xqZt z;^$OndDJ60 zCS>@e1Ckn==#wpwV?)_OyyM_;p=u$rT{qxZaD1pqNN>#QW8`mVVyKnnA(ly@PL?NF zP6&0ew6UBR+Qsq)OIm1<T^u$&w+q{Mx(1K0d;H)nDP0r=|}{SO(T zYUsv{P&G_fsYa+8p5ltC;i;~u8cuOV)iA>qRm0OlsiKDRp34sO>eNs+w?frtYAAN72r&!Sp!MyP;A)$q(vA&aU{R;Wmbw`Wcdl?d_nsOh1FQrtai zdT5mtu}6K3R!k4Iu+Th;>nZC_*St$6Gh|!#PQ9H!U4Q2bJ7;;sp%O|yv>q3DZFV%WTS*V8Puq&|U4YD8< z`?ZWY3epQ%7)tR;d@7!;2(_|gA?7$pU1+CIE`ijC0=+UHidh7CI5g2G&q5vx{W~dtAm(bwj!5$!_v>#>ZcR=Pq{tPv-JPIj;{2fZ@moe`` zRzik{%Y{^Ee?p#s>=PbfiMEH4YI`8RL9)V;-$|+hhg=n_ef9k??W}N$kczDLb5rAzT!cnM0PlrW9Ta$G)iQL3xvq02@;U%?C^3Sb=nQcM~CEu z8-y&=?uHx=IWOGIF;7B{gPb2u9F#pqk^{*LR|@fFR%FCr z+2KtrKkth-K?&&;;*ILF!`p;-SNUd#V|P>O%L3{u-|TQai@M4;JDkAs4r)kO`3l0x zEW@r=lEGrTlE-q1D|3nL+QD+1D}5~Ix)S?`Y}Y(jl2}%_ zlFIU!D_Jb+O~nP_0+vl~Oc{%MYimJxIm^#(Of$>A*Qh$TvmEJ4H_KF423Y2}691=c zMWrhS%fqguv8eaK7KC$H)cary!bL3VeXs@LN|smMeCk;~aHWOi4_7v`95he0tA}N> zD?==oxRNj=Td~NMWR@pf$zXZMl{}W8T`6HnyjGQ7&2pA2jV#x?(#CR+D?3;=xYEb6 z*_GJ8WSxI-C5h$G5>qsceALs z$QFbLSc2E78piLDtvJ~ggJqU0X+o+3H$u{WreAjk%UzI4j3fo&ES3hyVj(#!gFEnk z&0i>0o)j@7su3~$QnU?7^*H46@Q%N!K5`s;PDp|_N{rZVB8JY|t_&x!d=8n8`dk?{ zSOy?JZ6Zk)g7>psj}`vN=gROZpL`9O7mkmioR^81xJmf(W4KfZt`#6v7;L5$P^(>D< zS|E3Y`&l+ZUW3$x`$teJ*+26z8@xNLjU@5Tt(JuoS=5|=dDvi4=MF2vX)Nm8p)Q=m zqRt&whVxm}nZl}YDT_K&SRJkuf-9V;;fJWhC8Vk>_tq*(~Qwj7TY(U5z?+CHKc z+LuW69i%>-!?K&@zHpP2z^EJKk^27ddY17JI#S;sZj&O)8bCe|ga z5lBU)Y-(EaD-#7#q*xAc#?EYIF(~I zoE4)v8}WX~a2m(ljC>A6K97boIY#wQQ#hMr?neyuPg6Kg#)wwX9jLY8YM&$_pS9sO z&gU7Via?$Sx3jzjq3gX*gg3M7bY%z20OSafs+(osQtZ7#dZdWbPY^Q1F^3_Ba(*%# z8z=klXb4?Nelk2pNL64O$E*)0a?AxBvp#Id7?E>2a(*hD%BlW~m@^?yhp}n!*D*rv z8=hQ;7}__UabwiJ(c;Q-#LPrK&${vgg!<5vKFGy;#l+u;>tkp|t4cL`0_4AldES+? zST?#+0-@e`LCJ`FA=DeLjD7)f9r9^YF{8U#UUWs9kF}|YdC8SSSYCGJSje4-+2qQ( zEUzdTQ36?wm{(m{3TcM4yYf8bIY@^qpF=t!Z|)_ZLbim{cwRU7IuX|N=kY&tWedyauJo|%bme!JFI*X2 zCiD5y6`kcPS0=LbxN;`T*RIThB%r0euH3-#jVm=QyIg5v`JXGVv3%>wCoJE&@*5?bfoC93Ax1NTES(U#2CEqnmX9D*x@M$E5oK)5dB<6&B?QOz+E5VN?AWEID#(nlB#95V?q%h1vhMzf3& zrN51wM;h_*@~Efg5^+WXi@NF6$AbNgY9Vqq_%Z6dztP7r>S*;ZBXd8IPmDTR{maM_(h;MM z7Y7(k9HWjY2O6>ai?(a@b4;Isog^b? z4CT`iqmDb{jZHqG<4)M<5mKRDjeL$mKDLoCmQrEeDULD|ArWJukUAmfLXwSYA+=f+ zQWZdsFp~a7scN-{A!U%Gj8c{tA{W(#sY*+`b6jVs4&88X?(Wtj~5 z1~SE{WZANRthO6+x)C{0_6BW>z)8ckGmKm*B4_%=O*cw?av)-+8+}p&=OSnNea$ci zSZHhsA!dd#oaEB$l=I2 z+el@p;+V6IG?o<{bGDJm(g>kzXy+K&EH6Un8rnHV9?J(1>eX|N0+#O})T`$j#VlF{ zR_~+q9HW%w07!2M|Ob`docAp-j{-yi;&L+MxsxOA$i7_ zL>cot$6R7Guq54vuPr0yQX~Hm88Zpe0J+R)5mKw24|y3rv7-X3a$%fowRQ_A$JR3s!lpC4jrCbjwgxqHI2*HR1Spd1+SQV5pk3wo73k^*t zk!uE4LKYd#LaGAKA%>2Fi;WhRcOkU4d9l&X(g(R8sg@XA!GP;D|3PUCC zN+YJ)NDhgzglvS|Wt6l08!=lTON|{Y$3s4V)EE=Pl&V(Cf%HL^89j!~=Mo4#Nm^&5 zm{P8V>^m9vT#QzhO31$;D~$w8#;k;dA*+oVmKI1l3_Cucz(GSY0B>LtWb4c8bo zEFVIse;zejgy37EkV}y2QDZ1Vsp_=9AWI>S8Oc$SS}pPRSZy6-ouN5Wj)!~(dB*5s zp)Z5)fjnoFOpy7UijRQm4&@j6>-!8f8Mfd|oyd3XymJO~kxxG_%mX z{v#o;7@LI1I#XG%8assG`@+ciIK;ea#2+DBN|Fv~H)@2)oHHREMk5R5d=8}3Xc6M& z{HB2>Xjm&PM*bU7mXeN`-;s*i^)|`S&QrtVv-A1((amRTHQgs_mEOf`2MK{MpVvZqU7>z%g?uN3u5Vm>k6i!L z=L$UuNUMfC`2lU;TZUE1YhPYW0gl4-6s;%!jQM9i`yro~Q6DeWUs!wj+bF-#w`gf* z{=Hj6lBaOA@+3VoMtc?SYx=>B8Hb!-N6tSONypIkl6&SgFJT>{5%EbF*T;S_QiXKH z&~yDCA=QA9;ftZ)`+!mG6UygTqs%9_AB=h%jXt5A2aR?iy)mkvcN=3;sXo0is-Jfo z`7Ek`b{q9Vsx;LrrZlh30Z;a~s-Np_fm4S4`?1QH=cN;m!iBy5J zA>&Y=-A0~}-WauYb{oY)YPAaxbC`j@UL*Qsu6p`pZaWQO~*jWuyx6#<9PQEEywmrhfj*$n^=m{cMj>AY@r!7HUX$@ienk zigqL9S3K*gnGGDXjALTV7LIwul}?U%-j!~SdDoSGj`_}&*ooBAWm?=FvaA?0S%~+( zi(%$+DQ=I&nr%Y7Q6kpdCdC~kV$GdW#3=DU^kJ+y#6qJ4$p|wriAtAipZXyq%_N`v z4%x>{72=H&0kc?$+~@ZoCeBPaf%55%Q}gG2%_JdJ0a{N>zps5wgC&ZV(muAYnJiPq z(CWTXr(k8HnJvUyV-|0gvZys?qs^=nsVrIgSfmw>G z_OYn7h2zWt7HS2ZUyL({Sf~|JVow&W(9*EI==eU)OcWxI-7`_vI5Q%|>%)JW*(|CL z$D8>q>bbx1W`hv#cRJo|79zK49&#RUw)&(1qMO}5nFk4*v6E##)B14Q%9a@~MLV18 zY?&ECWSuLJ$})3=cy+eTG8R?mh*`~|>KrjAri-$~)}b0k%zP7_3(AkxvG#ha7F@ zX6&8wF=l}fFXv;-QlD%4I!DQd1bu|Io{N!l2mAw=v69x zqB%y0SJosm=#wtQOfpk^@;T%LGh2u(oqFsF7y=AItoIx>F?$?N>n#nBc z3qe!OR4Hy*Q_U8AzoQIW-xp2KAdUhvZ%6Vnz3igvebS!(~M_n#hyuTd75b^NO8-W zX(kKt$~xaHXHo6SHCtI!S-EDxIaHQ6+sQRcrMR=5TyvomG28hAzsg**k%eYEBo~waV$ZyMk1=nh8QWG;}wf zE6vS9 zUPR0ZkS4R_QkioXgr3k}Yjz5$(gq=P*8iB&m z^@&uiX8mPUy0-;4nuT*nysi9_StLaE53MtQ*=!VYd*I9)Yq1VQN8ijUP8U$iQ0SLHaBzW>fC&*+0CM^3~V*~Sk#q)t>zGm+Fo1DvO;QUMIalk zC_!&*H5-J~YO^484Q;ErUPx~Y{hDZ2xs7YsK0^JzwwaqmOqI5Bk9;2XT{Go!%DFeD z5c$wp_pX`FGT)V~D=4N`TL_^qJHKnT2|kky(73wY>|xpJ#taCl z)jolUFPWOfMY29Wa?B31{3?mc3cCZDuIJ~OxZ z;vi<2m0aq@Q0XJAG@l%Un0>4=DcXZ*J3U`H${J$X z067^k`&v0S%KDJdzOkQG;uBgkFvbebmoaZ3W*SnBwYpe7hMWsIz*>HjjQN>!KG5p( z3FVw<#g}<8l=GohlaLB+#1h=aLq3OD?Ke|Qg%*a;2#{nAv77**>xW5J_AN4II%Ez~ zC0UzUE`!X2{M(9@%a~grqme3TZDv^tp`3MVNJy1NLdPcE%DRnGdE-yWsubewEg`E_ zh&QVYS(}7-PXUCi0T%TXK*$#GLOYU2^_a$mLz|!Ex#8=8zs4JXd%V1I0Gs9LI z%PVfG9G1^qDPsBEl}eT|cdB;Pv#6_}VXKAZXg6lFkg9-Ml^3>luoO&_YpB9jH_N1{ zG2(7=*y>?99r@6x6}I|V&Y2venOMIXwgy-(a$|;AmTbq9C|Fq?wqkFm-lz&Z1j!RJ zMv54FZ^52vSj|46U-ty7T}X$R1JoksaH~hgXagAMNshD@TI%3{*q#SE4XQBB9#T;*~XDR1YldMi56bUHQIxc&nj>4X(qp&CHnCpo;!g`{P)Sl2=;#Z^XdrJ#svfD0-`2aFy zFZmHN)!HfgN6xiqlsLoc^9kJxIMW*R3B^peV($>!OKf+FIm;U36N<^UihQ#FX?Wtv zYL*fh|BjqPo@=!TsR(?CYn7DhTx%1@sP}>7Se+d6`=5B90q%C?s8)%6GVv zMe7DVq2uxeSX1GOm@(3QD_7iaA$g*%ReF+ydu@B?Jmoui4d08I@ejEWaw67(dNFhU zA=mvwDk1bc^-?|f4|x_>-uAA~3y9fU-uQ=f{X@R~hh+YvrBCa)ONA}y)n_EOm${cL z$1jfNkY3CqQ)0yGSx;X70l#&TYKPp)V*fco$WEV}0y)o`xKNHZFPc~f0?D<~S+2$# zC(aX+$+DJ5tz0WxiZ<>zjDDEOw)(Cp$rR*6sUgj{50ETYouwCGKE zehy{jTiHIj0&=O9xR_#UwV_|J1|O*|vkHXB?;PEPm^oGn$6RUQ%@v8bc44)$R6-IU z|Fv?K$b42pvc_Tsj#ban2ssQfS6JOb>a+`v#=D`AbCK0mEmLho+m}GDv|8_!vH_{? zhFoPe-9_Tvm$}+n&oYI7aaUVyEb2~8vDMBpgJX)VZ7k~E%{5jR%M~1Rjn%_KcXMbz zoM-j1RCCNcYmkNR?@-LOmbO&Za4pANYsE_u`v%QqN~{EqxeROGC{>A-#8QV^J-=-pXK6Exq2#mLmF@?$F&}?|V7=m0D#&dgIh@=SHhiNJU^HeoeHh{6?#WW7HSi z=3A>cpPDOVKJ%?cj#1;-O;$60hhx;(d%M-gF%Kdiin-ky#xZYm%pxn3W7LSf*vjUZKhUcU*jE=@ z`5dE0{v}o+$GnAO!Q+ToVwG@=Iu=x0WgPP%u3bEbm};w9NUgU2U9s9LkUOo+71Z|L zICU(z%gPo~75D&0hxZV3mz5`^RyzWzK7%Z^B6XCiR?C3=2&u7ZgjBh|(^{)RNS!wO z7kozxF|}6WN|~w{5;GOo53N3yn<1kh%dED0Wz15@p^!RDyH833#D=W2T7}@bzkIA3 zhODwO@0T%8BPJbkkJZmI3pJb$xz}obK*oHEmA5YuAy`Gk%j8>~Sgas?ob02{30HB`FyZOT@wR7h1ojiRkqCC8{y^m(hA zW7H`6ytRsB)F`^qYTy_(if*);S!ficXH;LXT7*;tXcP^h6)#wuIEF@1ifOYtIfh12 zifOZU2=T_u7p-nibunTly*5mH(b~l^YRr7e>gSkrj(N!%;utk%zHG%lO1)7Pn87hG zTVsUu#;H+slad$8YJ_~VG<2t(9fA#)+0TkR~{A;pj{t(vD~%;mT)apsG|w6Co6r%CVx zI?i{>5c7>y&2kzf3+ET#S!vHuOs)1I`kBW0AFT$Ka7K)_7^(U#qeaHVhViZ#$S+oz zkY(D}NJV$DezV#+W`D%|jq&hzOM6zPIt20%QVm+!EGdw+klj|fkP2-#@>vi0!`k+o zOm$EVo|l3AWfixQRA>_*9gx4RgpE>8gU}uoV`mAG<2=nFW9(d?+<2piA7y|A8D_b;?4?2+M9%U$H9^IW*Oto=SSK*gve{24(8Y+?H(Bu z*axEo)p;MgkL4f;&Fl8D2U#BA^W}hz&-&4x5Lm}^wt$@>q&H4osfe?)Sk#q@I6Fs3 zMZn~oiNXxFnm z#xX&=iA7y0)$R2xb8zi+0qT%jjqNEr;#E zCfQ?;rC{ERZDH6AELY5IYB&1f`XAF)YNOhu}_`0mm z2Ey$Bc_qG^vnq4HMRyzLWsE?GR@9^lk&kTCJ6m<&$J6!PKMlxm^1BSDPmhJ6S7c> zcFaC9vh9qm zQi>tpLvrmxmKw1MG`Rx-dcXR?y`?Nq~Mfwx^TSl&2Q#iX$uFhxlY%PFoDv0Um(CCeSI z)U&L2rG@1kS2nX`WT>)wSc+U3Vp-x!!VcMrCtXQq+2KkCOZ;gn=RB54u9UFMaiyB& zWmg(mremAZeXFbNHkQHDmF!?Krzz=^;=UL3Dm&$Us&iG~)f~BI@@jh`%T@@jRlC|w zmm+>Cv_A7{J6DLeR_z+QnMECC=Gi?gYOUHlyXFH~*6^9KtazN*jinw!_xf+OyQRc*Q!4B&<@QdF z8G@XGm@iZ@qh6((kLn*!R1NQNV^ohVR5Dui*dkX{k9necY_S`oddw5mW1grU^F;N} z5;q^!KTGUH(XOgMEm}%X^;X+KDWawHRByGNF2s8m)17uMi+c0YU3M{xdh^m!dm)Q@ z^HPo7z@px>RBN}gsCPQuZEs^yZ)aL&?-C;4H%Qk&mfM3qxf*-#ay#*3xxF4nE9OI1 z*g+vx0lMdMG2ZUJLbZJayFl-?n^+Kp*NKC2N^Z%0Hv9Wn1g9*5j# zr?7m<@_;>2mZj0NR1f1y*MoK*%P)x8fK(6J%|hz5VasB*O^`;rUx@eXe#9P>F@fQe zVzfsvk9x#T{)F09=f0)z5j&Md9lsv2(^w8d&NPayv2$3Cbft(T+m%X|Yh0;kS>j3y z%M-3_X4&pa56kpV<=TTa_7KY_|5K9CEnD%sn<|;*Z$9R(u`^f>NK>uIV>#265|&x6 zRI^mL(#W#fl{S_QuIymhF z%Ey)EEQj*UVU69)a+e#^&hn%y-7Foh46uCbO8jTC75lDG^)XmdT}fj(&y^gO>s={g zS?Nk8i(2)u#;#}CB(ofwsq)ESDRd=| zca7a9V!UI@8oSdcTSUw*DFOQa1szk? z+Wjmy1?7Bxtv$%1-etPh)^<`$s{-ebh}F7~&ssZ;{1qo<#D@(Wim^%-OsXt z}#9<=mXdw^vN%X9Xauc)jA+NUfV>|~aHmR38HW!OrY&+~Qx%fT!g z?Q$W#F=`9GU@sK1Eb#jIxE6)dU$7g6c-!;^yID%$pxyGy$qRN1OS&sK^yCHE+^IteSi5#!0DkbTa;3S_&I^HDLc+wCkWrqho7n#x+H zJ^Trt)kCVycB&As74O(-LU8Qnvfi;XSyVpn+BrgMwYk_cCm^5q?b2ScmEGA+mtF3Y z(-QD(yImv1%lRXFCyUCt+iv}a@~PEcM(HOY=bd)SE>EUHzO>VYRA@(Fd(B18J$AMb zuNA#^zE9}g`@MF9PtHR=-`Lv!M4bbtAfI`VZ|wlfnULFrjA2nL%D%M|rDzu*=1vil zqf+tu@IE__<-drbnP;C}D5N4V53&NOzPF2IjOa0n`Q9$~39TRd!Cvl@dy%T&?ibRb zsrkmw_7IDjrTk(yen;)<(9|sDce`0gm9`kA(=&#D*qd1FE9Fe)Puu7dy`ibK=zHvR z7PVgeZ#$1gz3EzutpA=;RcNb_^TVj&@Cg3JU&rXjA$0XA)|HNbh`M^|#ax3mOLXnR zlZt=HMgI`>W-~X{h>=(WLvvA2K0&GlkP)grBi@FH>zS^+hbu570apqkCqUv{8O|}I zT=|w|Usqn`RPnBS#bu3lWjACA>a(9KpK?B9TzL>e-xV6`${!F~%Xfe)Pjgubu53Wg zH19pom6?cn2&p_71EH8h-IySRu1I@wJjWd7#+(MBJ<}7qX0;JA&W%|Pp(hT4uFzFA z5_7?AG6^g|EAb*4EXcdm6v#6t$5h-I)M=LYZ%A$@|R%C!h9j)w0%8xQ$DYPF=l<(>4CB0VgH$#}2+Az1SlNgkk7 z71|Xjs}rT497z}AUA3MZStX<@@X}a0Z&c``C7<&A(a939=tOntt{$&xo1Y& zrHJiLZ_v$he<_u?y4#0*rn@o+IsXQk;mWlv=R|r$K2_QR2=(erH>L?P{7kG!j0}jF zI&BjqPDtusRA)SC0vQ82FOtPVsSbvmA1P&_oM|7+jWn>-V68R1x95V$m_0I|pAbXx zpGXl);ytli5cymbS;%rcBm%i4QuDX$v6+zLAo-DOZC}xc*FrKOvm*UMygN0sBN;Ii zQ>QiFj3+j5@8+^dvk-5un;WSfCSz_xK6F22Ze$zF4D>2J8B`eQVM&I()rW5fM}}DF z=#Ycbiy|4rWj-YNkm5+bkXr3Eq#`MabhB)QTmvbMWX8%=v;}X3%#Y;yq!My-q}(SR z;o;h?kv5j4s541k!o>dbDWH+ z!9CU{$eoeoQBr7+YJn_`C-+5C<0(eoPuY%`2O?QQYPI{2&we31hZrdkQm1{3(rH^f9BJcJXCQ`p^^wRR zr)q+H3VAe=KALi_)t-ffkk8skwU8?J$=~Kky%ceUlUDLHM_O6v3MYM$`H4u66nDP5 zE;7jZ+;@*0f7V5`{iv*pz6WV+h$4DQDS<^V}JbS0Y&la12si3~7%P9w>$O!|NcOk(5KFL{GqT3Xm<4bf4S@ z*&12SLVNgQkoO`DEVL)ILOzJ39VYWRi1YaC!?q13AIT1zh%xvD2u*b{!1h>UbbQhWISSijg+#`Xp;>2Ez&8ZPMh!%R>a_U zu{#nQq*Qg|cxxXT%979jPQa*o2+F44n@KhaQ zVxj?E=G=h#P|m}m)htgy(omn_(dLkh*@AY_C@~_cg{8c}srHE`uzbl9h(=geUm)*t z#zpg4;_BsCw{NuACtEQ3#Yf9oXw>=;vR|}`r3811zkrO14hgB%ZiZ0I*l5I{`qXNR zAiE$3L?^PW=9q+NmykM5-N!#DYM8PWtF!SvDcr|DBwEa(?(8Q;n|$&NV*VZ7$?`f< zy$%URGi{mAW|mMi$0zS1#)$5U$QpjYF?KXHD&skJQBtedfmQRqSk31W{cgQi(E|&AL9^jHchH1w}Cnn2$+8}p8j*n)ttbyDD znG|hgS;~?YO*vfVJR9;~#7vHM3aQm5orgO@ko0I5%RIysLr#h2A0f*+81*?8^*J@# z%3?z%Lo%W}gveD5mv`dsb~NcoS(aMoaC$V|C$!EXGg{!2DJbiVXtj`9cjZG?w25PW z?nTMid#6VODKcl08IbH~KFdhdnPPIH^**7P^P^oX2O{Pg)bKyi;88N41Mu5PLwzoa z<_f6_9E$y!=Bt-P^QDN9|03jbNwofGO6ASxFOBYEQM1$8(Trn6Ow3WpXAV-$jphoe z(rDzr5mFd!W}%UPA>{I?mMU{rbJ{DT1ybV9=K2&zOIQjZI@bFYM;EfFv+Uw%jgYE< zI&&$Gu97h^B}lajWfeyogj8rtAZsBd(LR<dD>W*_|v|ot4ez>9^EAyj?6R8#Q zOQzqWUAITGgvhqjOr|QD>l1p4?T%=Hlz>{VwJ2I71n+6TTCV$A6fNbLVfV>*qAre> zbIiUFnrkhNR&z`O$1I61=a}&vvn1LeMROnns9|-qndNxMpO8DFT|S9D3v1(}v6HA> z@(H8SkfqT=pBxIgJ6a=TnYQ^dJf#I$5luNkZqp3pd^BpfGCEO6MPMf61Kc%R8O`9B zIS|_JtD;#Pa|48WY*jRuV-|AE>S#X4tl*f{(ISp{h-2=FmIZAEWysMY@MGJ*^zm)r;Wm4Q<%6-vlDef%yzGxE*&2nj5+#hZ637us>5N-Df z&4e4GT`VtOCR_SobU=vr+j%I8ZpUB8h}Yl2Jx_d_`(anMLmq)NDjEGA+C?jDT^aEu zWFp$`%4pR;YoaM>vN!hIinURQSraYs$uvk)w8kgrKpu~_O{P?}+8}bi2(m7klrAN3 zf2?*HWPNnksZz#4u7^Au)uu?XA(fB~(PEa9A+?a_qm3-*bIitQY=%r#3R#7iw&-$} zyC4riUWzU}O~yP5c?z;AS~^wA(~wsnuST0#UV&`JZ1A<{dLiC+Z;!SLsngy;Oea#c zM|b(;J;>|P!0D88oknkL{S@*>G*d{G`z*to(QFp=EW?}8JeE(8GhHiqD_X#^3qt$G zThU^cUm@Qh=eMJ!EC)V-cg_f@WH}Zx1lb&|W|;yRIfG;s%M5JOv5+m%29~oCbC{53 zDcVI43-V61%_oOLwnpoxQA?||YY}rSjX7Byym7)_fla(2)DK8zOo2@%O~?8Uqx$tQVIDw+TfGB zAm2oLd~z@3+vtE#9)a{l*PkuR`Ww$qJ`MRXI^dIyke{Nd=Xf#gkYA#eEH|U)-+}xZ z-7KV5tAxA{`7K(0E~To~Y9XINevc;SNO=JA4P-DHm?`CP$WM?zq5~|gkUt=QMw8Ez zG3}7y*?6}`bQQ~1$Y{u(XjZO_`2un^AE&q6U>ki(qKEIp9#Amf}s zzD#A!!M1{ocgk6QLd@v1@wQB--X|u+bcR^|Ld=N}+c9Rzd`3Qq?*%{{CyV9gd_2XD zs|SZWIV}4jW;$YyaLQRiknjb#jErUcC{$I>jlwO!lGb)eNVaMUB{}ImL6lZAw?;Pjf1z1k}BN)0}D+^@Wbp zoK-Aw@5p|h>NK!C#r2u$G_y4G)6=Ir11xlmD@P4acZOK#7`IqRU@p~%XWfuYr(1}3 z+?nR|v8Yy@;WQNP-HJ1u7AfxDa)#5!qV|?EoK642;elF0JIcXDr;;RIR6|A1?C z*jr{e$t>?9=ckY=+eu~l4)TJKbe5QhWX#!4CQBlOV$ODQSdQeFbDTVuX&iHoQ^+!# zW6pJoS#IE%bDc64diIv;ljBsf&~s!|R*qA{vV`-Q>8xV8pYxgNGzyX1y#uMvbCzF8 zJ?3rq^PNT(wcT@_rfc@z?zv9lJd!%?DdfBb`Q$noEcDgO4zLUj5&wGA_cI7*{EcCo5#msW@S?GCBikamUvCwmx z)QU@;5|s)uG-_Syl(W!t^b|AOS;#`qgi_3GXE_T!6G|}!PCW}f6G|}!P7{lI-t#hN zJ&StY^D?K6MLice$7yF#&qdC0wy~&ZFy}g5Eb1A|xlRwu*WC6(r;ml6!KAhqI)g0q z8~h*Szm8TSw;=rne-RSTvK3o-59D$uf#oAe;2e@5%U6&CAXhjMAr*liAweOj9P=mS z2uP8W#xY|a##x(?OpbZ=UCh^Th2csko5e)TBX}n3N+*wnj;C}*=qjf`hMc)U11+6MMZBHS50CN%F~Sn1^5Iq?A!ig*FX2 zUxa*0ol2H`NCD(Vr=F!4axG-Ovx#LsWIp63C+lX>&!RqeK+2phpU~cNvoq!vimB7? zM5?s%kV$`|ttxl5}TwFi+i&3|rl zcCxfW=xwVDoPu&0^9E!EO0RU%D`b7TIo0h>jSx9*&=ZAKPLq_tPl%yk!9r&}3+-cc zw!YA56(UErM&!KES$G@e?2T-ToK-ApWLxZ{FQ6FjO2uL)Q;7FW&0?pFMLkoq*r{Yu zYmyf`)hbn^T%WnbX=EAiN*ha>D?3>7TomM*~EF&JlJ8+J`buFiiWh~@z^z)t0LY8q5 zn#JAa)Ua3(n#JAa)Jt*CSeH8MeL{QYQfHGCZDcpDZ6N0wXGln$b|mtlYfa0Xq}%1* z@;#n+pgn52(_BS@dt``t6{%J@o20li>N;n$5N|8jIXk7e*Q4s3ektO5)SJks&WXQ6 z>>CH3-@dqhl{5bw=_4NjqqakoW- zQ|gl-dbPo6_DSryxZmw`NeL`O&h#yO*g+HU*D>OG zNFwABC8OJqh|%`Pc7N0rb$s{aHKd|nw+b9-y*XoGcdg&Y2b`hviC? zPTRf3$zv&l&~LfLDHI|{<5?){S*KlyHyS_Z>|jx&@dl^iE~<}r4!gnW5rStqk#iyP z+2HiCoHaUDyGqD_6m2D9N`%BOrF`myR6trCgJlh3mO?feCyi_TD$0Ocu3=zv*PNs9(XG zPA-f3rM#(rDekZ7O($Q()M_uG&h$2bx1Dk!-X6Z$sqx7tsLy7n!6&_tt?EoOG7&Ayn1}P8Q3alVv_1Iyo$(@a#6_^P!WkVvy>mO~bSxIoFl-La=TS@*8^WV<&L8?4MEy{R+CBF+#kN zw%f^&G48Lj+bI&_jW*p*n=fXc9K4mn+2NBzAzwIsJ~;}q%Sl`&OIN?sADkcyy=jfU z!uf*}VW~k4=}m?|I4LaeMP!|Sa3)F-H9Q?T|KODRWG1BFX%*t#3H{mGB*goj{_Jd% z5~s$opPeo#F%2kvDc+Ltv$M-5bCL7U&Jas8Vu~TZIGM|-T^%tbHwmd1Qmdu5YT6>m zfRns}V(`9q#5@G~)yb|Cy&+oB0{P9!_elq2(5V;F8>5aFe>jaS>Ui;o(;_8K9WVZL z+Jsby(&>2dr<1;t%Bs*_Md_LNQr@3VrVwwN{^jHesnfP0rVFM2<&;SYd_{G}D6z+> zl&J#0LukF<9;cd99e+Tq_Bm4h?X(N=e#_c~9X_FvR-4c-C9rRk+@>)T2Bl~rNH6k< znGm~5^pBRxGHk*amRXNzV(%S3VMs`=_7wIXs^Rbn*{fwsGdbts6H0`5Ege3gT!^e8 z)o1vGYM;=Z+1LrId_plJCp7wmV)mJ^-X|0jH=)fZ6f852Z}VlqF%v zgbn3DtE!MWsXwzt0n-JpLO=x^y*LA(Gb3UKX_ITWX+)uCTI`8W`=W{;ibAFZh zlvvBP#vEi4r36SyASPszzmP=qb1Ed(UlAhbK@RfQhsd>%IDe}YwQY#Ed>`uX50N>@ z9OjQ(B9^W)|A8Ft4=9mW1I1raJi?zWMZMWf^mBwijWT+j#``lU)1HJoNLS%q+^TRR^LoRgX@96ni$R+-iXZDx%1R(8@EPs;}Z(U4xTb+SSFEZ2pEfJY( z+{{0b8Aj$Be_KQ*&)*@%`}LRS?^ELb`pfeVDUrYa_QidQdH(2UMTP3V9U(XRV?$&j zWQIR6L=J)6S3-LVuOn;k{ zT@%C^&fR#vdzQbKM88dRmVb~$zw>jJf0#s{_nYM(B@z3~e`BvT%Rf${_nEW&(e+~N zyC&$j!_D&hNW?kwvt_GT61^9l<&PuL=MQK3<4N>hbe2DXM873&BznI(%b!J}_p7t~IV5_&I?JCY#oJnD z`3t0YXM|??>q+z(p;`V$5`9K!mcN-K59?igpBDPNNXlFpAZc`EjAXMbvCoNhvDo*w zS9Cu~BtciwNX~a9n`Evlg(OQ|sUX?xNxDIj&GPC_nBr_oYhRpHDJ};Jz zzuFAB7Eil-^(`lm_RH9;Rs%=71w=wpd_{&EuixtQm#A<^GE^Zbn@`cp8^ z-%6s7CFc42N%W^+o`0A`9~I2=M>nWXoZiCc`Qu3RvBW%oB8fiUnCDL>(cAnye>#cY z=I8kfN%S^9&)-3!xA}SgQ6*9OSYn>vctO-tZG4Hlbn-EW^ZeN%ay#S>f1MOHtK!(W z*xw?h)6i#oiv6)KihjJze1AZSmznRch{!DPH$-F>_>Gss`?=d6FU9NUZhvt^ro>+# zkty+KHhTStU-b9-b3;V@qA&9ogoyY>f1kfxO1ZHDzhUQN>=ph#Dc+d32 z16d7u-rw`OTDoyEzQ6FUkC*(>Z>UyVklBRH%l?#RA>Pv8@MnaGSbDQRM@pxmj{%nX zdr0*0#tMJxGSN?`p^q-!@u$7%i8z*c-=8I=)c6TY7f-f!_zR?XOJCzJ4iT~RPJd;H zi1}ITU!ufkyr%XoUH%4=^Dk3xI_mN_ksN@Gc+*jrza^v}@m8fSf43Cxyw*qlgypJc zeO_ywKbu6q>1drlx2{{qOatUx$bf&4aD#$T`;gF2@);lH;*DjXjZS%(j7D!p>`vR@RNRJDY zlY9>mBRwuqMe>*E8P{$S19c?(y@Bl+*MJfO4N|a3 zK)1})8oPeS6KtsYkWy+Kjh_F9R%Zu>rFcE32YemjbC@2; zk)ksDUx~kW6R4t${yxnJjFaf^(`kYHHKHH&eR>F5Wd^2o3h|b8X&_&Ux4te7w1s4j zL947lKV|fH<>i5lwc-6t59CSl`k5YR4ata_uL=xMMt|#F9mwiZBh}w}*9W>t^tawk zfxw3Z z_cK3`B}FYu^s^w)LK*!l`<{T^En1ZtCu5x^VWjs3Dx@ql#JHwH9teyoaktfn1F`GF zm-TQUPl{UB|K%#&7E)5is=--t~0}Dv> z{WePj_KtCk5i26;7*_lfM;5b_bEIZ#CMWfY#2ge(t?kcgwx-H`tV@;+6q z#L=lZtM*=?M@p%2H~Km3Dm;;1RmB*ps%`8ZI&MP$6s z>BoUKDc)Y<<3Q{e;h9eZ0V!VQ(?Cf?W>a8EL}pW9BqVbwM)7$dwqNw@?Txntib(X{ z_{+e66jkB1Xtg6?Y*nrFUSe0ENJ^>k4#r-9%y)rSDXP_6$Z(*CTIqel4}tVAML*SY z4{#4Mqk)*Ogwz@zqMt_~zXVE1#J14{84qL+sLTK|t&l$h9a7Y?K7s6QPTnRm3w`1m zwAkkNF%w8e&}tBweas{&of96zU0!Q(m)Aa~P4diV_$D6}l1ifAhV(Zxog^L4L5ue+ z{msOJ@UL^91Df$X&ksF9wE%zYTuQ0&k!Xdb+h!HX=MeE5%{E6!CPd?HBxuFVyj`N7QsYNto`#%e z4wD>-%!`nzX7<-ABi`4v0&=F=OL7iLx|unoGFL%5k-5+uC)tgj#j(~u&D3v1rq(!M znYz|?iCHJ5)F?%(9<<6dN2FBCr_`6>9*;}S$=|A;k3}mnip$I)DGPn4Ld4!U%N!xm zf8Q$093#=&Se9vgC;D0FI}feI{A8Ivl6+TUNgi@#GD$V|tEyFk61n~Kq2?^JUrMcf zFV;@TRc7-bFS(LWveuOnk|9^>NZj+!W;2O<{@Lsz*?YMj z*8s_3u8ffcT#5ZZHHtG_Ng`P?SC1==aT%kkX4{p?BpAwR@U8y5+uNRoj zB)7YnE|Mx&21u5PgOXrIp0Jeqr{IxYsYtA(A||mGP^p`A%0ROQ|)Uh5U|pm=u~xBrif1uEjMDGbKb` zgUm70L*yRFTr-R04Yazf2Y>6(%p+-q>~}TpAvcRcG6P4v@gOovz0^rjh7=9yD`F^wJlZMG^fxVlIftJYrTUaVxAcYbc|8t}I&+v>>3Zr+<99hycUe!E(Mk-xtS8I`QmT#rL(k%k zNl%;Yl+jCn#_W>fE$cb6N40X#i#})O{Gn!5Fa0^QP>HXU*2Pk@h(xcQrDid;()BDg z9NKt?DP8?Bpn&VOy z`ff%);?AqJW^|NTR;jNXQh%X| zMj3r?&xhtT%IK@EADLN{5l>Euzoz$*nM)ac9d?~rM53?5t}_= z%__=>XS>AMyUit17W$sWNX4&!^=1QQUW16tdb64O(bsb~n5~r2f2VJQ*+Ch7{%51v zO_>jI)=1pHy3y>TjK1dEV-84J===CYoV!4##~h}NKL7KvIZFNL=f6HSjlIO$*)>6* zL;J)`kW%W?f2Z#gGe8-A7VA?pnKJq>kbY{WQAVGg>os#JqyJ`NuUQ~Pz0X0MS=wY4 zQAR(Dx5+G_%sZH|Kd~KtW>!$KTit4=lIU%9tC>!%^tQUy%%qIoR=+f}DWkX5 zFU>qD-nROcSwI=Rt$t+|Q$KoJ9WYBMqqo%ovyw7;Tis^XP)2X7+st~(=xueo*+?0^ zt!_74D5JO49cCM4^tQUg?4pd`RtL=?%IIx%&>W?V-d1;-Q2+Qk6Jr=TisSEHhs+!)-nROUStzC2_zByyIG^y1 zS*7}Mx885fCMn)|zi&l!m*QoH&BBPx4`yXV<_B{iA~Rx+M`T9K%zeX` z^|M(Z#aq_TW_v_t)a;MQjGDGDyq{mpX;Qp?elhDKGGk_2L}tv4oe8=v`nnYh)=5!4&&SeF4fd%_)K#db0+JHUI#9NX z5@+?Fg`64ek)m3?4M`8i9waggeQOU^&ncW2oGhg?Y6kl0K<2#Qf)H5;IX~DPBAXx= z1al8o%eoD%zJy#D>4%A))zYgW`N2Ucoj!dY@|NH*i9XkTOK?ny zq0e>S8qAt3=f}|Jx^D}%lIU~Yg~9m4MW)o~LxuHN)|_AtiMX00WNxsPWEh#1kUN5d ze^;&k_BO8gK;{SYk5F<(qNU8#l~4^ z^*^*K3l4|0ipkyESQyMdQugE1&!h2 z2GdCNY&;vBro^3%`d}l8o{go!nBzpx-fX-OER>>V<611eG1yNcW<$s;!IVTb_Sum2 zXYOq@1uIF!Y|KXHwcrqmn2j>X8^QGB!^gfXm@CB_`?6q*%D8XNSsrX7(QkcO9_%7{ z2tAA6UoF8Nl6uG-{I+Td_LD4{hx+re@YJ*)2qTcwm57wsQyyn%k&gCivESo(hR_4_@3XTeSRlolpEbepkc_x`yEd4Aa(IPZ!Fm#1;YYz?5?$f?;HY1;QWf@K={>wk24gGVWU55-g%t8Pv~~ z-~y8A)X$b+1&MxM?~7m+$$Nj|SOeGEz6dTM(eE(n4>pkKW6}O#Gs!LJSv+&JHP}jW z7exFX+#2j45%&!Ij8S|U?3PmM6VLUJOX*V?cNAX*hoyKU{VHf%YF70;e-%t2sk&AD z7XB)jPNJU)9SBY%(a(eq1hYwEEW8OEZ;aX&%#~8=t3u5ON-0nox1R065+%lY`0w%f z-}Ydg6tBV^!G0;~&E&@+vm=;ci<gLFXlw%Vjr8%IO7Lwr`kX(HoY?b_c; zR^r}4y1$jKMBYLABUBP|KJi>ycZO==o49CPc(vfjP`dQ{v+r)!j9RTNz4>lW@E`3FA84DkixL z%aVUz#_E+)YAk|?%n{b;)bMo?Z~0D_;;xH$YqAo#F8+>I@m4a4eBUYLNGmNwj)5Fy zWrau*TfrvY7Ei3vTO1>entxA&JkUI3ttOhA+Ygr26 zR)-Yzc7nehgu4x`UMb%8e2O)s#GS)atT82O4zcu8thjT;($!O1qMlQ&gb)$?)zd6H zM8rE|Q>=6;-W*P`N~A0_c239JGEw1FtMz=*bG5PmyLdtkl4=c;BtkxioM|;*ATr*! zRhrcrB0nILX4PFNGrqIY>VVO`jPtE}l1p4^B$)v@BpttQtY(rsAxGRGq?P0m$O%%~ zNtWM%d+?@;Oc%)u$SlCO`T16l68R~xWviNtL_KQe&xKrQb^KFEt;(op|t;7(?IU8?3vrRvt+vWH+S1Y9yHf**6dO9$4*CYK=DbS@Z90+-ucP<`jq+MY+{Tnd=~;o^q>)GLKN^K5LLN?^8ebS+RMl zo}Valzm=%OnDl|_`F<;fGL|dTD03l1)N{X8OqrV~^MF-JnfoDPTn|`nQmTzS+>7-) zT2)$!H;Scuzx5Vb)1-KN$VFDJ5_b=|$SPDK_mH=u=S5Z}iTIWg@`zOzBC{b?R#S-F z38}U^q|exHYe^YC=T3Q*Ncz5F#(4)qky)5P1{wjy3sqQI8te zYRG$5{A?kr=8qunTZK|;jiXO9j2{D^T4Ny#7?hm1O{I!Ju{&gOpe^-8OWyp+ojP$jY9U|hLAwyP0i0r^yTfeayLu4J6HEgwo$fwBs zX!V51C&>JtH5ejaK*p@`5Lt&-yRFz#QM0ON2$?85DMWsT>}#imh;b8sciUM~yxBO= zE>ao!E|grH?K#k1pfVGRY3&?nS5l@DBAzQb&|X6FgqvxVqSnPkEbBl!aIdJa))4FB z5XeDxMwyb`Byo0)lxpK8^m7z4huXe!k*PLTik|U#Kip1|qDJaR=I?fHh=^G|!Y&FC zF{?+}6(J&K^;mmJh=^G|(Qc8V-UlMqSHSKF5izTl-5(-iR!^}yqRXWEq{yCCA+#hG@ql+Fo1i`l>@67}NVS`wAu-UaoygU_@Blo7JBSM;1CrQA3eJ)ebfrP=k=N`EfS zv74z?Gv4@@iT5p^W4DLM1!$FScT+39A3N9Xr;LzHWX`jPLgWg_`Sw^yKi5GnuzmN- zt;LstQQQi-$c`h)BDvU3Ai1985<5ULljL7^DoH8HWp)Nh70Kmxwv=i^yvcAbmUV@l zuQGDqat~y>-Ap33=Y^0f?T!jj;bJ2JGj<%FugtMyA5bFxCg3B;Ty1BPoQjN)Ywg?+ zc?@!$Jx1~mWR^f~u^>=YP5~ob4!PMLqKsI}VhtA99hG9~>i2s)n3^^Q`yY0kB)zU?)1js#h$zmmMQKr;RsuAMN*uAzLB4QtY zubmnqN$97{&I=I^xzDZ-kyOb2cDoYaYAj29P8Zn&B%eSoMP`vbMA8otpYBEWh!k&c zyvQC?;(l@$*)flanmeO@bXz5m{OL-vlwDE!v%JX8lj41rtL#Q83ym`_R!d)Ow~>f- zk&Ox$+X=ODevE_G;K^}FjUD&6k|QAE8b_^NET!5ALS`XTYiHDnjN0=TLms!YLPVTx zuCr@M#AoLoWS+F^L!<(-#9s2G>L>Mnoc)G8YY&rr{{;R!fa*ac6E4DLuo&7VPDvfGrnTV|u3^^C}n2vT{vs*~?@y}~^8;QQ^@tWPC#6A9b&F&46A5rt` z_F#zo25Gjt>%}O%>A+C?PQm<`d-+je<~h|D{7>r%0-YU6oik|6Ke!&1CY<$Lych=~2zdv?t8a$U$H z>aQU0+W{%Hz6FotFQuTLb~~A*89ggWm7>NqRc5+L#MsjztL%&huV?w|#?F!A?SEF= zX)mbx(fglHyHHB0A@(*Gp`W#O;fo?uD)&g2K|Zu|UsAFf^$7XMPH0rJ5ppGDojpJz zj(>!7+s!YljQE_2R_pBruL@c0)6eg0u&b09gXl+`ecE6*P-g#5Ev=M^hlul08|(oo z-ua)6c1Dxv+55fov0W&|TNfYO#ZtjBzpW0m{x0CeRJyN`SHraiYxeu9pci>&GcHlKJiZbIllF#gXl6N7u zVdHbg5-F#5_^)ZcHj+B&$bCc$URur zRy$cq)Le*al}ec>MFz*uTkUkptbyDoTh)+cW8eHJ-v7MSULwUC*H*hhN|`aS3um#S z#j@;Xv2-u^u#=Uz74EQ8DWfagVW(5(e`xhAD%@c=k?0C{ z*ez1LdEQ~SNhvd&5AmcVW@Cq4`CqYgFEeP@NGUVULuMm>O$^!{QoK+1PP-?f)lR#Q zT3t!4cG?3GnO*h}W&VSVI0LiGHr^IX_j>-?j*;Tk^R*o(rOc>CtCuj+ukAoYX2?#a zOan5nBQs>DOYwUC#?Fjr^^KiPt=g&PZ|qzt+oHt!65G$Wc7K~(J5gUD^A>vk)*dF& zneXiO_ro*a**#Lcr4QTvQoL~u+k;Zd1Eg|uB;~fH!eOUv^QIPLf?q&E`6Uo^m6Ict$O^{R3 zYCqOSat~xG_N)7|9+JmMV%VURg+?C!p350%bpY$=7UQZmUPUGyGLhx37vha#63Y*f zOk^gpN+}(_wEfgKV_KDS#{ESRClpABE|a)zlX9$%6#{&${fa;l|=1^i1#cV#yX@_8@*Uo0eU`+ z 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

    dRfRo6H&-O6G_NG6G6y86FJC06EVm@6Di0* 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

    S>iHS|@46sMM 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%0Dbb%>LJ;tb|o`Kp8Evufeht>W*BXmS?4^&TB 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%0A{4Qko^d0b`ex!LBAWYhRF*1EWi7u)hrY#_Gf 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 z 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 diff --git a/CHANGELOG.md b/CHANGELOG.md index 057e837..d2e922d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## September 3, 2016 - v2.0.0 Alpha 1 + * Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1 + ## August 17, 2016 - v1.7.2 * An attempt was made to prevent occurrence of the access violation exception in the `CallFunction` method diff --git a/Licenses/chakra-sample-hosts-license.txt b/Licenses/chakra-sample-hosts-license.txt deleted file mode 100644 index ad410e1..0000000 --- a/Licenses/chakra-sample-hosts-license.txt +++ /dev/null @@ -1,201 +0,0 @@ -Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/Licenses/jsrt-dotnet-license.txt b/Licenses/jsrt-dotnet-license.txt new file mode 100644 index 0000000..254be98 --- /dev/null +++ b/Licenses/jsrt-dotnet-license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Rob Paveza + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 60038c4..1802f54 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 1.7.2 + 2.0.0-alpha1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -10,22 +10,42 @@ http://github.com/Taritsyn/MsieJavaScriptEngine http://i.imgur.com/cbiHK.png false - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host). + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet).

    This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - An attempt was made to prevent occurrence of the access violation exception in the `CallFunction` method. + Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - + \ No newline at end of file diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index 9b71b05..2aa6bbc 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -1,2 +1,37 @@ -\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe ..\src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj /p:Configuration=Release -..\.nuget\nuget.exe pack MsieJavaScriptEngine.nuspec \ No newline at end of file +set project_name=MsieJavaScriptEngine +set project_source_dir=..\src\%project_name% +set project_bin_dir=%project_source_dir%\bin\Release +set licenses_dir=..\Licenses +set net40_msbuild="\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" +set dotnet_cli="%ProgramFiles%\dotnet\dotnet.exe" +set nuget_package_manager=..\.nuget\nuget.exe + +rmdir lib /Q/S + +del sass-and-coffee-license.txt /Q/S +del chakra-host-license.txt /Q/S +del jsrt-dotnet-license.txt /Q/S +del cross-browser-split-license.txt /Q/S +del bundler-and-minifier-license.txt /Q/S + +%net40_msbuild% "%project_source_dir%\%project_name%.Net40.csproj" /p:Configuration=Release +xcopy "%project_bin_dir%\%project_name%.dll" lib\net40-client\ +xcopy "%project_bin_dir%\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ + +%dotnet_cli% build "%project_source_dir%" --framework net451 --configuration Release --no-dependencies --no-incremental +xcopy "%project_bin_dir%\net451\%project_name%.dll" lib\net451\ +xcopy "%project_bin_dir%\net451\%project_name%.xml" lib\net451\ +xcopy "%project_bin_dir%\net451\ru-ru\%project_name%.resources.dll" lib\net451\ru-ru\ + +%dotnet_cli% build "%project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental +xcopy "%project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ +xcopy "%project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ +xcopy "%project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ + +copy "%licenses_dir%\sass-and-coffee-license.txt" sass-and-coffee-license.txt /Y +copy "%licenses_dir%\chakra-host-license.txt" chakra-host-license.txt /Y +copy "%licenses_dir%\jsrt-dotnet-license.txt" jsrt-dotnet-license.txt /Y +copy "%licenses_dir%\cross-browser-split-license.txt" cross-browser-split-license.txt /Y +copy "%licenses_dir%\bundler-and-minifier-license.txt" bundler-and-minifier-license.txt /Y + +%nuget_package_manager% pack "%project_name%.nuspec" \ No newline at end of file diff --git a/NuGet/readme.txt b/NuGet/readme.txt index cd12de2..3f80d29 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,28 +1,28 @@ - ---------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v1.7.2 + -------------------------------------------------------------------------------- + README file for MSIE JavaScript Engine for .NET v2.0.0 Alpha 1 - ---------------------------------------------------------------------- + -------------------------------------------------------------------------------- - Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru =========== DESCRIPTION =========== - This library is a .NET wrapper for working with the JavaScript engines - of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript - version of Chakra and Classic JavaScript Engine). - Project was based on the code of SassAndCoffee.JavaScript - (http://github.com/paulcbetts/SassAndCoffee) and Chakra Sample Hosts - (http://github.com/panopticoncentral/chakra-host). + This library is a .NET wrapper for working with the JavaScript engines of + Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of + Chakra and Classic JavaScript Engine). Project was based on the code of + SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), + Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and + jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). ============= RELEASE NOTES ============= - An attempt was made to prevent occurrence of the access violation - exception in the `CallFunction` method. + Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and + `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1. ============ PROJECT SITE diff --git a/README.md b/README.md index 01fe38e..3bb968a 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,13 @@ MSIE JavaScript Engine for .NET ![MSIE JS Engine Logo](http://i.imgur.com/T3K5q.png) This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). -Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee) and [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host). +Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee), [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) and [jsrt-dotnet](http://github.com/robpaveza/jsrt-dotnet). MSIE JavaScript Engine requires a installation of Internet Explorer or Edge on the machine and can work in 5 modes, that are defined in the JsEngineMode enumeration: * `Auto`. Automatically selects the most modern JavaScript engine from available on the machine. - * `Classic`. Classic MSIE JavaScript engine (supports ECMAScript 3 with possibility of using the ECMAScript 5 Polyfill and the JSON2 library). Requires Internet Explorer 6 or higher on the machine. - * `ChakraActiveScript`. ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 9 or higher on the machine. + * `Classic`. Classic MSIE JavaScript engine (supports ECMAScript 3 with possibility of using the ECMAScript 5 Polyfill and the JSON2 library). Requires Internet Explorer 6 or higher on the machine. **Not supported in version for .NET Core.** + * `ChakraActiveScript`. ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 9 or higher on the machine. **Not supported in version for .NET Core.** * `ChakraIeJsRt`. “IE” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or Microsoft Edge on the machine. * `ChakraEdgeJsRt`. “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Microsoft Edge on the machine. @@ -123,6 +123,7 @@ See the [changelog](CHANGELOG.md). ## Credits * [SassAndCoffee.JavaScript](http://github.com/xpaulbettsx/SassAndCoffee) - [License: Microsoft Public License (Ms-PL)](http://github.com/paulcbetts/SassAndCoffee/blob/master/COPYING) Part of the code of this library served as the basis for the ActiveScript version of Chakra and Classic JavaScript Engine. * [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) - [License: Apache License 2.0 (Apache)](http://github.com/panopticoncentral/chakra-host/blob/master/LICENSE) C# example from this project served as the basis for the JsRT versions of Chakra. + * [jsrt-dotnet](http://github.com/robpaveza/jsrt-dotnet) - [License: The MIT License (MIT)](http://github.com/robpaveza/jsrt-dotnet/blob/master/LICENSE) Part of the code of this library is used in the JsRT versions of Chakra. * [ECMAScript 5 Polyfill](http://nuget.org/packages/ES5) and [MDN JavaScript Polyfills](http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference) - Adds support for many of the new functions in ECMAScript 5 to downlevel browsers. * [Cross-Browser Split](http://blog.stevenlevithan.com/archives/cross-browser-split) - Adds ECMAScript compliant and uniform cross-browser split method. * [JSON2 library](http://github.com/douglascrockford/JSON-js) - Adds support of the JSON object from ECMAScript 5 to downlevel browsers. diff --git a/src/MsieJavaScriptEngine/JsEngineMode.cs b/src/MsieJavaScriptEngine/JsEngineMode.cs index 495b99d..84492db 100644 --- a/src/MsieJavaScriptEngine/JsEngineMode.cs +++ b/src/MsieJavaScriptEngine/JsEngineMode.cs @@ -14,12 +14,14 @@ public enum JsEngineMode /// Classic MSIE JavaScript engine (supports ECMAScript 3 with /// possibility of using the ECMAScript 5 Polyfill and the JSON2 library). /// Requires Internet Explorer 6 or higher on the machine. + /// Not supported in version for .NET Core. ///

    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�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%0DUM827xxU9P%WYnzkYEv&Q7ib|J&WA5|Z zCgI-Z#ko%96nL*+0VAV=T2TE;dDY+tc189l2xAv!bKwY+{mkYi3Znmz0 z1839_rfxFH+J@53wqQe@U{-dE_2~#_>%%$rbM4y^M(kS(4ZhYkSifDW#I&w62eg1) zmch*7u*)-;IUIIH1~Z4luFPQOaM)ED%pAb9Pp3Hm^$r`quaE)O^(wr$6wViOsr{zj zs@eju{^C$0B!5L*SOmbA9p1|uz%ZU0+5Qe$W( zm0r)SMEth7mgSwtz_Ky5Wt{FbF>0*+buhx@ai$YnTAEdR)c|Ac8>_iHZj?|V(Qj(E z=)=1bEhLt7I!sz$b2RN*Rv^~%yBSt^H>loMy6)hw$|GlD(H*=;K|a0~?R}}gS^m!u zg){kSTtmU6x&-ro!2GIqsRE&`FG!7yG@7~%-o-TKmJQzfiJ0C2r1^D6xQ?Wmp$YC+ zH@c`xjjNT!h<@#y1%?N5lL6*vD=bIJhrr4FM zwfCDtt|la;Hv6VcIMy}(e7tVy~qXU>H7TeAA~VqUTmX8+_;&}m-*o> z`n2XL+CKWHX!M0^l}UeDy>9?xfMWPSo@UYZTVGuTu28QAHB*c^4_)`0*wen0$XL&@`WVZhFa+5aX>tuoHLq1uQ$aD-To3vB2Y`+WYC(D?ez1964(SFVT`MF( zEhx+r()Br{8-;Y8kOZ}$urWx?@6OTuML`B=-jIuRlVV-3Sb|zm*o0W&O0AHyK44L00GvV$mrBzgYrMIxc ziqd1$GgCh%pJu|X{@v?Dx7}$ROE&HHw1nW2)n|XsD4lwlq9v{R<%FH=YRM{U_I#4n zofOHceZ`TiWiryJGN#;~06W9d6OQQ!?uWJhY^j7%5o@=jlavi3+iTYRIWND@TVZ_(9d{dC7buAb1 z9$$1H)mn7BaZR|AOkgjQzb~Vl-m}m1Wt+F>a+o&^K7yD}wt*y`J!kfj$x9?=!$^8p zC3Ai2o?L?UTVP_~EN-y>2oCF{JRrQt(zbr9LNOYPlcl(l+xYQ;DY+e|s}m6(_9GT9 z8Y<^;Y1|?3(WG%Fj$9h`yHfm{;^c0e$w&F|5}gE5}($zbLHrag*2zD4y*cOYG@w{PW3UAavkh^ek-^VdV;WfSAn7BAcd!X5Hz z{3u46O?0TfnC#(Rio6h;NLAfq*Un-W)^l<&2PS0?@3)3|6T z?gXVTd;;!ic<*E;-n_$N5fH8@lwTmB#&q*&Dpo z+Dn>oJ);IwE+xedKDkRC6epNpBCDrxB)y13^vi2Fi58UD1i8(Y2~H z(&_5~|8t^8g6UfNl@pzTt-kdiX&H4zXOnJsJKbG*6x*$%(sbY3N;h6iZgp*v?OGO+ zPaz^Z#^n#+&kjsU0Hqf`+2lXjkt$TX5fa5@C!8GSZb6cVBw}k{?e_5*gQ(iF2z$;f%x;wBg#xE z86qpmSH%7pykUVKvs|_M->=C#Z`l-zuw^6tb-^TebCB=UUV2)FR0!VyWvspQB-JSw z!v9};X%SD`QQ6)Kp@O9{V6M^5ej!;Y=Ub^euWEeooEMUX zjNUXETD0hO+WQwsuXow9tjqde?0_rYdvQTVY-P5z6VqN5>C(>Wdc3`Dx~p;Wh?R?R z0i`nVtuYlocjZK}{y4N6-{Oa2{I)*D#&`G(@UFy&fkzBFB4GWy7GmS^_vB<8RH$87 ztGvoyd@`>S#pBk?HBUkC`-zOp`oRVdHOO4OcTzNV{pX3KX8V{@eDo>alBIf7hur0Fu94@C78Fp&oPqTVc>-AFW6C1V=MOBl#Ud zX?~8ZWE00&b?x^+M+LQ@@HSPYQuC1Su|D>h*q0l%%xXWdL{)yEy$$M{8A37BBVcyDM2kL zyj@J4K~1vj-I9w*qPIi#7b_@`T)?FkpbIh7pQxUy-zrlsGbxw)y8&pjT5rYb zR;<4&mY^0Cc2_Q?g()z3Ec{PcHaW&+tdBnt-El?oK&^*fRiIl*-fVOvudW{-)arOnA7b6>jQ_z zxhI+TQazbLQyhrC#k$n$!k2SQcD8aNXj4DZpAXjmhETMQ>#{xy@_PL3?*Q#o>a_V% zr8%IsK`~wLTV1pYSbxQ$8=tJH|AEi@By-jhxJqwN>a%`TUAX?@ukw>Rm1O;2 z{McAECU57r^LA*wDlT+?bxszy`z*y}L)nZkye2;W zHDRln305F-$@+Gwjm=m$Tv!ZBMQW+0t z#UqNJ#2~UjCyz&_)!xg%)ZQz6G34mvqpjsC-+C86 zVJ}r%ODBsrTk(1bQ@n|Mi8qOl;!WmT@8u`#or~9L_W;bX{1|_nmumA|NcI7DQIQg0 z#x9AJ+9It_ftaUHn^Ha(eO!n4;2+z{sRSm|3`6-M0pM%#Veerzz+$bBZ>z6kOcsqo zc#2g&L{gfqIh^*JIY$+(4UIz5FA~c&wxW-ijwid1QafywvR@kO>avqs>N1%F4TgwK3+%Q zk#+e^*5jvdh3ijdMDK#F^;DjIeDG9p+25Ee^n&r(-{x~s#l)YiPw1kZY1bG{iDW(S zgFR%j0pDbQvRwO%NmrX<$pAoXsRk9cq1?$v{KkE0B59_5OsU#Apt&mR5%FNQS}-zC zk>5snFMBSNO4t|}x^46kRat*3wEh-6VP6_dz*Lg+uH~@5JO}V2Q5~qS%UAsflj~^x zc3M)2#Um1+t|Z!wuU|>z$8}66W^d8d+Z_5xwg!i0 zps}ZtY=dX06KCnTsU6D^xu#Fc*L2bg2;AsH%cYi?GGRsEUKE<&U0E`#NBFk6?7GqE zS4TpMuJ$73gbl)|Z%g!sikMY}DwCDLT;*45ij5V4zj)c+StswhwuPYPU^G`0K)~)0 zp7&Qzn|W}YY!A5k1L|`&(|xPP^|t{X71V~VRsQF4Y~J7-O`PraEvyf{Ofn7eZqG&S1dNZr>-Huz05uDQrEB-6*f#) zjr6+T5uHoi0pgmC@!jCa#&{VKvF7;PI9TkA49LRo9Oy4h7LFP^4vvfW0Goq)7v61CHe?UMP zrE66UOKlCLY)t{HvY&Tpw2|DPzW@KVL4BHSYrrnpTrLvZeMiR1>**<~8ooOzgG*Ef zn%kBlNp7CxV41dK8g>^9Q=9NZ`n0aNyIiT?qoYk}|JM~=NSuvZaaLj1%8GS2%q!BN z*J_cGFVt_RT)UR<0)cLyHndG!nKl&C$wDPHZ8eL{+yL%OriLr2u_`NV^>5VVXv#Kj zuX=nOcB3FQV(h}#jxdE|z(6Lmup_t+Y)zH0yVyqsUb0n#FMRsC>PIkt=*CcoAlqk6 zcBBXDnZGZwxLbQCJoXxQO=c_UF5SN1YCY?_X0lsxRyllUdzNOWj)#%0I;?)24*n|o zhW;)n?hM6^?(qJ*u%hp8El?hY4v`5ePp%jpc@;(msyEule-Jrrp?Z@mdTSEaE98J< zcJVc1^(&)HIrpX;`nphH6&w0nLjs+gl6iv-{aoVrVM4Id)_yc05Sh~t-J3=w?dR(x zME^GJeg5;#i?*Qsv3~J&^p@l^J&L4pR98EEf~xP&*sr30eS-dVfIIKJjdixhwnF>* zON_y=zooovWR@@2(T8o@0Zds^I$hDtB>q;_z0aub75v7_pXDmR5vl;kGLsk;w5gx4 zEB&K3ov8oV~v8FkDD{{iQ=fq5XWQS@v7EJFK0^ z7D9_!8)2Z|=4INqI-d8F$M@*<1K<`$(XSjRm+UFpoqqiw!4|~H!O9bTzTJ0?Erk5p zR=VOIB0Rq79ie8TiQhIz=(lD>8V>d6Ad2`}WEqa(2lw@IpWyE6`1s?1r?defarX^; z!g2gqo|w!2f^x9^IdedtyFi`=mfi(YJArQ4!Ua@$5a*X!9CJAAR~gJ44tp+xnFAPi z#{3-Ede%|Tt(^_+IGik&RDd?0ZU`Yw=hs<$b2!c4WH56$?D-644u}0VgP8-E&hDWT ziKw@|wTnqPoJ+!P2B?c!?#V!{ZTZ^oUQG@BxK12g8~z!ZATZ<_`yA#(Tcf`#k@6(=^`_8r`m&UBEokbI8EQSpu~1L7hr7J z?4h&yJ4z@Uv75p7S-eM$SxeMLfT*Zbh?*A=6=n)K2?)y8OfZ%X z^C+!8N|koG<Lj>UHZ95i$%}+1Cu0m$Czym z%jHur9TLH5|D0Mcyoo*g>j=1IH}V3t9?jw()oG<^%-UpHgsEq=jq>Pqe4U9|9WR7q z7#^{~ke(o12$!h6&31K1aICjTYyGfvL$wyv>>0V{PPpZ;J57wfm*~7GQ%K%{xVcf} zCStJkI6^)i1nNkR#5Hs>P-} z+x06IlT}ZdQ=yX7LQ=pjLAgkZE|Q{)L@PiOiDx7eNpVar{B;}_e6}bwQ`O3<@^@^s z&V^b27DUJ0=JQVJpR~T*mi)1O1S1Spd#kV$TV^raLYe|(^U8wVRkl$0&EHcCZBZ4j zq=;Mk9)nx`VGqNrPF7bL*R2MRr~HQ$k0vLhf?7~GkvQFz=AUwCmk8|`p$Te1&6jfFmn!^Ng$rsy;Uvho91hK8 zzWE0b!pRm^s~wOvt9(wwtD2j`vCc+mezv{xH*P?{2)Z?bTW4EHPKAl&1ehp|8wt3V zB@42Cc*{7P10b%S2r>yVKRih;z9;M3teq*oG?5uqskP@dqv9Uhn}GVN8m<6Ad_I~D zma^=u(~6d)JO5odQPIgL-x{L5ezg~#c5G-M?=f}AAsby#boGdM#&^+6&u zwam=}Q!2@s0Bwh-w~}ZM%wrMyXnj$&QxU*zo~&88=~w8Sk{Yq*LehGt+r2~S@TS<| z4Gv!FAPt|W4#)K8=wBAK^e>g>pAmIdO+P@2^+lkM3Ti>&G_PND#4*~`<3E?R*ZI-X zrz6v~?;6`|K6d_2H~i;gzf@UmH6#MXwV(Zt3F)ik2V;2>ifcbm@wWlt42x=dQmOrR zpd8SXe#x{8apRX-pA{O<>66a?>qkL{`ZV%a)fd_6nS;2%{+7Ya;jq7FFmpKUl?-MM zhrKM=RNm;i8vl;);m5~p$s@JlVq}z@#ZORnyPAIizdVKaKP2j@#3_VxaCUn@B{>&Q z#cX%EX&#>ER+1%v>lHn&KVCV07`W_7;n;Yy2 zft|!-oM75gO+E+(+%ghQZZ>z=l239AKMeg)vZ<&p*|ExG{V6*+jI>%WCATV0i@x6} zw6n=T&Cy;0Erc`4w`|#O1GzL{Tw{4<-t11HUE_L##2U&;9GW->qIvaq@g0@C?A)(( z7rTgdG73C>`FTIuUHK&G@e)0 z>}dQ}pAr3P|MaWU381Q|hA*W3t(RLN+5}d1Q~bx$_`g#`ZXWx+zAH*!%VMIh5{L^o z=81&j&ti<6OZ?rH&tx|ps_*M670Tg0%EQgQ#%Pr6{2x;roqL|#pXH$|dIvQ25RLE~ zNb_{)TDmx>j>)zxoz}*~EMA4wnXHMYf1%7yI+N9LvuScaiA^o?G+|OB!rZ~{Ry-*6 zK3Zw5c|6aPbq4@zbgQe2#B}oyWNdg-i1y9iZ`p4&0cGon3uH-W0>+ySy0a^9XL2ct4%6zR=8GcyHe72? zZ_{UoN5yFnl_~v#Lxo+w)a8^F= zr8gCq!tLJBtAE|v6piW6@P>l?B|e4Hh93HSNmb=mHh$B4;5RVv*#_2cxR9SA z8>EtJpv`QVUq^1OW!Eg&$?$=B^)JE3=s#6pPsH^PfZ6yro>Y&AP`)dnTnl_!^Irtm zPyIUK{YQ~Vd|vZaT*>vo7*or3o_k;NSmX?B{hKPMctkXLP~rw~y2>5Nw}6(D$N9bE zeXYHAtqV4W-hPsg$H2hhMxt15I67?+E+oSF`sp9wA$K`i=i~hh)&67R-$eYmX`k9{ zZ&)1A3Qs;rAa!zt=Fl~NbJ8v+=i%n^YB5~lh^!^=o#MA)cSz$)JJg7$Zl5Z_hjndB+dXjCu@t$lwLRZ0|nDh6iq+TH{g1T)dt+JQ!heeJM|VZ0o8k(5m$<4 zeEdj!d_)NgYC-iM02^H);>-(mm!Mxvm;6~5*wE%n(G2Juh>XLjDA=pTu8!`B#U5UU z;c2(>Nc z>)!x!;<^%EHR#YBq4rSaba!6K7@f$Q(TbCrQ7GS_(vm=M&WBFO>V#Bgz>zZb)ds~xRUFee8j--9C>ZM%~H2c^EW|8wg zsQb%?JX?X}hSzGbcxo$Q)Wh-8{40pchvd6cZ8;P0S@rMHAB-wR0lrz< zsKuyX1=G)*tus0Wz#%HX18E8gCj+XhZ^fV;wf!@Fe$wNgp zm^mEQmBGvbY}aN9PT#n5{C&vwl>}IC-9s^ALke!BE3*Qp&U=S`EIBvHYtv!zT%s4pLP>DApIte*1BS z{)Zocsw2XV1w6+C(rYD#` ztEB!-WBhSS+t~3VO60kqgq5!>-?E>O{^EFW3u*lr*230@&rh~SF v){veq_9Y58 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

    Classic, /// /// ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). /// Requires Internet Explorer 9 or higher on the machine. + /// Not supported in version for .NET Core. /// ChakraActiveScript, From a566a06b08e7b1625b40ebe7f1b50a24f9025aa7 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 6 Sep 2016 14:36:37 +0300 Subject: [PATCH 039/238] Was made refactoring --- .../ActiveScript/ActiveScriptException.cs | 12 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 25 +- .../ActiveScript/ActiveScriptParseWrapper.cs | 8 +- .../ChakraActiveScriptJsEngine.cs | 6 +- .../ClassicActiveScriptJsEngine.cs | 6 +- .../ActiveScript/IActiveScript.cs | 6 +- .../ActiveScript/IActiveScriptError.cs | 6 +- .../ActiveScript/IActiveScriptParse32.cs | 6 +- .../ActiveScript/IActiveScriptParse64.cs | 6 +- .../ActiveScript/IActiveScriptParseWrapper.cs | 6 +- .../ActiveScript/IActiveScriptProperty.cs | 6 +- .../ActiveScript/IActiveScriptSite.cs | 6 +- .../ActiveScript/ScriptHResult.cs | 6 +- .../ActiveScript/ScriptInfoFlags.cs | 6 +- .../ActiveScript/ScriptInterruptFlags.cs | 6 +- .../ActiveScript/ScriptItemFlags.cs | 6 +- .../ActiveScript/ScriptLanguageVersion.cs | 6 +- .../ActiveScript/ScriptProperty.cs | 6 +- .../ActiveScript/ScriptState.cs | 6 +- .../ActiveScript/ScriptTextFlags.cs | 6 +- .../ActiveScript/ScriptThreadState.cs | 6 +- .../ActiveScript/ScriptTypeLibFlags.cs | 6 +- .../Constants/ComErrorCode.cs | 6 +- .../Constants/SpecialMemberName.cs | 6 +- .../Helpers/ComHelpers.cs | 8 +- .../Helpers/JsErrorHelpers.cs | 18 +- .../Helpers/ReflectionHelpers.cs | 6 +- .../Helpers/TypeMappingHelpers.cs | 6 +- src/MsieJavaScriptEngine/HostItemBase.cs | 6 +- src/MsieJavaScriptEngine/HostObject.cs | 6 +- src/MsieJavaScriptEngine/HostType.cs | 6 +- .../JsRt/ChakraJsRtJsEngineBase.cs | 8 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 51 ++-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 51 ++-- .../MsieJavaScriptEngine.Net40.csproj | 18 +- .../MsieJavaScriptEngine.xproj | 4 + src/MsieJavaScriptEngine/MsieJsEngine.cs | 90 +++---- ....Designer.cs => CommonStrings.Designer.cs} | 216 +---------------- .../Resources/CommonStrings.resx | 207 ++++++++++++++++ ...ner.cs => CommonStrings.ru-ru.Designer.cs} | 0 .../Resources/CommonStrings.ru-ru.resx | 207 ++++++++++++++++ .../Resources/NetCoreStrings.Designer.cs | 229 ++++++++++++++++++ .../{Strings.resx => NetCoreStrings.resx} | 107 +------- .../NetCoreStrings.ru-ru.Designer.cs | 0 ...s.ru-ru.resx => NetCoreStrings.ru-ru.resx} | 107 +------- .../Resources/NetFrameworkStrings.Designer.cs | 117 +++++++++ .../Resources/NetFrameworkStrings.resx | 138 +++++++++++ .../NetFrameworkStrings.ru-ru.Designer.cs | 0 .../Resources/NetFrameworkStrings.ru-ru.resx | 138 +++++++++++ .../Utilities/DelegateExtensions.cs | 6 +- .../Utilities/TypeConverter.cs | 4 +- .../Utilities/TypeExtensions.cs | 5 - .../Utilities/TypeInfo.cs | 6 +- src/MsieJavaScriptEngine/Utilities/Utils.cs | 6 +- src/MsieJavaScriptEngine/project.json | 5 +- .../Interop/Drawing/Color.cs | 6 +- .../Interop/Drawing/KnownColor.cs | 6 +- .../Interop/Drawing/KnownColorTable.cs | 6 +- .../Interop/Drawing/Point.cs | 6 +- 59 files changed, 1328 insertions(+), 643 deletions(-) rename src/MsieJavaScriptEngine/Resources/{Strings.Designer.cs => CommonStrings.Designer.cs} (50%) create mode 100644 src/MsieJavaScriptEngine/Resources/CommonStrings.resx rename src/MsieJavaScriptEngine/Resources/{Strings.ru-ru.Designer.cs => CommonStrings.ru-ru.Designer.cs} (100%) create mode 100644 src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx create mode 100644 src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs rename src/MsieJavaScriptEngine/Resources/{Strings.resx => NetCoreStrings.resx} (66%) create mode 100644 src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.Designer.cs rename src/MsieJavaScriptEngine/Resources/{Strings.ru-ru.resx => NetCoreStrings.ru-ru.resx} (63%) create mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs create mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx create mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs create mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index c212f9d..5b2fb07 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -1,14 +1,11 @@ -using System; -#if !NETSTANDARD1_3 +#if !NETSTANDARD1_3 +using System; using System.Runtime.Serialization; -#endif using System.Runtime.InteropServices.ComTypes; namespace MsieJavaScriptEngine.ActiveScript { -#if !NETSTANDARD1_3 [Serializable] -#endif internal sealed class ActiveScriptException : Exception { /// @@ -105,7 +102,6 @@ public ActiveScriptException(Exception innerException) public ActiveScriptException(string message, Exception innerException) : base(message, innerException) { } -#if !NETSTANDARD1_3 /// /// Initializes a new instance of the class @@ -123,7 +119,6 @@ public ActiveScriptException(string message, Exception innerException) private ActiveScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { } -#endif internal static ActiveScriptException Create(IActiveScriptError error) @@ -197,4 +192,5 @@ internal static ActiveScriptException Create(IActiveScriptError error) return activeScriptException; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 5c1da41..2792b1f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; @@ -53,7 +54,7 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine, IActiveScript /// /// List of host items /// - private Dictionary _hostItems = new Dictionary(); + private readonly Dictionary _hostItems = new Dictionary(); /// /// Host-defined document version string @@ -110,7 +111,7 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_IeJsEngineNotLoaded, + string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, _engineModeName, lowerIeVersion, e.Message), _engineModeName); } @@ -125,7 +126,7 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string if (result != (uint)ScriptHResult.Ok) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); + string.Format(NetFrameworkStrings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); } } } @@ -277,7 +278,7 @@ private void InitScriptDispatch() if (dispatch == null) { - throw new InvalidOperationException(Strings.Runtime_ActiveScriptDispatcherNotInitialized); + throw new InvalidOperationException(NetFrameworkStrings.Runtime_ActiveScriptDispatcherNotInitialized); } _dispatch = dispatch; @@ -510,13 +511,13 @@ private void ExecuteResource(string resourceName, Type type) if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); } if (type == null) { throw new ArgumentNullException( - "type", string.Format(Strings.Common_ArgumentIsNull, "type")); + "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); } string code = Utils.GetResourceAsString(resourceName, type); @@ -557,7 +558,6 @@ private void Dispose(bool disposing) if (_hostItems != null) { _hostItems.Clear(); - _hostItems = null; } _lastException = null; @@ -611,7 +611,7 @@ void IActiveScriptSite.GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr if (item == null) { throw new COMException( - string.Format(Strings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); + string.Format(NetFrameworkStrings.Runtime_ItemNotFound, name), ComErrorCode.ElementNotFound); } if (mask.HasFlag(ScriptInfoFlags.IUnknown)) @@ -714,7 +714,7 @@ public object CallFunction(string functionName, params object[] args) catch (MissingMemberException) { throw new JsRuntimeException( - string.Format(Strings.Runtime_FunctionNotExist, functionName)); + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); } }); @@ -756,7 +756,7 @@ public object GetVariableValue(string variableName) catch (MissingMemberException) { throw new JsRuntimeException( - string.Format(Strings.Runtime_VariableNotExist, variableName)); + string.Format(NetFrameworkStrings.Runtime_VariableNotExist, variableName)); } }); @@ -811,4 +811,5 @@ public void Dispose() #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs index fb6545c..a508338 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptParseWrapper.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -77,7 +78,7 @@ public ActiveScriptParseWrapper(IntPtr pActiveScript, IActiveScript activeScript if (_activeScriptParse64 == null && _activeScriptParse32 == null) { - throw new NotSupportedException(Strings.Runtime_InvalidParserImplementationError); + throw new NotSupportedException(NetFrameworkStrings.Runtime_InvalidParserImplementationError); } } @@ -306,4 +307,5 @@ public void Dispose() #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 4b56d04..89d8844 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// ActiveScript version of Chakra JavaScript engine @@ -38,4 +39,5 @@ public static bool IsSupported() return isSupported; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index 7a3ae64..baca697 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Classic MSIE JavaScript engine @@ -40,4 +41,5 @@ public static bool IsSupported() return isSupported; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs index bcb575e..033cb04 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -167,4 +168,5 @@ void InterruptScriptThread( void Clone( [Out] [MarshalAs(UnmanagedType.Interface)] out IActiveScript script); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs index 84baa8f..ccb6906 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs @@ -1,4 +1,5 @@ -using System.Runtime.InteropServices; +#if !NETSTANDARD1_3 +using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -43,4 +44,5 @@ void GetSourcePosition( void GetSourceLineText( [Out] [MarshalAs(UnmanagedType.BStr)] out string sourceLine); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs index c3f580f..58ea8b5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -131,4 +132,5 @@ [In] [MarshalAs(UnmanagedType.LPWStr)] string delimiter, [Out] out object result, [Out] out EXCEPINFO exceptionInfo); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs index 91662aa..d0dda6e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -131,4 +132,5 @@ [In] [MarshalAs(UnmanagedType.LPWStr)] string delimiter, [Out] out object result, [Out] out EXCEPINFO exceptionInfo); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs index 22d456f..fc15aee 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParseWrapper.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript @@ -119,4 +120,5 @@ object ParseScriptText( uint startingLineNumber, ScriptTextFlags flags); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs index b8325a1..082cc11 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript @@ -20,4 +21,5 @@ uint SetProperty( [In] IntPtr pvarIndex, [In] [Out] ref object pvarValue); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index 1f0c29d..219fe9c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -106,4 +107,5 @@ void OnScriptError( /// void OnLeaveScript(); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs index 999276c..4055e6f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptHResult.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Common HRESULT Values @@ -21,4 +22,5 @@ internal enum ScriptHResult : uint /// Unexpected = 0x8000FFFF } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs index 19ec39b..303958e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; namespace MsieJavaScriptEngine.ActiveScript { @@ -20,4 +21,5 @@ internal enum ScriptInfoFlags : uint /// ITypeInfo = 2 } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs index b5812dd..6f46afd 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; namespace MsieJavaScriptEngine.ActiveScript { @@ -25,4 +26,5 @@ internal enum ScriptInterruptFlags : uint /// RaiseException = 2, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs index 9125aec..b9c1cd4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; namespace MsieJavaScriptEngine.ActiveScript { @@ -62,4 +63,5 @@ internal enum ScriptItemFlags : uint /// NoCode = 0x00000400, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs index 67e5e4e..910091d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Version of script language (see https://msdn.microsoft.com/en-gb/library/hh769820(v=vs.94).aspx) @@ -30,4 +31,5 @@ internal enum ScriptLanguageVersion /// EcmaScript5 = 3, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs index 7f5c1e1..88a58ce 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Script property (see https://msdn.microsoft.com/en-us/subscriptions/downloads/cc512774(v=vs.94).aspx) @@ -29,4 +30,5 @@ internal enum ScriptProperty : uint /// InvokeVersioning = 0x00004000 } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs index 3d87167..af7b68b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Contains named constant values that specify the state of a scripting engine @@ -41,4 +42,5 @@ internal enum ScriptState : uint /// Initialized = 5 } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs index 27f98b0..e7ddece 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; namespace MsieJavaScriptEngine.ActiveScript { @@ -32,4 +33,5 @@ internal enum ScriptTextFlags : uint HostManagesSource = 0x00000080, IsCrossDomain = 0x00000100, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs index 35fbcbc..f0b1f22 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.ActiveScript +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript { /// /// Contains named constant values that specify the state of a thread in a scripting @@ -18,4 +19,5 @@ internal enum ScriptThreadState : uint /// Running = 1, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs index 1b55092..07842af 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; namespace MsieJavaScriptEngine.ActiveScript { @@ -20,4 +21,5 @@ internal enum ScriptTypeLibFlags : uint /// IsPersistent = 0x00000040, } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs index 63ce28e..41a918e 100644 --- a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs +++ b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.Constants +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.Constants { /// /// COM error codes @@ -9,4 +10,5 @@ internal static class ComErrorCode public const int ClassNotRegistered = unchecked((int)0x80040154); } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs index 5415c70..e1b7d78 100644 --- a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs +++ b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.Constants +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.Constants { /// /// Special member names @@ -7,4 +8,5 @@ internal static class SpecialMemberName { public const string Default = "[DISPID=0]"; } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 23599c3..1584155 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,5 +1,6 @@ -using System; -#if NETSTANDARD1_3 || NET451 +#if !NETSTANDARD1_3 +using System; +#if NET451 using System.Reflection; #endif using System.Runtime.InteropServices; @@ -175,4 +176,5 @@ public static int MakeResult(int severity, int facility, int code) #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 56d1e48..fae5e5c 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -20,11 +20,11 @@ public static class JsErrorHelpers public static string Format(JsEngineLoadException jsEngineLoadException) { var errorMessage = new StringBuilder(); - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_Message, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Message, jsEngineLoadException.Message); if (!string.IsNullOrWhiteSpace(jsEngineLoadException.EngineMode)) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_EngineMode, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_EngineMode, jsEngineLoadException.EngineMode); } @@ -39,37 +39,37 @@ public static string Format(JsEngineLoadException jsEngineLoadException) public static string Format(JsRuntimeException jsRuntimeException) { var errorMessage = new StringBuilder(); - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_Message, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Message, jsRuntimeException.Message); if (!string.IsNullOrWhiteSpace(jsRuntimeException.EngineMode)) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_EngineMode, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_EngineMode, jsRuntimeException.EngineMode); } if (!string.IsNullOrWhiteSpace(jsRuntimeException.ErrorCode)) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_ErrorCode, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_ErrorCode, jsRuntimeException.ErrorCode); } if (!string.IsNullOrWhiteSpace(jsRuntimeException.Category)) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_Category, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Category, jsRuntimeException.Category); } if (jsRuntimeException.LineNumber > 0) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_LineNumber, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_LineNumber, jsRuntimeException.LineNumber.ToString(CultureInfo.InvariantCulture)); } if (jsRuntimeException.ColumnNumber > 0) { - errorMessage.AppendFormatLine("{0}: {1}", Strings.ErrorDetails_ColumnNumber, + errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_ColumnNumber, jsRuntimeException.ColumnNumber.ToString(CultureInfo.InvariantCulture)); } if (!string.IsNullOrWhiteSpace(jsRuntimeException.SourceFragment)) { errorMessage.AppendFormatLine("{1}:{0}{0}{2}", Environment.NewLine, - Strings.ErrorDetails_SourceFragment, + CommonStrings.ErrorDetails_SourceFragment, jsRuntimeException.SourceFragment); } diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index bf6863c..33da84d 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,4 +1,5 @@ -using System; +#if NETSTANDARD1_3 +using System; using System.Linq; using System.Reflection; @@ -182,4 +183,5 @@ private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, T return true; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index 4a09bbe..d7fc148 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Linq; using MsieJavaScriptEngine.Utilities; @@ -87,4 +88,5 @@ public static object[] MapToHostType(object[] args) return args.Select(MapToHostType).ToArray(); } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index 57f6fbf..8a6c45d 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Globalization; using System.Linq; using System.Reflection; @@ -181,4 +182,5 @@ object IReflect.InvokeMember(string name, BindingFlags invokeAttr, Binder binder #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index d1ac1f7..32fe727 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Globalization; using System.Linq; using System.Reflection; @@ -67,4 +68,5 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs index 9b5efbf..88ad9bd 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -1,4 +1,5 @@ -using System; +#if !NETSTANDARD1_3 +using System; using System.Globalization; using System.Linq; using System.Reflection; @@ -51,4 +52,5 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr #endregion } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 51bec85..7e25f9b 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -42,7 +42,7 @@ internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine /// /// List of external objects /// - protected ISet _externalObjects = new HashSet(); + protected readonly HashSet _externalObjects = new HashSet(); /// /// Callback for finalization of external object @@ -98,7 +98,10 @@ private void ExternalObjectFinalizeCallback(IntPtr data) lock (_executionSynchronizer) { - _externalObjects.Remove(obj); + if (_externalObjects != null) + { + _externalObjects.Remove(obj); + } } } #endif @@ -136,7 +139,6 @@ public virtual void Dispose() if (_externalObjects != null) { _externalObjects.Clear(); - _externalObjects = null; } _externalObjectFinalizeCallback = null; diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 77ecf4b..50ff9ad 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -45,7 +45,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// List of native function callbacks /// - private ISet _nativeFunctions = new HashSet(); + private readonly HashSet _nativeFunctions = new HashSet(); #endif /// @@ -71,11 +71,11 @@ public ChakraEdgeJsRtJsEngine(bool enableDebugging) string errorMessage; if (e.ErrorCode == JsErrorCode.WrongThread) { - errorMessage = Strings.Runtime_JsEnginesConflictOnMachine; + errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; } else { - errorMessage = string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message); + errorMessage = string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message); } throw new JsEngineLoadException(errorMessage, _engineModeName); @@ -83,7 +83,7 @@ public ChakraEdgeJsRtJsEngine(bool enableDebugging) catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); + string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); } } @@ -359,7 +359,7 @@ private EdgeJsValue CreateFunctionFromDelegate(Delegate value) catch (Exception e) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostDelegateInvocationFailed, e.Message)); + string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -402,7 +402,7 @@ private EdgeJsValue CreateConstructor(Type type) if (constructors.Length == 0) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostTypeConstructorNotFound, typeName)); + string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -413,7 +413,7 @@ private EdgeJsValue CreateConstructor(Type type) if (bestFitConstructor == null) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(Strings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -428,7 +428,7 @@ private EdgeJsValue CreateConstructor(Type type) catch (Exception e) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -470,7 +470,7 @@ private void ProjectFields(EdgeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -488,9 +488,9 @@ private void ProjectFields(EdgeJsValue target, Type type, bool instance) catch (Exception e) { string errorMessage = instance ? - string.Format(Strings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) : - string.Format(Strings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) ; EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -520,7 +520,7 @@ private void ProjectFields(EdgeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -539,9 +539,9 @@ private void ProjectFields(EdgeJsValue target, Type type, bool instance) catch (Exception e) { string errorMessage = instance ? - string.Format(Strings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) : - string.Format(Strings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) ; EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -588,7 +588,7 @@ private void ProjectProperties(EdgeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -607,10 +607,10 @@ private void ProjectProperties(EdgeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) + NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) : string.Format( - Strings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) ; EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -643,7 +643,7 @@ private void ProjectProperties(EdgeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -663,10 +663,10 @@ private void ProjectProperties(EdgeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) + NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) : string.Format( - Strings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) ; EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -711,7 +711,7 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -727,7 +727,7 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) if (bestFitMethod == null) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(Strings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); EdgeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -745,10 +745,10 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) + NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) : string.Format( - Strings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) ; EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -904,7 +904,6 @@ private void Dispose(bool disposing) if (_nativeFunctions != null) { _nativeFunctions.Clear(); - _nativeFunctions = null; } #endif } @@ -946,7 +945,7 @@ public override object CallFunction(string functionName, params object[] args) if (!functionExist) { throw new JsRuntimeException( - string.Format(Strings.Runtime_FunctionNotExist, functionName)); + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); } var processedArgs = MapToScriptType(args); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index fbfecfd..ca4835e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -50,7 +50,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// List of native function callbacks /// - private ISet _nativeFunctions = new HashSet(); + private readonly HashSet _nativeFunctions = new HashSet(); #endif /// @@ -76,11 +76,11 @@ public ChakraIeJsRtJsEngine(bool enableDebugging) string errorMessage; if (e.ErrorCode == JsErrorCode.WrongThread) { - errorMessage = Strings.Runtime_JsEnginesConflictOnMachine; + errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; } else { - errorMessage = string.Format(Strings.Runtime_IeJsEngineNotLoaded, + errorMessage = string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, _engineModeName, LOWER_IE_VERSION, e.Message); } @@ -89,7 +89,7 @@ public ChakraIeJsRtJsEngine(bool enableDebugging) catch (Exception e) { throw new JsEngineLoadException( - string.Format(Strings.Runtime_IeJsEngineNotLoaded, + string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, _engineModeName, LOWER_IE_VERSION, e.Message), _engineModeName); } } @@ -383,7 +383,7 @@ private IeJsValue CreateFunctionFromDelegate(Delegate value) catch (Exception e) { IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostDelegateInvocationFailed, e.Message)); + string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -426,7 +426,7 @@ private IeJsValue CreateConstructor(Type type) if (constructors.Length == 0) { IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostTypeConstructorNotFound, typeName)); + string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -437,7 +437,7 @@ private IeJsValue CreateConstructor(Type type) if (bestFitConstructor == null) { IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(Strings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -452,7 +452,7 @@ private IeJsValue CreateConstructor(Type type) catch (Exception e) { IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(Strings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -494,7 +494,7 @@ private void ProjectFields(IeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -512,9 +512,9 @@ private void ProjectFields(IeJsValue target, Type type, bool instance) catch (Exception e) { string errorMessage = instance ? - string.Format(Strings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) : - string.Format(Strings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) ; IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -544,7 +544,7 @@ private void ProjectFields(IeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -563,9 +563,9 @@ private void ProjectFields(IeJsValue target, Type type, bool instance) catch (Exception e) { string errorMessage = instance ? - string.Format(Strings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) : - string.Format(Strings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) ; IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -612,7 +612,7 @@ private void ProjectProperties(IeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -631,10 +631,10 @@ private void ProjectProperties(IeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) + NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) : string.Format( - Strings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) ; IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -667,7 +667,7 @@ private void ProjectProperties(IeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -687,10 +687,10 @@ private void ProjectProperties(IeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) + NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) : string.Format( - Strings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) ; IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -735,7 +735,7 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) if (!thisValue.HasExternalData) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(Strings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -751,7 +751,7 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) if (bestFitMethod == null) { IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(Strings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); IeJsErrorHelpers.SetException(errorValue); return undefinedValue; @@ -769,10 +769,10 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) { string errorMessage = instance ? string.Format( - Strings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) + NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) : string.Format( - Strings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) + NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) ; IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -943,7 +943,6 @@ private void Dispose(bool disposing) if (_nativeFunctions != null) { _nativeFunctions.Clear(); - _nativeFunctions = null; } #endif } @@ -985,7 +984,7 @@ public override object CallFunction(string functionName, params object[] args) if (!functionExist) { throw new JsRuntimeException( - string.Format(Strings.Runtime_FunctionNotExist, functionName)); + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); } var processedArgs = MapToScriptType(args); diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj index 445179f..6fd8a44 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj @@ -139,8 +139,10 @@ - - + + + + @@ -156,17 +158,13 @@ + + - - - - Designer - - - Designer - + + diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj index 88e15bc..c2f6fef 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj @@ -18,5 +18,9 @@ + + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 8059abb..0344944 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -91,9 +91,9 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( #if NETSTANDARD1_3 - Strings.Runtime_JsEnginesForNetCoreNotFound + NetCoreStrings.Runtime_JsEnginesNotFound #else - Strings.Runtime_JsEnginesNotFound + NetFrameworkStrings.Runtime_JsEnginesNotFound #endif ); } @@ -115,7 +115,7 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( string.Format( - Strings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Runtime_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -125,7 +125,7 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( string.Format( - Strings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Runtime_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -142,7 +142,7 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( string.Format( - Strings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Runtime_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -161,7 +161,7 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( string.Format( - Strings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Runtime_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -171,7 +171,7 @@ public MsieJsEngine(JsEngineSettings settings) break; #else throw new NotSupportedException( - string.Format(Strings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); + string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif case JsEngineMode.Classic: #if !NETSTANDARD1_3 @@ -181,11 +181,11 @@ public MsieJsEngine(JsEngineSettings settings) break; #else throw new NotSupportedException( - string.Format(Strings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); + string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif default: throw new NotSupportedException( - string.Format(Strings.Runtime_JsEngineModeNotSupported, processedEngineMode)); + string.Format(CommonStrings.Runtime_JsEngineModeNotSupported, processedEngineMode)); } _currentMode = processedEngineMode; @@ -217,7 +217,7 @@ public object Evaluate(string expression) if (string.IsNullOrWhiteSpace(expression)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "expression"), "expression"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "expression"), "expression"); } return _jsEngine.Evaluate(expression); @@ -242,14 +242,14 @@ public T Evaluate(string expression) if (string.IsNullOrWhiteSpace(expression)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "expression"), "expression"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "expression"), "expression"); } Type returnValueType = typeof(T); if (!ValidationHelpers.IsSupportedType(returnValueType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); } object result = _jsEngine.Evaluate(expression); @@ -272,7 +272,7 @@ public void Execute(string code) if (string.IsNullOrWhiteSpace(code)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "code"), "code"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "code"), "code"); } _jsEngine.Execute(code); @@ -295,7 +295,7 @@ public void ExecuteFile(string path, Encoding encoding = null) if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "path"), "path"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "path"), "path"); } string code = Utils.GetFileTextContent(path, encoding); @@ -319,13 +319,13 @@ public void ExecuteResource(string resourceName, Type type) if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); } if (type == null) { throw new ArgumentNullException( - "type", string.Format(Strings.Common_ArgumentIsNull, "type")); + "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); } string code = Utils.GetResourceAsString(resourceName, type); @@ -349,13 +349,13 @@ public void ExecuteResource(string resourceName, Assembly assembly) if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); } if (assembly == null) { throw new ArgumentNullException( - "assembly", string.Format(Strings.Common_ArgumentIsNull, "assembly")); + "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); } string code = Utils.GetResourceAsString(resourceName, assembly); @@ -382,13 +382,13 @@ public object CallFunction(string functionName, params object[] args) if (string.IsNullOrWhiteSpace(functionName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "functionName"), "functionName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "functionName"), "functionName"); } if (!ValidationHelpers.CheckNameFormat(functionName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidFunctionNameFormat, functionName)); + string.Format(CommonStrings.Runtime_InvalidFunctionNameFormat, functionName)); } int argumentCount = args.Length; @@ -405,7 +405,7 @@ public object CallFunction(string functionName, params object[] args) if (!ValidationHelpers.IsSupportedType(argType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_FunctionParameterTypeNotSupported, + string.Format(CommonStrings.Runtime_FunctionParameterTypeNotSupported, functionName, argType.FullName)); } } @@ -438,20 +438,20 @@ public T CallFunction(string functionName, params object[] args) if (string.IsNullOrWhiteSpace(functionName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "functionName"), "functionName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "functionName"), "functionName"); } Type returnValueType = typeof(T); if (!ValidationHelpers.IsSupportedType(returnValueType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); } if (!ValidationHelpers.CheckNameFormat(functionName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidFunctionNameFormat, functionName)); + string.Format(CommonStrings.Runtime_InvalidFunctionNameFormat, functionName)); } int argumentCount = args.Length; @@ -468,7 +468,7 @@ public T CallFunction(string functionName, params object[] args) if (!ValidationHelpers.IsSupportedType(argType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_FunctionParameterTypeNotSupported, + string.Format(CommonStrings.Runtime_FunctionParameterTypeNotSupported, functionName, argType.FullName)); } } @@ -497,13 +497,13 @@ public bool HasVariable(string variableName) if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); } if (!ValidationHelpers.CheckNameFormat(variableName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidVariableNameFormat, variableName)); + string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); } return _jsEngine.HasVariable(variableName); @@ -526,13 +526,13 @@ public object GetVariableValue(string variableName) if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); } if (!ValidationHelpers.CheckNameFormat(variableName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidVariableNameFormat, variableName)); + string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); } return _jsEngine.GetVariableValue(variableName); @@ -558,20 +558,20 @@ public T GetVariableValue(string variableName) if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); } Type returnValueType = typeof(T); if (!ValidationHelpers.IsSupportedType(returnValueType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); } if (!ValidationHelpers.CheckNameFormat(variableName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidVariableNameFormat, variableName)); + string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); } object result = _jsEngine.GetVariableValue(variableName); @@ -598,13 +598,13 @@ public void SetVariableValue(string variableName, object value) if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); } if (!ValidationHelpers.CheckNameFormat(variableName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidVariableNameFormat, variableName)); + string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); } if (value != null) @@ -614,7 +614,7 @@ public void SetVariableValue(string variableName, object value) if (!ValidationHelpers.IsSupportedType(variableType)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_VariableTypeNotSupported, + string.Format(CommonStrings.Runtime_VariableTypeNotSupported, variableName, variableType.FullName)); } } @@ -638,13 +638,13 @@ public void RemoveVariable(string variableName) if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); } if (!ValidationHelpers.CheckNameFormat(variableName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidVariableNameFormat, variableName)); + string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); } _jsEngine.RemoveVariable(variableName); @@ -663,13 +663,13 @@ public void EmbedHostObject(string itemName, object value) if (string.IsNullOrWhiteSpace(itemName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "itemName"), "itemName"); } if (!ValidationHelpers.CheckNameFormat(itemName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidScriptItemNameFormat, itemName)); + string.Format(CommonStrings.Runtime_InvalidScriptItemNameFormat, itemName)); } if (value != null) @@ -680,12 +680,12 @@ public void EmbedHostObject(string itemName, object value) || itemType == typeof (Undefined)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_EmbeddedHostObjectTypeNotSupported, itemName, itemType.FullName)); + string.Format(CommonStrings.Runtime_EmbeddedHostObjectTypeNotSupported, itemName, itemType.FullName)); } } else { - throw new ArgumentNullException("value", string.Format(Strings.Common_ArgumentIsNull, "value")); + throw new ArgumentNullException("value", string.Format(CommonStrings.Common_ArgumentIsNull, "value")); } _jsEngine.EmbedHostObject(itemName, value); @@ -707,13 +707,13 @@ public void EmbedHostType(string itemName, Type type) if (string.IsNullOrWhiteSpace(itemName)) { throw new ArgumentException( - string.Format(Strings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, "itemName"), "itemName"); } if (!ValidationHelpers.CheckNameFormat(itemName)) { throw new FormatException( - string.Format(Strings.Runtime_InvalidScriptItemNameFormat, itemName)); + string.Format(CommonStrings.Runtime_InvalidScriptItemNameFormat, itemName)); } if (type != null) @@ -722,12 +722,12 @@ public void EmbedHostType(string itemName, Type type) || type == typeof(Undefined)) { throw new NotSupportedTypeException( - string.Format(Strings.Runtime_EmbeddedHostTypeNotSupported, type.FullName)); + string.Format(CommonStrings.Runtime_EmbeddedHostTypeNotSupported, type.FullName)); } } else { - throw new ArgumentNullException("type", string.Format(Strings.Common_ArgumentIsNull, "type")); + throw new ArgumentNullException("type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); } _jsEngine.EmbedHostType(itemName, type); diff --git a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs similarity index 50% rename from src/MsieJavaScriptEngine/Resources/Strings.Designer.cs rename to src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index c4ed46a..5ebfdff 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -16,15 +16,15 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class Strings + public class CommonStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( - "MsieJavaScriptEngine.Resources.Strings", + "MsieJavaScriptEngine.Resources.CommonStrings", #if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 - typeof(Strings).GetTypeInfo().Assembly + typeof(CommonStrings).GetTypeInfo().Assembly #elif NET40 - typeof(Strings).Assembly + typeof(CommonStrings).Assembly #else #error No implementation for this target #endif @@ -163,22 +163,6 @@ public static string Resources_ResourceIsNull get { return GetString("Resources_ResourceIsNull"); } } - /// - /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." - /// - public static string Runtime_ActiveScriptDispatcherNotInitialized - { - get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } - } - - /// - /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." - /// - public static string Runtime_ActiveScriptLanguageVersionSelectionFailed - { - get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } - } - /// /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." /// @@ -219,110 +203,6 @@ public static string Runtime_FunctionParameterTypeNotSupported get { return GetString("Runtime_FunctionParameterTypeNotSupported"); } } - /// - /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." - /// - public static string Runtime_HostDelegateInvocationFailed - { - get { return GetString("Runtime_HostDelegateInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." - /// - public static string Runtime_HostObjectFieldGettingFailed - { - get { return GetString("Runtime_HostObjectFieldGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." - /// - public static string Runtime_HostObjectFieldSettingFailed - { - get { return GetString("Runtime_HostObjectFieldSettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." - /// - public static string Runtime_HostObjectMethodInvocationFailed - { - get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." - /// - public static string Runtime_HostObjectPropertyGettingFailed - { - get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." - /// - public static string Runtime_HostObjectPropertySettingFailed - { - get { return GetString("Runtime_HostObjectPropertySettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." - /// - public static string Runtime_HostTypeConstructorInvocationFailed - { - get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." - /// - public static string Runtime_HostTypeConstructorNotFound - { - get { return GetString("Runtime_HostTypeConstructorNotFound"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." - /// - public static string Runtime_HostTypeFieldGettingFailed - { - get { return GetString("Runtime_HostTypeFieldGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." - /// - public static string Runtime_HostTypeFieldSettingFailed - { - get { return GetString("Runtime_HostTypeFieldSettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." - /// - public static string Runtime_HostTypeMethodInvocationFailed - { - get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." - /// - public static string Runtime_HostTypePropertyGettingFailed - { - get { return GetString("Runtime_HostTypePropertyGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." - /// - public static string Runtime_HostTypePropertySettingFailed - { - get { return GetString("Runtime_HostTypePropertySettingFailed"); } - } - /// /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." /// @@ -339,14 +219,6 @@ public static string Runtime_InvalidFunctionNameFormat get { return GetString("Runtime_InvalidFunctionNameFormat"); } } - /// - /// Looks up a localized string similar to "The parser you passed implements neither `IActiveScriptParse32` nor `IActiveScriptParse64`." - /// - public static string Runtime_InvalidParserImplementationError - { - get { return GetString("Runtime_InvalidParserImplementationError"); } - } - /// /// Looks up a localized string similar to "The script item name '{0}' has incorrect format." /// @@ -355,30 +227,6 @@ public static string Runtime_InvalidScriptItemNameFormat get { return GetString("Runtime_InvalidScriptItemNameFormat"); } } - /// - /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." - /// - public static string Runtime_InvalidThisContextForHostObjectField - { - get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } - } - - /// - /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." - /// - public static string Runtime_InvalidThisContextForHostObjectMethod - { - get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } - } - - /// - /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." - /// - public static string Runtime_InvalidThisContextForHostObjectProperty - { - get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } - } - /// /// Looks up a localized string similar to "The variable name '{0}' has incorrect format." /// @@ -387,22 +235,6 @@ public static string Runtime_InvalidVariableNameFormat get { return GetString("Runtime_InvalidVariableNameFormat"); } } - /// - /// Looks up a localized string similar to "Item with name '{0}' not found." - /// - public static string Runtime_ItemNotFound - { - get { return GetString("Runtime_ItemNotFound"); } - } - - /// - /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." - /// - public static string Runtime_JsEngineModeNotCompatibleWithNetCore - { - get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } - } - /// /// Looks up a localized string similar to "Selected '{0}' mode of JavaScript engine is not supported." /// @@ -427,22 +259,6 @@ public static string Runtime_JsEnginesConflictOnMachine get { return GetString("Runtime_JsEnginesConflictOnMachine"); } } - /// - /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." - /// - public static string Runtime_JsEnginesForNetCoreNotFound - { - get { return GetString("Runtime_JsEnginesForNetCoreNotFound"); } - } - - /// - /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." - /// - public static string Runtime_JsEnginesNotFound - { - get { return GetString("Runtime_JsEnginesNotFound"); } - } - /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// @@ -451,30 +267,6 @@ public static string Runtime_ReturnValueTypeNotSupported get { return GetString("Runtime_ReturnValueTypeNotSupported"); } } - /// - /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." - /// - public static string Runtime_SuitableConstructorOfHostTypeNotFound - { - get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } - } - - /// - /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." - /// - public static string Runtime_SuitableMethodOfHostObjectNotFound - { - get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } - } - - /// - /// Looks up a localized string similar to "The variable with the name '{0}' does not exist." - /// - public static string Runtime_VariableNotExist - { - get { return GetString("Runtime_VariableNotExist"); } - } - /// /// Looks up a localized string similar to "The variable '{0}' has a type `{1}`, which is not supported." /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx new file mode 100644 index 0000000..08f0ff2 --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The parameter '{0}' must be a non-empty string. + + + The parameter '{0}' must be a non-nullable. + + + Cannot convert object of type `{0}` to type `{1}`. + + + File '{0}' not exist. + + + Cannot convert null to a value type. + + + Category + + + Column number + + + Engine mode + + + Error code + + + Line number + + + Message + + + Source fragment + + + Resource with name '{0}' is null. + + + Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. +See more details: + +{0} + + + The embedded host object '{0}' has a type `{1}`, which is not supported. + + + The embedded host type `{0}` is not supported. + + + The function with the name '{0}' does not exist. + + + One of the function parameters '{0}' has a type `{1}`, which is not supported. + + + Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. +See more details: + +{2} + + + The function name '{0}' has incorrect format. + + + The script item name '{0}' has incorrect format. + + + The variable name '{0}' has incorrect format. + + + Selected '{0}' mode of JavaScript engine is not supported. + + + It is prohibited to use the {0} and {1} engines in one process. + + + It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time. + + + The type of return value `{0}` is not supported. + + + The variable '{0}' has a type `{1}`, which is not supported. + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.Designer.cs similarity index 100% rename from src/MsieJavaScriptEngine/Resources/Strings.ru-ru.Designer.cs rename to src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.Designer.cs diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx new file mode 100644 index 0000000..2056c26 --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Параметр с именем "{0}" не должен содержать пустую строку! + + + Параметр с именем "{0}" не должен содержать значение равное null! + + + Невозможно преобразовать объект типа `{0}` в тип `{1}`! + + + Файл "{0}" не существует! + + + Невозможно преобразовать null в значимый тип! + + + Категория + + + Номер столбца + + + Режим движка + + + Код ошибки + + + Номер строки + + + Сообщение об ошибке + + + Фрагмент исходного кода + + + Ресурс с именем "{0}" содержит значение равное null! + + + Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. +Смотрите более подробную информацию об ошибке: + +{0} + + + Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! + + + Встраиваемый тип хоста `{0}` не поддерживается! + + + Функция с именем "{0}" не существует! + + + Один из параметров функции "{0}" имеет тип `{1}`, который не поддерживается! + + + Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. +Смотрите более подробную информацию об ошибке: + +{2} + + + Имя функции "{0}" имеет некорректный формат! + + + Имя скриптового элемента "{0}" имеет некорректный формат! + + + Имя переменной "{0}" имеет некорректный формат! + + + Выбранный вами режим JavaScript-движка "{0}" не поддерживается! + + + Нельзя использовать {0} и {1} движки в одном процессе. + + + Нельзя использовать Chakra JsRT и Chakra ActiveScript движки на одном компьютере одновременно. + + + Тип возвращаемого значения `{0}` не поддерживается! + + + Переменная "{0}" имеет тип `{1}`, который не поддерживается! + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs new file mode 100644 index 0000000..8f57048 --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -0,0 +1,229 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace MsieJavaScriptEngine.Resources +{ + using System; + using System.Globalization; + using System.Reflection; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + public class NetCoreStrings + { + private static Lazy _resourceManager = + new Lazy(() => new ResourceManager( + "MsieJavaScriptEngine.Resources.NetCoreStrings", +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 + typeof(NetCoreStrings).GetTypeInfo().Assembly +#elif NET40 + typeof(NetCoreStrings).Assembly +#else +#error No implementation for this target +#endif + )); + + private static CultureInfo _resourceCulture; + + /// + /// Returns a cached ResourceManager instance used by this class + /// + public static ResourceManager ResourceManager + { + get + { + return _resourceManager.Value; + } + } + + /// + /// Overrides a current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class + /// + public static CultureInfo Culture + { + get + { + return _resourceCulture; + } + set + { + _resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." + /// + public static string Runtime_HostDelegateInvocationFailed + { + get { return GetString("Runtime_HostDelegateInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." + /// + public static string Runtime_HostObjectFieldGettingFailed + { + get { return GetString("Runtime_HostObjectFieldGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." + /// + public static string Runtime_HostObjectFieldSettingFailed + { + get { return GetString("Runtime_HostObjectFieldSettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." + /// + public static string Runtime_HostObjectMethodInvocationFailed + { + get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." + /// + public static string Runtime_HostObjectPropertyGettingFailed + { + get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." + /// + public static string Runtime_HostObjectPropertySettingFailed + { + get { return GetString("Runtime_HostObjectPropertySettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." + /// + public static string Runtime_HostTypeConstructorInvocationFailed + { + get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." + /// + public static string Runtime_HostTypeConstructorNotFound + { + get { return GetString("Runtime_HostTypeConstructorNotFound"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." + /// + public static string Runtime_HostTypeFieldGettingFailed + { + get { return GetString("Runtime_HostTypeFieldGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." + /// + public static string Runtime_HostTypeFieldSettingFailed + { + get { return GetString("Runtime_HostTypeFieldSettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." + /// + public static string Runtime_HostTypeMethodInvocationFailed + { + get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." + /// + public static string Runtime_HostTypePropertyGettingFailed + { + get { return GetString("Runtime_HostTypePropertyGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." + /// + public static string Runtime_HostTypePropertySettingFailed + { + get { return GetString("Runtime_HostTypePropertySettingFailed"); } + } + + /// + /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." + /// + public static string Runtime_InvalidThisContextForHostObjectField + { + get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } + } + + /// + /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." + /// + public static string Runtime_InvalidThisContextForHostObjectMethod + { + get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } + } + + /// + /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." + /// + public static string Runtime_InvalidThisContextForHostObjectProperty + { + get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } + } + + /// + /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." + /// + public static string Runtime_JsEngineModeNotCompatibleWithNetCore + { + get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } + } + + /// + /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." + /// + public static string Runtime_JsEnginesNotFound + { + get { return GetString("Runtime_JsEnginesNotFound"); } + } + + /// + /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." + /// + public static string Runtime_SuitableConstructorOfHostTypeNotFound + { + get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } + } + + /// + /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." + /// + public static string Runtime_SuitableMethodOfHostObjectNotFound + { + get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } + } + + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); + + return value; + } + } + } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/Strings.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx similarity index 66% rename from src/MsieJavaScriptEngine/Resources/Strings.resx rename to src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx index a671e13..bcfdfd5 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx @@ -117,69 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - The parameter '{0}' must be a non-empty string. - - - The parameter '{0}' must be a non-nullable. - - - Cannot convert object of type `{0}` to type `{1}`. - - - File '{0}' not exist. - - - Cannot convert null to a value type. - - - Category - - - Column number - - - Engine mode - - - Error code - - - Line number - - - Message - - - Source fragment - - - Resource with name '{0}' is null. - - - ActiveScript dispatcher is not initialized. - - - Failed to set '{0}' version of script language for the ActiveScript JavaScript engine. - - - Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. -See more details: - -{0} - - - The embedded host object '{0}' has a type `{1}`, which is not supported. - - - The embedded host type `{0}` is not supported. - - - The function with the name '{0}' does not exist. - - - One of the function parameters '{0}' has a type `{1}`, which is not supported. - During invocation of the host delegate an error has occurred - “{0}”. @@ -219,21 +156,6 @@ See more details: During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”. - - Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. -See more details: - -{2} - - - The function name '{0}' has incorrect format. - - - The parser you passed implements neither `IActiveScriptParse32` nor `IActiveScriptParse64`. - - - The script item name '{0}' has incorrect format. - Could not retrieve field '{0}' of the host object, because there was an invalid `this` context. @@ -243,32 +165,11 @@ See more details: Could not retrieve property '{0}' of the host object, because there was an invalid `this` context. - - The variable name '{0}' has incorrect format. - - - Item with name '{0}' not found. - The '{0}' mode of JavaScript engine is not compatible with .NET Core. - - Selected '{0}' mode of JavaScript engine is not supported. - - - It is prohibited to use the {0} and {1} engines in one process. - - - It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time. - - - Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. - - Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer browser. - - - The type of return value `{0}` is not supported. + Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}` host type. @@ -276,10 +177,4 @@ See more details: Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object. - - The variable with the name '{0}' does not exist. - - - The variable '{0}' has a type `{1}`, which is not supported. - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.Designer.cs new file mode 100644 index 0000000..e69de29 diff --git a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx similarity index 63% rename from src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx rename to src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx index 130b48b..859ec26 100644 --- a/src/MsieJavaScriptEngine/Resources/Strings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx @@ -117,69 +117,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Параметр с именем "{0}" не должен содержать пустую строку! - - - Параметр с именем "{0}" не должен содержать значение равное null! - - - Невозможно преобразовать объект типа `{0}` в тип `{1}`! - - - Файл "{0}" не существует! - - - Невозможно преобразовать null в значимый тип! - - - Категория - - - Номер столбца - - - Режим движка - - - Код ошибки - - - Номер строки - - - Сообщение об ошибке - - - Фрагмент исходного кода - - - Ресурс с именем "{0}" содержит значение равное null! - - - ActiveScript-диспетчер не инициализирован! - - - Не удалось установить "{0}" версию языка сценариев для ActiveScript JavaScript-движка! - - - Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. -Смотрите более подробную информацию об ошибке: - -{0} - - - Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! - - - Встраиваемый тип хоста `{0}` не поддерживается! - - - Функция с именем "{0}" не существует! - - - Один из параметров функции "{0}" имеет тип `{1}`, который не поддерживается! - Во время вызова делегата хоста произошла ошибка - «{0}»! @@ -219,21 +156,6 @@ Во время присваивания значения свойству "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. -Смотрите более подробную информацию об ошибке: - -{2} - - - Имя функции "{0}" имеет некорректный формат! - - - Парсер, переданный вами, не реализует интерфейсы `IActiveScriptParse32` и `IActiveScriptParse64`! - - - Имя скриптового элемента "{0}" имеет некорректный формат! - Не удалось получить поле "{0}" объекта хоста, потому что контекст `this` недействителен! @@ -243,32 +165,11 @@ Не удалось получить свойство "{0}" объекта хоста, потому что контекст `this` недействителен! - - Имя переменной "{0}" имеет некорректный формат! - - - Элемент с именем "{0}" не найден! - Режим JavaScript-движка "{0}" не совместим с .NET Core! - - Выбранный вами режим JavaScript-движка "{0}" не поддерживается! - - - Нельзя использовать {0} и {1} движки в одном процессе. - - - Нельзя использовать Chakra JsRT и Chakra ActiveScript движки на одном компьютере одновременно. - - - Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. - - Не удалось найти ни один из JavaScript-движков! Возможно, на вашем компьютере не установлен браузер Internet Explorer. - - - Тип возвращаемого значения `{0}` не поддерживается! + Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. Не получается найти подходящий конструктор или не хватает аргументов для вызова конструктора `{0}` типа хоста! @@ -276,10 +177,4 @@ Не получается найти подходящий метод или не хватает аргументов для вызова метода "{0}" объекта хоста! - - Переменная с именем "{0}" не существует! - - - Переменная "{0}" имеет тип `{1}`, который не поддерживается! - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs new file mode 100644 index 0000000..221d426 --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -0,0 +1,117 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ +namespace MsieJavaScriptEngine.Resources +{ + using System; + using System.Globalization; + using System.Reflection; + using System.Resources; + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + public class NetFrameworkStrings + { + private static Lazy _resourceManager = + new Lazy(() => new ResourceManager( + "MsieJavaScriptEngine.Resources.NetFrameworkStrings", +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 + typeof(NetFrameworkStrings).GetTypeInfo().Assembly +#elif NET40 + typeof(NetFrameworkStrings).Assembly +#else +#error No implementation for this target +#endif + )); + + private static CultureInfo _resourceCulture; + + /// + /// Returns a cached ResourceManager instance used by this class + /// + public static ResourceManager ResourceManager + { + get + { + return _resourceManager.Value; + } + } + + /// + /// Overrides a current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class + /// + public static CultureInfo Culture + { + get + { + return _resourceCulture; + } + set + { + _resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." + /// + public static string Runtime_ActiveScriptDispatcherNotInitialized + { + get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } + } + + /// + /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." + /// + public static string Runtime_ActiveScriptLanguageVersionSelectionFailed + { + get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } + } + + /// + /// Looks up a localized string similar to "The parser you passed implements neither `IActiveScriptParse32` nor `IActiveScriptParse64`." + /// + public static string Runtime_InvalidParserImplementationError + { + get { return GetString("Runtime_InvalidParserImplementationError"); } + } + + /// + /// Looks up a localized string similar to "Item with name '{0}' not found." + /// + public static string Runtime_ItemNotFound + { + get { return GetString("Runtime_ItemNotFound"); } + } + + /// + /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." + /// + public static string Runtime_JsEnginesNotFound + { + get { return GetString("Runtime_JsEnginesNotFound"); } + } + + /// + /// Looks up a localized string similar to "The variable with the name '{0}' does not exist." + /// + public static string Runtime_VariableNotExist + { + get { return GetString("Runtime_VariableNotExist"); } + } + + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); + + return value; + } + } + } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx new file mode 100644 index 0000000..a792dfc --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ActiveScript dispatcher is not initialized. + + + Failed to set '{0}' version of script language for the ActiveScript JavaScript engine. + + + The parser you passed implements neither `IActiveScriptParse32` nor `IActiveScriptParse64`. + + + Item with name '{0}' not found. + + + Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer browser. + + + The variable with the name '{0}' does not exist. + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs new file mode 100644 index 0000000..e69de29 diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx new file mode 100644 index 0000000..7ac69b9 --- /dev/null +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ActiveScript-диспетчер не инициализирован! + + + Не удалось установить "{0}" версию языка сценариев для ActiveScript JavaScript-движка! + + + Парсер, переданный вами, не реализует интерфейсы `IActiveScriptParse32` и `IActiveScriptParse64`! + + + Элемент с именем "{0}" не найден! + + + Не удалось найти ни один из JavaScript-движков! Возможно, на вашем компьютере не установлен браузер Internet Explorer. + + + Переменная с именем "{0}" не существует! + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs index fcbec52..e847c0c 100644 --- a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs @@ -1,4 +1,5 @@ -using System; +#if NET40 +using System; using System.Reflection; namespace MsieJavaScriptEngine.Utilities @@ -23,4 +24,5 @@ public static MethodInfo GetMethodInfo(this Delegate source) return source.Method; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index ea3fdb8..e1944a5 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -120,7 +120,7 @@ private static bool ConvertObjectToType(object obj, Type type, bool throwOnError { if (throwOnError) { - throw new InvalidOperationException(Strings.Common_ValueTypeCannotBeNull); + throw new InvalidOperationException(CommonStrings.Common_ValueTypeCannotBeNull); } convertedObject = null; @@ -195,7 +195,7 @@ private static bool InnerConvertObjectToType(object obj, Type type, bool throwOn if (throwOnError) { throw new InvalidOperationException( - string.Format(Strings.Common_CannotConvertObjectToType, originalType, type) + string.Format(CommonStrings.Common_CannotConvertObjectToType, originalType, type) ); } diff --git a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs index 76039c0..cbe3353 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs @@ -17,11 +17,6 @@ internal static class TypeExtensions /// The code of the underlying type public static TypeCode GetTypeCode(this Type source) { - if (source == null) - { - throw new ArgumentNullException("source"); - } - TypeCode typeCode; #if NETSTANDARD1_3 diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs index d428726..c6e04d5 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs @@ -1,4 +1,5 @@ -using System; +#if NET40 +using System; using System.Reflection; namespace MsieJavaScriptEngine.Utilities @@ -73,4 +74,5 @@ public bool IsInstanceOfType(object o) return _type.IsInstanceOfType(o); } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index c930a8f..07ab735 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using System.Text; using MsieJavaScriptEngine.Resources; @@ -13,6 +14,7 @@ internal static class Utils /// Determines whether the current process is a 64-bit process /// /// true if the process is 64-bit; otherwise, false + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] public static bool Is64BitProcess() { #if NETSTANDARD1_3 @@ -50,7 +52,7 @@ public static string GetResourceAsString(string resourceName, Assembly assembly) if (stream == null) { throw new NullReferenceException( - string.Format(Strings.Resources_ResourceIsNull, resourceName)); + string.Format(CommonStrings.Resources_ResourceIsNull, resourceName)); } using (var reader = new StreamReader(stream)) @@ -71,7 +73,7 @@ public static string GetFileTextContent(string path, Encoding encoding = null) if (!File.Exists(path)) { throw new FileNotFoundException( - string.Format(Strings.Common_FileNotExist, path), path); + string.Format(CommonStrings.Common_FileNotExist, path), path); } string content; diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 39e5eb0..ab73cef 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -44,6 +44,7 @@ "Constants/SpecialMemberName.cs", "Helpers/ComHelpers.cs", "Helpers/TypeMappingHelpers.cs", + "Resources/NetFrameworkStrings.*", "Utilities/DelegateExtensions.cs", "Utilities/TypeInfo.cs", "HostItemBase.cs", @@ -60,7 +61,9 @@ "buildOptions": { "embed": [ "Resources/ES5.min.js", "Resources/json2.min.js" ], "compile": { - "excludeFiles": [ + "exclude": [ + "Helpers/ReflectionHelpers.cs", + "Resources/NetCoreStrings.*", "Utilities/DelegateExtensions.cs", "Utilities/TypeInfo.cs", "Utilities/TypeInfoExtensions.cs" diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs index 90613ad..ecf6dc1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs @@ -1,4 +1,5 @@ -using System; +#if NETCOREAPP1_0 +using System; using System.Text; namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing @@ -382,4 +383,5 @@ public override string ToString() return sb.ToString(); } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs index 42995bd..09a59e5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing +#if NETCOREAPP1_0 +namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing { /// /// Specifies the known system colors @@ -7,4 +8,5 @@ public enum KnownColor { OrangeRed = 128 } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs index 1ae76a2..162ad55 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs @@ -1,4 +1,5 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing +#if NETCOREAPP1_0 +namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing { internal static class KnownColorTable { @@ -22,4 +23,5 @@ public static string KnownColorToName(KnownColor color) return null; } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs index 0c07950..1af2144 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs @@ -1,4 +1,5 @@ -using System.Globalization; +#if NETCOREAPP1_0 +using System.Globalization; namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing { @@ -74,4 +75,5 @@ public override string ToString() ; } } -} \ No newline at end of file +} +#endif \ No newline at end of file From 40cb4daf7980bbd3ad16a47f040fb170b08fa3be Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 6 Sep 2016 19:30:58 +0300 Subject: [PATCH 040/238] Added the `CollectGarbage` method --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 36 ++++++++++++++++++- .../IActiveScriptGarbageCollector.cs | 22 ++++++++++++ .../ActiveScript/ScriptGCType.cs | 20 +++++++++++ .../Helpers/ComHelpers.cs | 12 +++++++ src/MsieJavaScriptEngine/IInnerJsEngine.cs | 5 +++ .../JsRt/ChakraJsRtJsEngineBase.cs | 2 ++ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 8 +++++ .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 8 +++++ .../MsieJavaScriptEngine.Net40.csproj | 2 ++ src/MsieJavaScriptEngine/MsieJsEngine.cs | 10 ++++++ .../CommonTestsBase.cs | 18 ++++++++++ 11 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs create mode 100644 src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 2792b1f..4d3e7af 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -36,16 +36,26 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine, IActiveScript /// private IntPtr _pActiveScript; + /// + /// Pointer to an instance of garbage collector + /// + private IntPtr _pActiveScriptGarbageCollector; + /// /// Instance of native JavaScript engine /// private IActiveScript _activeScript; /// - /// Instance of ActiveScriptParseWrapper + /// Instance of /// private IActiveScriptParseWrapper _activeScriptParse; + /// + /// Instance of + /// + private IActiveScriptGarbageCollector _activeScriptGarbageCollector; + /// /// Instance of script dispatch /// @@ -134,6 +144,9 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string _activeScriptParse = new ActiveScriptParseWrapper(_pActiveScript, _activeScript); _activeScriptParse.InitNew(); + _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow(_pActiveScript); + _activeScriptGarbageCollector = _activeScript as IActiveScriptGarbageCollector; + _activeScript.SetScriptSite(this); _activeScript.SetScriptState(ScriptState.Started); @@ -481,6 +494,18 @@ private void EmbedHostItem(string itemName, object value) }); } + /// + /// Starts a garbage collection + /// + /// The type of garbage collection + private void InnerCollectGarbage(ScriptGCType type) + { + if (_activeScriptGarbageCollector != null) + { + _activeScriptGarbageCollector.CollectGarbage(type); + } + } + /// /// Loads a resources /// @@ -541,6 +566,9 @@ private void Dispose(bool disposing) _dispatch = null; } + _activeScriptGarbageCollector = null; + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptGarbageCollector); + if (_activeScriptParse != null) { _activeScriptParse.Dispose(); @@ -550,6 +578,7 @@ private void Dispose(bool disposing) if (_activeScript != null) { _activeScript.Close(); + Marshal.FinalReleaseComObject(_activeScript); _activeScript = null; } @@ -796,6 +825,11 @@ public void EmbedHostType(string itemName, Type type) EmbedHostItem(itemName, typeValue); } + public void CollectGarbage() + { + InvokeScript(() => InnerCollectGarbage(ScriptGCType.Exhaustive)); + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs new file mode 100644 index 0000000..4a1ad56 --- /dev/null +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs @@ -0,0 +1,22 @@ +#if !NETSTANDARD1_3 +using System.Runtime.InteropServices; + +namespace MsieJavaScriptEngine.ActiveScript +{ + /// + /// Provides a method to start garbage collection. + /// This interface should be implemented by Active Script engines that want to clean up their resources. + /// + [ComImport] + [Guid("6aa2c4a0-2b53-11d4-a2a0-00104bd35090")] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IActiveScriptGarbageCollector + { + /// + /// Starts a garbage collection + /// + /// The type of garbage collection + void CollectGarbage([In] ScriptGCType type); + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs new file mode 100644 index 0000000..76798e5 --- /dev/null +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs @@ -0,0 +1,20 @@ +#if !NETSTANDARD1_3 +namespace MsieJavaScriptEngine.ActiveScript +{ + /// + /// The type of garbage collection + /// + internal enum ScriptGCType + { + /// + /// Do normal garbage collection + /// + Normal = 0, + + /// + /// Do exhaustive garbage collection + /// + Exhaustive = 1 + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 1584155..e609771 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -62,6 +62,15 @@ public static IntPtr QueryInterface(IntPtr pUnknown) return pInterface; } + public static IntPtr QueryInterfaceNoThrow(IntPtr pUnknown) + { + IntPtr pInterface; + Guid iid = typeof(T).GetTypeInfo().GUID; + int result = Marshal.QueryInterface(pUnknown, ref iid, out pInterface); + + return result == HResult.S_OK ? pInterface : IntPtr.Zero; + } + public static void ReleaseAndEmpty(ref IntPtr pUnk) { if (pUnk != IntPtr.Zero) @@ -126,6 +135,9 @@ public static class HResult // ReSharper disable InconsistentNaming public const int SEVERITY_SUCCESS = 0; public const int SEVERITY_ERROR = 1; + + public const int S_OK = 0; + public const int S_FALSE = 1; // ReSharper restore InconsistentNaming public static void Check(uint result) diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index bd65a10..fd4b5a1 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -79,5 +79,10 @@ internal interface IInnerJsEngine : IDisposable /// methods are bound to the type's static members. /// void EmbedHostType(string itemName, Type type); + + /// + /// Performs a full garbage collection + /// + void CollectGarbage(); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 7e25f9b..e83e822 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -129,6 +129,8 @@ private void ExternalObjectFinalizeCallback(IntPtr data) public abstract void EmbedHostType(string itemName, Type type); + public abstract void CollectGarbage(); + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 50ff9ad..17bdf3d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1037,6 +1037,14 @@ public override void EmbedHostType(string itemName, Type type) }); } + public override void CollectGarbage() + { + lock (_executionSynchronizer) + { + _jsRuntime.CollectGarbage(); + } + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index ca4835e..ac19edb 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1076,6 +1076,14 @@ public override void EmbedHostType(string itemName, Type type) }); } + public override void CollectGarbage() + { + lock (_executionSynchronizer) + { + _jsRuntime.CollectGarbage(); + } + } + #endregion #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj index 6fd8a44..6995dc3 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj @@ -49,6 +49,8 @@ + + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 0344944..743e0c0 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -733,6 +733,16 @@ public void EmbedHostType(string itemName, Type type) _jsEngine.EmbedHostType(itemName, type); } + /// + /// Performs a full garbage collection + /// + public void CollectGarbage() + { + VerifyNotDisposed(); + + _jsEngine.CollectGarbage(); + } + #region IDisposable implementation /// diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 6897987..4c0c5fe 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -766,5 +766,23 @@ public virtual void RemovingVariableIsCorrect() } #endregion + + #region Garbage collection + + [Test] + public virtual void GarbageCollectionIsCorrect() + { + // Arrange + const string input = @"arr = []; for (i = 0; i < 1000000; i++) { arr.push(arr); }"; + + // Act + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(input); + jsEngine.CollectGarbage(); + } + } + + #endregion } } \ No newline at end of file From c687c67319e1f8737315f92a5969e927a69e6a95 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 8 Sep 2016 13:55:36 +0300 Subject: [PATCH 041/238] .NET 4.0 projects have been moved into separate directories --- MsieJavaScriptEngine.Net4.sln | 14 +- NuGet/build-package.cmd | 28 +- makefile.shade | 2 +- .../MsieJavaScriptEngine.Net40.csproj | 434 ++++++++++++++++++ .../Utilities/DelegateExtensions.cs | 0 .../Utilities/TypeInfo.cs | 0 .../bundleconfig.json | 14 + .../packages.config | 0 .../MsieJavaScriptEngine.Net40.csproj | 201 -------- .../MsieJavaScriptEngine.xproj | 7 - src/MsieJavaScriptEngine/project.json | 4 - ...sieJavaScriptEngine.Test.Auto.Net40.csproj | 27 +- .../packages.config | 0 .../MsieJavaScriptEngine.Test.Auto.xproj | 3 - ...ngine.Test.ChakraActiveScript.Net40.csproj | 27 +- .../packages.config | 0 ...ScriptEngine.Test.ChakraActiveScript.xproj | 3 - ...iptEngine.Test.ChakraEdgeJsRt.Net40.csproj | 27 +- .../packages.config | 0 ...JavaScriptEngine.Test.ChakraEdgeJsRt.xproj | 3 - ...criptEngine.Test.ChakraIeJsRt.Net40.csproj | 27 +- .../packages.config | 0 ...ieJavaScriptEngine.Test.ChakraIeJsRt.xproj | 3 - ...JavaScriptEngine.Test.Classic.Net40.csproj | 27 +- .../packages.config | 0 .../MsieJavaScriptEngine.Test.Classic.xproj | 3 - ...eJavaScriptEngine.Test.Common.Net40.csproj | 81 +++- .../packages.config | 0 .../MsieJavaScriptEngine.Test.Common.xproj | 3 - test/MsieJavaScriptEngine.Test.Net4.nunit | 19 + test/MsieJavaScriptEngine.Test.nunit | 19 - 31 files changed, 645 insertions(+), 331 deletions(-) create mode 100644 src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj rename src/{MsieJavaScriptEngine => MsieJavaScriptEngine.Net4}/Utilities/DelegateExtensions.cs (100%) rename src/{MsieJavaScriptEngine => MsieJavaScriptEngine.Net4}/Utilities/TypeInfo.cs (100%) create mode 100644 src/MsieJavaScriptEngine.Net4/bundleconfig.json rename src/{MsieJavaScriptEngine => MsieJavaScriptEngine.Net4}/packages.config (100%) delete mode 100644 src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj rename test/{MsieJavaScriptEngine.Test.Auto => MsieJavaScriptEngine.Test.Auto.Net4}/MsieJavaScriptEngine.Test.Auto.Net40.csproj (83%) rename test/{MsieJavaScriptEngine.Test.Auto => MsieJavaScriptEngine.Test.Auto.Net4}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test.ChakraActiveScript => MsieJavaScriptEngine.Test.ChakraActiveScript.Net4}/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj (82%) rename test/{MsieJavaScriptEngine.Test.ChakraActiveScript => MsieJavaScriptEngine.Test.ChakraActiveScript.Net4}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test.ChakraEdgeJsRt => MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4}/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj (82%) rename test/{MsieJavaScriptEngine.Test.ChakraEdgeJsRt => MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test.ChakraIeJsRt => MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4}/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj (83%) rename test/{MsieJavaScriptEngine.Test.ChakraIeJsRt => MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test.Classic => MsieJavaScriptEngine.Test.Classic.Net4}/MsieJavaScriptEngine.Test.Classic.Net40.csproj (83%) rename test/{MsieJavaScriptEngine.Test.Classic => MsieJavaScriptEngine.Test.Classic.Net4}/packages.config (100%) rename test/{MsieJavaScriptEngine.Test.Common => MsieJavaScriptEngine.Test.Common.Net4}/MsieJavaScriptEngine.Test.Common.Net40.csproj (57%) rename test/{MsieJavaScriptEngine.Test.Common => MsieJavaScriptEngine.Test.Common.Net4}/packages.config (100%) create mode 100644 test/MsieJavaScriptEngine.Test.Net4.nunit delete mode 100644 test/MsieJavaScriptEngine.Test.nunit diff --git a/MsieJavaScriptEngine.Net4.sln b/MsieJavaScriptEngine.Net4.sln index 1887e03..c3f5830 100644 --- a/MsieJavaScriptEngine.Net4.sln +++ b/MsieJavaScriptEngine.Net4.sln @@ -18,19 +18,19 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles" test\SharedFiles\square.js = test\SharedFiles\square.js EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Net40", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.Net40.csproj", "{D672BC49-C454-4975-BD25-A555B9BDD793}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Net40", "src\MsieJavaScriptEngine.Net4\MsieJavaScriptEngine.Net40.csproj", "{D672BC49-C454-4975-BD25-A555B9BDD793}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Common.Net40", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.Net40.csproj", "{A4085B9E-A5D3-4749-BD07-6D1EB7C23820}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Common.Net40", "test\MsieJavaScriptEngine.Test.Common.Net4\MsieJavaScriptEngine.Test.Common.Net40.csproj", "{A4085B9E-A5D3-4749-BD07-6D1EB7C23820}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Auto.Net40", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.Net40.csproj", "{A4874C43-2097-4FDB-882A-0D74E5508BBD}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Auto.Net40", "test\MsieJavaScriptEngine.Test.Auto.Net4\MsieJavaScriptEngine.Test.Auto.Net40.csproj", "{A4874C43-2097-4FDB-882A-0D74E5508BBD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj", "{16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj", "{16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt\MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj", "{7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4\MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj", "{7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraActiveScript.Net40", "test\MsieJavaScriptEngine.Test.ChakraActiveScript\MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj", "{21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraActiveScript.Net40", "test\MsieJavaScriptEngine.Test.ChakraActiveScript.Net4\MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj", "{21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic.Net40", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.Net40.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic.Net40", "test\MsieJavaScriptEngine.Test.Classic.Net4\MsieJavaScriptEngine.Test.Classic.Net40.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index 2aa6bbc..eef5158 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -1,6 +1,8 @@ set project_name=MsieJavaScriptEngine -set project_source_dir=..\src\%project_name% -set project_bin_dir=%project_source_dir%\bin\Release +set net4_project_source_dir=..\src\%project_name%.Net4 +set net4_project_bin_dir=%net4_project_source_dir%\bin\Release +set dotnet_project_source_dir=..\src\%project_name% +set dotnet_project_bin_dir=%project_source_dir%\bin\Release set licenses_dir=..\Licenses set net40_msbuild="\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" set dotnet_cli="%ProgramFiles%\dotnet\dotnet.exe" @@ -14,19 +16,19 @@ del jsrt-dotnet-license.txt /Q/S del cross-browser-split-license.txt /Q/S del bundler-and-minifier-license.txt /Q/S -%net40_msbuild% "%project_source_dir%\%project_name%.Net40.csproj" /p:Configuration=Release -xcopy "%project_bin_dir%\%project_name%.dll" lib\net40-client\ -xcopy "%project_bin_dir%\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ +%net40_msbuild% "%net4_project_source_dir%\%project_name%.Net40.csproj" /p:Configuration=Release +xcopy "%net4_project_bin_dir%\%project_name%.dll" lib\net40-client\ +xcopy "%net4_project_bin_dir%\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ -%dotnet_cli% build "%project_source_dir%" --framework net451 --configuration Release --no-dependencies --no-incremental -xcopy "%project_bin_dir%\net451\%project_name%.dll" lib\net451\ -xcopy "%project_bin_dir%\net451\%project_name%.xml" lib\net451\ -xcopy "%project_bin_dir%\net451\ru-ru\%project_name%.resources.dll" lib\net451\ru-ru\ +%dotnet_cli% build "%dotnet_project_source_dir%" --framework net451 --configuration Release --no-dependencies --no-incremental +xcopy "%dotnet_project_bin_dir%\net451\%project_name%.dll" lib\net451\ +xcopy "%dotnet_project_bin_dir%\net451\%project_name%.xml" lib\net451\ +xcopy "%dotnet_project_bin_dir%\net451\ru-ru\%project_name%.resources.dll" lib\net451\ru-ru\ -%dotnet_cli% build "%project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental -xcopy "%project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ -xcopy "%project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ -xcopy "%project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ +%dotnet_cli% build "%dotnet_project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental +xcopy "%dotnet_project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ +xcopy "%dotnet_project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ +xcopy "%dotnet_project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ copy "%licenses_dir%\sass-and-coffee-license.txt" sass-and-coffee-license.txt /Y copy "%licenses_dir%\chakra-host-license.txt" chakra-host-license.txt /Y diff --git a/makefile.shade b/makefile.shade index 2d23eb5..891f0b4 100644 --- a/makefile.shade +++ b/makefile.shade @@ -74,7 +74,7 @@ use-standard-lifecycle Log.Info('Run unit tests for .NET 4.0 version:'); Log.Info(''); - Exec(nunitConsolePath, 'MsieJavaScriptEngine.Test.nunit --verbose', testDirPath); + Exec(nunitConsolePath, 'MsieJavaScriptEngine.Test.Net4.nunit --verbose', testDirPath); Log.Info(''); } diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj new file mode 100644 index 0000000..fedbcb5 --- /dev/null +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -0,0 +1,434 @@ + + + + + Debug + AnyCPU + {D672BC49-C454-4975-BD25-A555B9BDD793} + Library + Properties + MsieJavaScriptEngine + MsieJavaScriptEngine + v4.0 + 512 + Client + ..\..\ + true + 673c479a + + + AnyCPU + true + full + false + bin\Debug\ + TRACE;DEBUG;NET40 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE;NET40 + prompt + 4 + + + + + + true + + + ..\..\tools\Key.snk + + + + ActiveScript\ActiveScriptException.cs + + + ActiveScript\ActiveScriptJsEngineBase.cs + + + ActiveScript\ActiveScriptParseWrapper.cs + + + ActiveScript\ChakraActiveScriptJsEngine.cs + + + ActiveScript\ClassicActiveScriptJsEngine.cs + + + ActiveScript\IActiveScript.cs + + + ActiveScript\IActiveScriptError.cs + + + ActiveScript\IActiveScriptGarbageCollector.cs + + + ActiveScript\IActiveScriptParse32.cs + + + ActiveScript\IActiveScriptParse64.cs + + + ActiveScript\IActiveScriptParseWrapper.cs + + + ActiveScript\IActiveScriptProperty.cs + + + ActiveScript\IActiveScriptSite.cs + + + ActiveScript\ScriptGCType.cs + + + ActiveScript\ScriptHResult.cs + + + ActiveScript\ScriptInfoFlags.cs + + + ActiveScript\ScriptInterruptFlags.cs + + + ActiveScript\ScriptItemFlags.cs + + + ActiveScript\ScriptLanguageVersion.cs + + + ActiveScript\ScriptProperty.cs + + + ActiveScript\ScriptState.cs + + + ActiveScript\ScriptTextFlags.cs + + + ActiveScript\ScriptThreadState.cs + + + ActiveScript\ScriptTypeLibFlags.cs + + + Constants\ComErrorCode.cs + + + Constants\DllName.cs + + + Constants\SpecialMemberName.cs + + + Helpers\ComHelpers.cs + + + Helpers\JsEngineModeHelpers.cs + + + Helpers\JsErrorHelpers.cs + + + Helpers\NumericHelpers.cs + + + Helpers\TypeMappingHelpers.cs + + + Helpers\ValidationHelpers.cs + + + HostItemBase.cs + + + HostObject.cs + + + HostType.cs + + + IInnerJsEngine.cs + + + InterlockedStatedFlag.cs + + + JsEngineLoadException.cs + + + JsEngineMode.cs + + + JsEngineSettings.cs + + + JsException.cs + + + JsRt\ChakraJsRtJsEngineBase.cs + + + JsRt\Edge\ChakraEdgeJsRtJsEngine.cs + + + JsRt\Edge\EdgeJsContext.cs + + + JsRt\Edge\EdgeJsErrorHelpers.cs + + + JsRt\Edge\EdgeJsNativeFunction.cs + + + JsRt\Edge\EdgeJsPropertyId.cs + + + JsRt\Edge\EdgeJsRuntime.cs + + + JsRt\Edge\EdgeJsScope.cs + + + JsRt\Edge\EdgeJsScriptException.cs + + + JsRt\Edge\EdgeJsValue.cs + + + JsRt\Edge\EdgeJsValueExtensions.cs + + + JsRt\Edge\EdgeNativeMethods.cs + + + JsRt\IActiveScriptProfilerCallback.cs + + + JsRt\IActiveScriptProfilerCallback2.cs + + + JsRt\IActiveScriptProfilerHeapEnum.cs + + + JsRt\Ie\ChakraIeJsRtJsEngine.cs + + + JsRt\Ie\IDebugApplication32.cs + + + JsRt\Ie\IDebugApplication64.cs + + + JsRt\Ie\IDebugDocumentHelper32.cs + + + JsRt\Ie\IDebugDocumentHelper64.cs + + + JsRt\Ie\IeJsContext.cs + + + JsRt\Ie\IeJsErrorHelpers.cs + + + JsRt\Ie\IeJsNativeFunction.cs + + + JsRt\Ie\IeJsPropertyId.cs + + + JsRt\Ie\IeJsRuntime.cs + + + JsRt\Ie\IeJsScope.cs + + + JsRt\Ie\IeJsScriptException.cs + + + JsRt\Ie\IeJsValue.cs + + + JsRt\Ie\IeJsValueExtensions.cs + + + JsRt\Ie\IeNativeMethods.cs + + + JsRt\Ie\IProcessDebugManager32.cs + + + JsRt\Ie\IProcessDebugManager64.cs + + + JsRt\Ie\ProcessDebugManager.cs + + + JsRt\JsBackgroundWorkItemCallback.cs + + + JsRt\JsBeforeCollectCallback.cs + + + JsRt\JsEngineException.cs + + + JsRt\JsErrorCode.cs + + + JsRt\JsException.cs + + + JsRt\JsFatalException.cs + + + JsRt\JsMemoryAllocationCallback.cs + + + JsRt\JsMemoryEventType.cs + + + JsRt\JsObjectFinalizeCallback.cs + + + JsRt\JsRuntimeAttributes.cs + + + JsRt\JsRuntimeVersion.cs + + + JsRt\JsSourceContext.cs + + + JsRt\JsThreadServiceCallback.cs + + + JsRt\JsUsageException.cs + + + JsRt\JsValueType.cs + + + JsRt\ProfilerEventMask.cs + + + JsRt\ProfilerScriptType.cs + + + JsRuntimeException.cs + + + MsieJsEngine.cs + + + NotSupportedTypeException.cs + + + AssemblyInfo.cs + + + Resources\CommonStrings.Designer.cs + + + Resources\CommonStrings.ru-ru.Designer.cs + + + Resources\NetFrameworkStrings.Designer.cs + + + Resources\NetFrameworkStrings.ru-ru.Designer.cs + + + StatedFlag.cs + + + Undefined.cs + + + Utilities\StringBuilderExtensions.cs + + + Utilities\TypeConverter.cs + + + Utilities\TypeExtensions.cs + + + Utilities\Utils.cs + + + + + + + + + + + Key.snk + + + + + + + + + + Resources\CommonStrings.resx + + + Resources\CommonStrings.ru-ru.resx + + + Resources\NetFrameworkStrings.resx + + + Resources\NetFrameworkStrings.ru-ru.resx + + + + + Resources\ES5.js + + + Resources\ES5.min.js + + + Resources\json2.js + + + Resources\json2.min.js + + + + + SET VS_PROJECT_DIR=$(ProjectDir)..\MsieJavaScriptEngine + +cd "$(ProjectDir)..\..\" +build resx + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs b/src/MsieJavaScriptEngine.Net4/Utilities/DelegateExtensions.cs similarity index 100% rename from src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs rename to src/MsieJavaScriptEngine.Net4/Utilities/DelegateExtensions.cs diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs b/src/MsieJavaScriptEngine.Net4/Utilities/TypeInfo.cs similarity index 100% rename from src/MsieJavaScriptEngine/Utilities/TypeInfo.cs rename to src/MsieJavaScriptEngine.Net4/Utilities/TypeInfo.cs diff --git a/src/MsieJavaScriptEngine.Net4/bundleconfig.json b/src/MsieJavaScriptEngine.Net4/bundleconfig.json new file mode 100644 index 0000000..7f8d32a --- /dev/null +++ b/src/MsieJavaScriptEngine.Net4/bundleconfig.json @@ -0,0 +1,14 @@ +[ + { + "outputFileName": "../MsieJavaScriptEngine/Resources/ES5.min.js", + "inputFiles": [ + "../MsieJavaScriptEngine/Resources/ES5.js" + ] + }, + { + "outputFileName": "../MsieJavaScriptEngine/Resources/json2.min.js", + "inputFiles": [ + "../MsieJavaScriptEngine/Resources/json2.js" + ] + } +] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/packages.config b/src/MsieJavaScriptEngine.Net4/packages.config similarity index 100% rename from src/MsieJavaScriptEngine/packages.config rename to src/MsieJavaScriptEngine.Net4/packages.config diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj deleted file mode 100644 index 6995dc3..0000000 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.Net40.csproj +++ /dev/null @@ -1,201 +0,0 @@ - - - - - Debug - AnyCPU - {D672BC49-C454-4975-BD25-A555B9BDD793} - Library - Properties - MsieJavaScriptEngine - MsieJavaScriptEngine - v4.0 - 512 - Client - ..\..\ - true - 673c479a - - - AnyCPU - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - - - - - - true - - - ..\..\tools\Key.snk - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Key.snk - - - - - - - SET VS_PROJECT_DIR=$(ProjectDir) - -cd "$(ProjectDir)..\..\" -build resx - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj index c2f6fef..525301c 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj @@ -15,12 +15,5 @@ 2.0 - - - - - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index ab73cef..49baaf5 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -45,8 +45,6 @@ "Helpers/ComHelpers.cs", "Helpers/TypeMappingHelpers.cs", "Resources/NetFrameworkStrings.*", - "Utilities/DelegateExtensions.cs", - "Utilities/TypeInfo.cs", "HostItemBase.cs", "HostObject.cs", "HostType.cs" @@ -64,8 +62,6 @@ "exclude": [ "Helpers/ReflectionHelpers.cs", "Resources/NetCoreStrings.*", - "Utilities/DelegateExtensions.cs", - "Utilities/TypeInfo.cs", "Utilities/TypeInfoExtensions.cs" ] } diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.Net40.csproj b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj similarity index 83% rename from test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.Net40.csproj rename to test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj index bfe4224..e7b85a9 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj @@ -42,17 +42,11 @@ - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} MsieJavaScriptEngine.Test.Common.Net40 @@ -60,6 +54,23 @@ + + + CommonTests.cs + + + Es5Tests.cs + + + InteropTests.cs + + + AssemblyInfo.cs + + + + + diff --git a/test/MsieJavaScriptEngine.Test.Auto/packages.config b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.Auto/packages.config rename to test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.xproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.xproj index b4f030a..beced51 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.xproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj similarity index 82% rename from test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj rename to test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj index 81fc0c8..d46fc4c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj @@ -41,25 +41,36 @@ - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} MsieJavaScriptEngine.Test.Common.Net40 + + + CommonTests.cs + + + Es5Tests.cs + + + InteropTests.cs + + + AssemblyInfo.cs + + + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.ChakraActiveScript/packages.config rename to test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.xproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.xproj index da3d1a4..6ec09cf 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.xproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj similarity index 82% rename from test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj rename to test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj index e59f199..da853b6 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj @@ -41,25 +41,36 @@ - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} MsieJavaScriptEngine.Test.Common.Net40 + + + CommonTests.cs + + + Es5Tests.cs + + + InteropTests.cs + + + AssemblyInfo.cs + + + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/packages.config rename to test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj index 016c3fe..d93b091 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj similarity index 83% rename from test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj rename to test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj index 0e41c10..0281293 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj @@ -41,25 +41,36 @@ - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} MsieJavaScriptEngine.Test.Common.Net40 + + + CommonTests.cs + + + Es5Tests.cs + + + InteropTests.cs + + + AssemblyInfo.cs + + + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.ChakraIeJsRt/packages.config rename to test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj index ae24153..a17d6c7 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.Net40.csproj b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj similarity index 83% rename from test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.Net40.csproj rename to test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj index 1fca666..e494809 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj @@ -41,25 +41,36 @@ - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - + {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} MsieJavaScriptEngine.Test.Common.Net40 + + + CommonTests.cs + + + Es5Tests.cs + + + InteropTests.cs + + + AssemblyInfo.cs + + + + + diff --git a/test/MsieJavaScriptEngine.Test.Classic/packages.config b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.Classic/packages.config rename to test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.xproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.xproj index 19db4d1..559a84b 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.xproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj similarity index 57% rename from test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.Net40.csproj rename to test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj index f77b9ef..9feec5b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj @@ -42,36 +42,75 @@ - - - - - - - - - - - - - - - - - - - + {d672bc49-c454-4975-bd25-a555b9bdd793} MsieJavaScriptEngine.Net40 - - + + CommonTestsBase.cs + + + Es5TestsBase.cs + + + FileSystemTestsBase.cs + + + InteropTestsBase.cs + + + Interop\Base64Encoder.cs + + + Interop\BundleTable.cs + + + Interop\Date.cs + + + Interop\FileManager.cs + + + Interop\Person.cs + + + Interop\Point3D.cs + + + Interop\PredefinedStrings.cs + + + Interop\Product.cs + + + Interop\SimpleSingleton.cs + + + Interop\Temperature.cs + + + AssemblyInfo.cs + + + ValidationTests.cs + + + + + Resources\cube.js + + + Resources\power.js + + + + diff --git a/test/MsieJavaScriptEngine.Test.Common/packages.config b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config similarity index 100% rename from test/MsieJavaScriptEngine.Test.Common/packages.config rename to test/MsieJavaScriptEngine.Test.Common.Net4/packages.config diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.xproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.xproj index 7b930cd..5d14bde 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.xproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.xproj @@ -15,8 +15,5 @@ 2.0 - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Net4.nunit b/test/MsieJavaScriptEngine.Test.Net4.nunit new file mode 100644 index 0000000..e617cb8 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Net4.nunit @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.nunit b/test/MsieJavaScriptEngine.Test.nunit deleted file mode 100644 index 0af6bb7..0000000 --- a/test/MsieJavaScriptEngine.Test.nunit +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 50d13f352a5e4708a774fb2e25b3a9d862cc91c3 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 8 Sep 2016 14:53:57 +0300 Subject: [PATCH 042/238] Fixed a error in `NuGet/build-package.cmd` file --- NuGet/build-package.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index eef5158..a543c8b 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -2,7 +2,7 @@ set project_name=MsieJavaScriptEngine set net4_project_source_dir=..\src\%project_name%.Net4 set net4_project_bin_dir=%net4_project_source_dir%\bin\Release set dotnet_project_source_dir=..\src\%project_name% -set dotnet_project_bin_dir=%project_source_dir%\bin\Release +set dotnet_project_bin_dir=%dotnet_project_source_dir%\bin\Release set licenses_dir=..\Licenses set net40_msbuild="\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" set dotnet_cli="%ProgramFiles%\dotnet\dotnet.exe" From ea6a33fe3c331b8d245992f9f0180222daf92b31 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 9 Sep 2016 18:20:33 +0300 Subject: [PATCH 043/238] Version 2.0.0 Beta 1 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 4 ++-- NuGet/readme.txt | 5 ++--- src/MsieJavaScriptEngine/project.json | 2 +- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../project.json | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 10 files changed, 20 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2e922d..8cec88b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## September 9, 2016 - v2.0.0 Beta 1 + * Added the `CollectGarbage` method + ## September 3, 2016 - v2.0.0 Alpha 1 * Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1 diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 1802f54..4fd7fd3 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.0-alpha1 + 2.0.0-beta1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1. + Added the `CollectGarbage` method. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 3f80d29..efb5cbe 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.0 Alpha 1 + README file for MSIE JavaScript Engine for .NET v2.0.0 Beta 1 -------------------------------------------------------------------------------- @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - Added support of .NET Core 1.0 (only supported `ChakraIeJsRt` and - `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1. + Added the `CollectGarbage` method. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 49baaf5..09fb461 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index c4a97b6..1b7684d 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-alpha1" + "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index 4fd1017..865ca6d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-alpha1" + "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index c4a97b6..1b7684d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-alpha1" + "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index c4a97b6..1b7684d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-alpha1" + "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index 4fd1017..865ca6d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-alpha1" + "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 5e648bf..5369c07 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.0.0-alpha1", + "version": "2.0.0-beta1", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-2", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.0.0-alpha1" + "MsieJavaScriptEngine": "2.0.0-beta1" }, "buildOptions": { From 00b3ca63936a9e649d37c01a7ed7fb8f6ecc6c69 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 14 Sep 2016 21:11:26 +0300 Subject: [PATCH 044/238] Added support of .NET Core 1.0.1 --- global.json | 2 +- test/MsieJavaScriptEngine.Test.Auto/project.json | 2 +- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 2 +- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 2 +- test/MsieJavaScriptEngine.Test.Common/project.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/global.json b/global.json index bb094ce..4b13e7a 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "projects": [ "src", "test" ], "sdk": { - "version": "1.0.0-preview2-003121" + "version": "1.0.0-preview2-003131" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index 1b7684d..e874d79 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0", + "version": "1.0.1", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index 1b7684d..e874d79 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0", + "version": "1.0.1", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index 1b7684d..e874d79 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0", + "version": "1.0.1", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 5369c07..d48d6fe 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -24,7 +24,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.0", + "version": "1.0.1", "type": "platform" } } From 927ae04b9c00c0947c3286c743f15235349568a8 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 17 Sep 2016 12:15:30 +0300 Subject: [PATCH 045/238] Version 2.0.0 Beta 2 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 4 ++-- NuGet/readme.txt | 4 ++-- build.cmd | 2 +- build.sh | 2 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 4 +--- .../JsRt/Edge/EdgeJsRuntime.cs | 18 ++++++++--------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 5 +---- .../JsRt/Ie/IeJsRuntime.cs | 20 +++++++++---------- 9 files changed, 30 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8cec88b..06bec27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## September 17, 2016 - v2.0.0 Beta 2 + * Added support of .NET Core 1.0.1 + ## September 9, 2016 - v2.0.0 Beta 1 * Added the `CollectGarbage` method diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 4fd7fd3..7697da2 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.0-beta1 + 2.0.0-beta2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Added the `CollectGarbage` method. + Added support of .NET Core 1.0.1. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index efb5cbe..48940ed 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.0 Beta 1 + README file for MSIE JavaScript Engine for .NET v2.0.0 Beta 2 -------------------------------------------------------------------------------- @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Added the `CollectGarbage` method. + Added support of .NET Core 1.0.1. ============ PROJECT SITE diff --git a/build.cmd b/build.cmd index 3a1f178..d4aa0c5 100644 --- a/build.cmd +++ b/build.cmd @@ -3,7 +3,7 @@ setlocal set ORIGINAL_CURRENT_DIR=%cd% set KOREBUILD_DOTNET_CHANNEL=preview -set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003121 +set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003131 cd %~dp0 diff --git a/build.sh b/build.sh index 3dab4c9..b7f945d 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ORIGINAL_CURRENT_DIR=%cd% KOREBUILD_DOTNET_CHANNEL=preview -KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003121 +KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003131 repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 17bdf3d..e7e91e6 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -102,9 +102,7 @@ public ChakraEdgeJsRtJsEngine(bool enableDebugging) /// Instance of JavaScript runtime with special settings private static EdgeJsRuntime CreateJsRuntime() { - var jsRuntime = EdgeJsRuntime.Create(JsRuntimeAttributes.AllowScriptInterrupt, null); - - return jsRuntime; + return EdgeJsRuntime.Create(JsRuntimeAttributes.None, null); } /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs index 6e40c3f..38ff239 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs @@ -101,15 +101,10 @@ public bool Disabled /// /// Creates a new runtime /// - /// The attributes of the runtime to be created - /// The thread service for the runtime. Can be null /// The runtime created - public static EdgeJsRuntime Create(JsRuntimeAttributes attributes, JsThreadServiceCallback threadServiceCallback) + public static EdgeJsRuntime Create() { - EdgeJsRuntime handle; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateRuntime(attributes, threadServiceCallback, out handle)); - - return handle; + return Create(JsRuntimeAttributes.None, null); } /// @@ -125,10 +120,15 @@ public static EdgeJsRuntime Create(JsRuntimeAttributes attributes) /// /// Creates a new runtime /// + /// The attributes of the runtime to be created + /// The thread service for the runtime. Can be null /// The runtime created - public static EdgeJsRuntime Create() + public static EdgeJsRuntime Create(JsRuntimeAttributes attributes, JsThreadServiceCallback threadServiceCallback) { - return Create(JsRuntimeAttributes.None, null); + EdgeJsRuntime handle; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateRuntime(attributes, threadServiceCallback, out handle)); + + return handle; } /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index ac19edb..566855b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -109,10 +109,7 @@ public ChakraIeJsRtJsEngine(bool enableDebugging) /// Instance of JavaScript runtime with special settings private static IeJsRuntime CreateJsRuntime() { - var jsRuntime = IeJsRuntime.Create(JsRuntimeAttributes.AllowScriptInterrupt, - JsRuntimeVersion.VersionEdge, null); - - return jsRuntime; + return IeJsRuntime.Create(JsRuntimeAttributes.None, JsRuntimeVersion.VersionEdge, null); } /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs index e2b45d2..ee5ed10 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs @@ -103,16 +103,10 @@ public bool Disabled /// /// Creates a new runtime /// - /// The attributes of the runtime to be created - /// The version of the runtime to be created - /// The thread service for the runtime. Can be null. /// The runtime created - public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersion version, JsThreadServiceCallback threadServiceCallback) + public static IeJsRuntime Create() { - IeJsRuntime handle; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateRuntime(attributes, version, threadServiceCallback, out handle)); - - return handle; + return Create(JsRuntimeAttributes.None, JsRuntimeVersion.Version11, null); } /// @@ -129,10 +123,16 @@ public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersio /// /// Creates a new runtime /// + /// The attributes of the runtime to be created + /// The version of the runtime to be created + /// The thread service for the runtime. Can be null. /// The runtime created - public static IeJsRuntime Create() + public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersion version, JsThreadServiceCallback threadServiceCallback) { - return Create(JsRuntimeAttributes.None, JsRuntimeVersion.Version11, null); + IeJsRuntime handle; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateRuntime(attributes, version, threadServiceCallback, out handle)); + + return handle; } /// From ff2ae334ba9149161be8c86a8a283e82f027acbb Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Sep 2016 11:52:36 +0300 Subject: [PATCH 046/238] Version 2.0.0 --- CHANGELOG.md | 4 ++++ NuGet/MsieJavaScriptEngine.nuspec | 5 +++-- NuGet/readme.txt | 6 ++++-- src/MsieJavaScriptEngine/project.json | 2 +- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../project.json | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 10 files changed, 24 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 06bec27..38a9a5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## September 19, 2016 - v2.0.0 + * Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1 + * Added the `CollectGarbage` method + ## September 17, 2016 - v2.0.0 Beta 2 * Added support of .NET Core 1.0.1 diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 7697da2..806f392 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.0-beta2 + 2.0.0 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,7 +12,8 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Added support of .NET Core 1.0.1. + 1. Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1; +2. Added the `CollectGarbage` method. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 48940ed..c8eae37 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.0 Beta 2 + README file for MSIE JavaScript Engine for .NET v2.0.0 -------------------------------------------------------------------------------- @@ -21,7 +21,9 @@ ============= RELEASE NOTES ============= - Added support of .NET Core 1.0.1. + 1. Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and + `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1; + 2. Added the `CollectGarbage` method. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 09fb461..0f72d9b 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index e874d79..bfa093d 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" + "MsieJavaScriptEngine.Test.Common": "2.0.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index 865ca6d..4e06697 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" + "MsieJavaScriptEngine.Test.Common": "2.0.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index e874d79..bfa093d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" + "MsieJavaScriptEngine.Test.Common": "2.0.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index e874d79..bfa093d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" + "MsieJavaScriptEngine.Test.Common": "2.0.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index 865ca6d..4e06697 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0-beta1" + "MsieJavaScriptEngine.Test.Common": "2.0.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index d48d6fe..47d7c2e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.0.0-beta1", + "version": "2.0.0", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-2", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.0.0-beta1" + "MsieJavaScriptEngine": "2.0.0" }, "buildOptions": { From ae499e7afa0fdcbc1fd71d7937efd437f6d0e9cf Mon Sep 17 00:00:00 2001 From: Alex Ullrich Date: Wed, 26 Oct 2016 09:23:54 -0400 Subject: [PATCH 047/238] Update README.md (#10) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3bb968a..b1dc632 100644 --- a/README.md +++ b/README.md @@ -136,5 +136,5 @@ If you use the MSIE JavaScript Engine in some project, please send me a message * [JavaScript Engine Switcher](http://github.com/Taritsyn/JavaScriptEngineSwitcher) by Andrey Taritsyn * [PowerShell.JS](http://github.com/klumsy/powershellJS) by Karl Prosser * [Serenity Application Platform](http://github.com/volkanceylan/Serenity) by Volkan Ceylan - * [SquishIt](http://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Cuse + * [SquishIt](http://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Ullrich * [Strike](http://github.com/SimonCropp/Strike) by Simon Cropp From d6c899237ebdf77835f5da971d706f87e68df2f5 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 7 Nov 2016 21:47:41 +0300 Subject: [PATCH 048/238] Updated unit tests --- build.cmd | 2 +- build.sh | 2 +- ...sieJavaScriptEngine.Test.Auto.Net40.csproj | 10 +- .../packages.config | 2 +- ...ngine.Test.ChakraActiveScript.Net40.csproj | 10 +- .../packages.config | 2 +- .../CommonTests.cs | 36 ++++ ...iptEngine.Test.ChakraEdgeJsRt.Net40.csproj | 10 +- .../packages.config | 2 +- ...criptEngine.Test.ChakraIeJsRt.Net40.csproj | 10 +- .../packages.config | 2 +- ...JavaScriptEngine.Test.Classic.Net40.csproj | 10 +- .../packages.config | 2 +- .../CommonTests.cs | 36 ++++ ...eJavaScriptEngine.Test.Common.Net40.csproj | 10 +- .../packages.config | 2 +- .../CommonTestsBase.cs | 184 +++++++++++++++++- .../project.json | 4 +- 18 files changed, 294 insertions(+), 42 deletions(-) diff --git a/build.cmd b/build.cmd index d4aa0c5..4a33d9f 100644 --- a/build.cmd +++ b/build.cmd @@ -11,7 +11,7 @@ set local_nuget_package_manager=.nuget\NuGet.exe set package_dir=packages if not exist %package_dir%\NUnit.Runners ( - %local_nuget_package_manager% install NUnit.Runners -Version 3.4.1 -O %package_dir% -ExcludeVersion -NoCache + %local_nuget_package_manager% install NUnit.Runners -Version 3.5.0 -O %package_dir% -ExcludeVersion -NoCache ) PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file diff --git a/build.sh b/build.sh index b7f945d..0c62ae0 100644 --- a/build.sh +++ b/build.sh @@ -10,7 +10,7 @@ localNugetPackageManager=.nuget/NuGet.exe packageDir=packages if test ! -d $packageDir/NUnit.Runners; then - mono $localNugetPackageManager install NUnit.Runners -Version 3.4.1 -O $packageDir% -ExcludeVersion -NoCache + mono $localNugetPackageManager install NUnit.Runners -Version 3.5.0 -O $packageDir% -ExcludeVersion -NoCache fi koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj index e7b85a9..ca99e5f 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True @@ -51,9 +51,6 @@ MsieJavaScriptEngine.Test.Common.Net40 - - - CommonTests.cs @@ -71,6 +68,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj index d46fc4c..13c856c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj @@ -34,16 +34,13 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True - - - {d672bc49-c454-4975-bd25-a555b9bdd793} @@ -71,6 +68,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 784849a..676e955 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -18,5 +18,41 @@ protected override MsieJsEngine CreateJsEngine() return jsEngine; } + + #region Mapping errors + + [Test] + public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.IsNotEmpty(exception.Message); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + } + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj index da853b6..1e97d92 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj @@ -34,16 +34,13 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True - - - {d672bc49-c454-4975-bd25-a555b9bdd793} @@ -71,6 +68,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj index 0281293..1496525 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj @@ -34,16 +34,13 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True - - - {d672bc49-c454-4975-bd25-a555b9bdd793} @@ -71,6 +68,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj index e494809..61efd71 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj @@ -34,16 +34,13 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True - - - {d672bc49-c454-4975-bd25-a555b9bdd793} @@ -71,6 +68,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index 247de8f..3f61e52 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -18,5 +18,41 @@ protected override MsieJsEngine CreateJsEngine() return jsEngine; } + + #region Mapping errors + + [Test] + public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.IsNotEmpty(exception.Message); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + } + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj index 9feec5b..97381f0 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj @@ -34,17 +34,14 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll True - - - {d672bc49-c454-4975-bd25-a555b9bdd793} @@ -112,6 +109,9 @@ + + + diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config index f2fd55a..c108d44 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 4c0c5fe..6c7853c 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -133,6 +133,25 @@ public virtual void EvaluationOfExpressionWithStringResultIsCorrect() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void EvaluationOfExpressionWithUnicodeStringResultIsCorrect() + { + // Arrange + const string input = "'Привет, ' + \"Вася\" + '?';"; + const string targetOutput = "Привет, Вася?"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + #endregion #region Execution of code @@ -242,7 +261,7 @@ public virtual void CallingOfFunctionWithoutParametersIsCorrect() using (var jsEngine = CreateJsEngine()) { jsEngine.Execute(functionCode); - output = (string) jsEngine.CallFunction("hooray"); + output = (string)jsEngine.CallFunction("hooray"); } // Assert @@ -393,6 +412,29 @@ public virtual void CallingOfFunctionWithStringResultIsCorrect() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void CallingOfFunctionWithUnicodeStringResultIsCorrect() + { + // Arrange + const string functionCode = @"function privet(name) { + return 'Привет, ' + name + '!'; +}"; + const string input = "Вован"; + const string targetOutput = "Привет, Вован!"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("privet", input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + [Test] public virtual void CallingOfFunctionWithManyParametersIsCorrect() { @@ -419,7 +461,7 @@ public virtual void CallingOfFunctionWithManyParametersIsCorrect() using (var jsEngine = CreateJsEngine()) { jsEngine.Execute(functionCode); - output = (string) jsEngine.CallFunction("determineArgumentsTypes", Undefined.Value, null, + output = (string)jsEngine.CallFunction("determineArgumentsTypes", Undefined.Value, null, true, 12, 3.14, "test"); } @@ -555,6 +597,36 @@ public virtual void CallingOfFunctionWithManyParametersAndStringResultIsCorrect( Assert.AreEqual("Hello, Petya!", output); } + [Test] + public virtual void CallingOfFunctionWithManyParametersAndUnicodeStringResultIsCorrect() + { + // Arrange + const string functionCode = @"function obedinit() { + var result = '', + argumentIndex, + argumentCount = arguments.length + ; + + for (argumentIndex = 0; argumentIndex < argumentCount; argumentIndex++) { + result += arguments[argumentIndex]; + } + + return result; +}"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("obedinit", "Привет", ",", " ", "Петя", "!"); + } + + // Assert + Assert.AreEqual("Привет, Петя!", output); + } + #endregion #region Getting, setting and removing variables @@ -741,6 +813,40 @@ public virtual void SettingAndGettingVariableWithStringValueIsCorrect() Assert.AreEqual(input2, output2); } + [Test] + public virtual void SettingAndGettingVariableWithUnicodeStringValueIsCorrect() + { + // Arrange + const string variableName = "slovo"; + + const string input1 = "Ура"; + const string targetOutput1 = "Ура!"; + + const string input2 = "Урааа"; + + // Act + bool variableExists; + string output1; + string output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input1); + variableExists = jsEngine.HasVariable(variableName); + jsEngine.Execute(string.Format("{0} += '!';", variableName)); + output1 = jsEngine.GetVariableValue(variableName); + + jsEngine.SetVariableValue(variableName, input2); + output2 = jsEngine.GetVariableValue(variableName); + } + + // Assert + Assert.True(variableExists); + Assert.AreEqual(targetOutput1, output1); + + Assert.AreEqual(input2, output2); + } + [Test] public virtual void RemovingVariableIsCorrect() { @@ -784,5 +890,79 @@ public virtual void GarbageCollectionIsCorrect() } #endregion + + #region Mapping errors + + [Test] + public virtual void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.IsNotEmpty(exception.Message); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(5, exception.ColumnNumber); + } + + [Test] + public virtual void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(@); +factorial(0);"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.IsNotEmpty(exception.Message); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(11, exception.ColumnNumber); + } + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 47d7c2e..ee73bfc 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -2,9 +2,9 @@ "version": "2.0.0", "dependencies": { - "dotnet-test-nunit": "3.4.0-beta-2", + "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", - "NUnit": "3.4.1", + "NUnit": "3.5.0", "MsieJavaScriptEngine": "2.0.0" }, From 88bf13368caf7ef8ebe95b537283a225676ad1c5 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 8 Nov 2016 20:32:50 +0300 Subject: [PATCH 049/238] All exceptions made serializable --- NuGet/MsieJavaScriptEngine.nuspec | 3 +- NuGet/readme.txt | 4 +- build.cmd | 2 +- build.sh | 2 +- .../ActiveScript/ActiveScriptException.cs | 137 ++++++++++++------ .../ActiveScript/ActiveScriptJsEngineBase.cs | 1 - .../JsEngineLoadException.cs | 34 +++-- src/MsieJavaScriptEngine/JsException.cs | 72 +++++++-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 3 +- .../JsRt/Edge/EdgeJsScriptException.cs | 19 +-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 3 +- .../JsRt/Ie/IeJsScriptException.cs | 19 +-- .../JsRt/JsEngineException.cs | 19 +-- src/MsieJavaScriptEngine/JsRt/JsException.cs | 44 ++++-- .../JsRt/JsFatalException.cs | 21 +-- .../JsRt/JsUsageException.cs | 21 +-- .../JsRuntimeException.cs | 119 ++++++++++++--- .../NotSupportedTypeException.cs | 22 ++- ...sieJavaScriptEngine.Test.Auto.Net40.csproj | 4 +- .../packages.config | 2 +- ...ngine.Test.ChakraActiveScript.Net40.csproj | 4 +- .../packages.config | 2 +- ...iptEngine.Test.ChakraEdgeJsRt.Net40.csproj | 4 +- .../packages.config | 2 +- ...criptEngine.Test.ChakraIeJsRt.Net40.csproj | 4 +- .../packages.config | 2 +- ...JavaScriptEngine.Test.Classic.Net40.csproj | 4 +- .../packages.config | 2 +- ...eJavaScriptEngine.Test.Common.Net40.csproj | 4 +- .../packages.config | 2 +- .../project.json | 2 +- 31 files changed, 401 insertions(+), 182 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 806f392..c43742f 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,8 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1; -2. Added the `CollectGarbage` method. + All exceptions made serializable. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index c8eae37..d22eb93 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,9 +21,7 @@ ============= RELEASE NOTES ============= - 1. Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and - `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1; - 2. Added the `CollectGarbage` method. + All exceptions made serializable. ============ PROJECT SITE diff --git a/build.cmd b/build.cmd index 4a33d9f..d4aa0c5 100644 --- a/build.cmd +++ b/build.cmd @@ -11,7 +11,7 @@ set local_nuget_package_manager=.nuget\NuGet.exe set package_dir=packages if not exist %package_dir%\NUnit.Runners ( - %local_nuget_package_manager% install NUnit.Runners -Version 3.5.0 -O %package_dir% -ExcludeVersion -NoCache + %local_nuget_package_manager% install NUnit.Runners -Version 3.4.1 -O %package_dir% -ExcludeVersion -NoCache ) PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file diff --git a/build.sh b/build.sh index 0c62ae0..b7f945d 100644 --- a/build.sh +++ b/build.sh @@ -10,7 +10,7 @@ localNugetPackageManager=.nuget/NuGet.exe packageDir=packages if test ! -d $packageDir/NUnit.Runners; then - mono $localNugetPackageManager install NUnit.Runners -Version 3.5.0 -O $packageDir% -ExcludeVersion -NoCache + mono $localNugetPackageManager install NUnit.Runners -Version 3.4.1 -O $packageDir% -ExcludeVersion -NoCache fi koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index 5b2fb07..cfa140f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -1,20 +1,56 @@ #if !NETSTANDARD1_3 using System; -using System.Runtime.Serialization; using System.Runtime.InteropServices.ComTypes; +using System.Runtime.Serialization; +using System.Security.Permissions; namespace MsieJavaScriptEngine.ActiveScript { [Serializable] internal sealed class ActiveScriptException : Exception { + /// + /// Error code + /// + private int _errorCode; + + /// + /// WCode + /// + private short _errorWCode; + + /// + /// Application specific source context + /// + private uint _sourceContext; + + /// + /// Subcategory of error + /// + private string _subcategory = string.Empty; + + /// + /// Line number on which the error occurred + /// + private uint _lineNumber; + + /// + /// Column number on which the error occurred + /// + private int _columnNumber; + + /// + /// Content of the line on which the error occurred + /// + private string _sourceError = string.Empty; + /// /// Gets or sets a error code /// public int ErrorCode { - get; - set; + get { return _errorCode; } + set { _errorCode = value; } } /// @@ -22,8 +58,8 @@ public int ErrorCode /// public short ErrorWCode { - get; - set; + get { return _errorWCode; } + set { _errorWCode = value; } } /// @@ -31,8 +67,8 @@ public short ErrorWCode /// public uint SourceContext { - get; - set; + get { return _sourceContext; } + set { _sourceContext = value; } } /// @@ -40,8 +76,8 @@ public uint SourceContext /// public string Subcategory { - get; - set; + get { return _subcategory; } + set { _subcategory = value; } } /// @@ -49,8 +85,8 @@ public string Subcategory /// public uint LineNumber { - get; - set; + get { return _lineNumber; } + set { _lineNumber = value; } } /// @@ -58,8 +94,8 @@ public uint LineNumber /// public int ColumnNumber { - get; - set; + get { return _columnNumber; } + set { _columnNumber = value; } } /// @@ -67,19 +103,14 @@ public int ColumnNumber /// public string SourceError { - get; - set; + get { return _sourceError; } + set { _sourceError = value; } } /// /// Initializes a new instance of the class - /// - public ActiveScriptException() - { } - - /// - /// Initializes a new instance of the class + /// with a specified error message /// /// The message public ActiveScriptException(string message) @@ -88,14 +119,8 @@ public ActiveScriptException(string message) /// /// Initializes a new instance of the class - /// - /// The inner exception - public ActiveScriptException(Exception innerException) - : base(null, innerException) - { } - - /// - /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception /// /// The message /// The inner exception @@ -104,21 +129,24 @@ public ActiveScriptException(string message, Exception innerException) { } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The - /// that holds the serialized object data about the exception being thrown - /// The - /// that contains contextual information about the source or destination - /// - /// The parameter is null - /// - /// - /// The class name is null or is zero (0) - /// + /// The object that holds the serialized data + /// The contextual information about the source or destination private ActiveScriptException(SerializationInfo info, StreamingContext context) : base(info, context) - { } + { + if (info != null) + { + _errorCode = info.GetInt32("ErrorCode"); + _errorWCode = info.GetInt16("ErrorWCode"); + _sourceContext = info.GetUInt32("SourceContext"); + _subcategory = info.GetString("Subcategory"); + _lineNumber = info.GetUInt32("LineNumber"); + _columnNumber = info.GetInt32("ColumnNumber"); + _sourceError = info.GetString("SourceError"); + } + } internal static ActiveScriptException Create(IActiveScriptError error) @@ -191,6 +219,33 @@ internal static ActiveScriptException Create(IActiveScriptError error) return activeScriptException; } + + #region Exception overrides + + /// + /// Populates a with the data needed to serialize the target object + /// + /// The to populate with data + /// The destination (see ) for this serialization + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException("info"); + } + + base.GetObjectData(info, context); + info.AddValue("ErrorCode", _errorCode); + info.AddValue("ErrorWCode", _errorWCode); + info.AddValue("SourceContext", _sourceContext); + info.AddValue("Subcategory", _subcategory); + info.AddValue("LineNumber", _lineNumber); + info.AddValue("ColumnNumber", _columnNumber); + info.AddValue("SourceError", _sourceError); + } + + #endregion } } #endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 4d3e7af..5e1be39 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -267,7 +267,6 @@ private JsRuntimeException ConvertActiveScriptExceptionToJsRuntimeException( LineNumber = (int)activeScriptException.LineNumber, ColumnNumber = activeScriptException.ColumnNumber, SourceFragment = activeScriptException.SourceError, - Source = activeScriptException.Source, HelpLink = activeScriptException.HelpLink }; diff --git a/src/MsieJavaScriptEngine/JsEngineLoadException.cs b/src/MsieJavaScriptEngine/JsEngineLoadException.cs index 0b99971..a77a749 100644 --- a/src/MsieJavaScriptEngine/JsEngineLoadException.cs +++ b/src/MsieJavaScriptEngine/JsEngineLoadException.cs @@ -1,10 +1,16 @@ using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif namespace MsieJavaScriptEngine { /// - /// The exception that is thrown when a loading of JavaScript engine is failed + /// The exception that is thrown when a loading of JS engine is failed /// +#if !NETSTANDARD1_3 + [Serializable] +#endif public sealed class JsEngineLoadException : JsException { /// @@ -13,38 +19,48 @@ public sealed class JsEngineLoadException : JsException /// /// The message that describes the error public JsEngineLoadException(string message) - : this(message, string.Empty) + : base(message) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception /// /// The error message that explains the reason for the exception /// The exception that is the cause of the current exception public JsEngineLoadException(string message, Exception innerException) - : this(message, string.Empty, innerException) + : base(message, innerException) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode public JsEngineLoadException(string message, string engineMode) - : this(message, engineMode, null) + : base(message, engineMode) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode /// The exception that is the cause of the current exception public JsEngineLoadException(string message, string engineMode, Exception innerException) : base(message, engineMode, innerException) { } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private JsEngineLoadException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index bddcd45..c789fa9 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -1,19 +1,30 @@ using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +using System.Security.Permissions; +#endif namespace MsieJavaScriptEngine { /// - /// The exception that is thrown during the work of JavaScript engine + /// The exception that is thrown during the work of JS engine /// +#if !NETSTANDARD1_3 + [Serializable] +#endif public class JsException : Exception { /// - /// Gets a name of JavaScript engine mode + /// JS engine mode + /// + private readonly string _engineMode = string.Empty; + + /// + /// Gets a name of JS engine mode /// public string EngineMode { - get; - private set; + get { return _engineMode; } } @@ -23,40 +34,77 @@ public string EngineMode /// /// The message that describes the error public JsException(string message) - : this(message, string.Empty) + : base(message) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception /// /// The error message that explains the reason for the exception /// The exception that is the cause of the current exception public JsException(string message, Exception innerException) - : this(message, string.Empty, innerException) + : base(message, innerException) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode public JsException(string message, string engineMode) : this(message, engineMode, null) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode /// The exception that is the cause of the current exception public JsException(string message, string engineMode, Exception innerException) : base(message, innerException) { - EngineMode = engineMode; + _engineMode = engineMode; + } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + protected JsException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info != null) + { + _engineMode = info.GetString("EngineMode"); + } } + + + #region Exception overrides + + /// + /// Populates a with the data needed to serialize the target object + /// + /// The to populate with data + /// The destination (see ) for this serialization + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException("info"); + } + + base.GetObjectData(info, context); + info.AddValue("EngineMode", _engineMode); + } + + #endregion +#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index e7e91e6..7b302f6 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -830,8 +830,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( Category = category, LineNumber = lineNumber, ColumnNumber = columnNumber, - SourceFragment = sourceFragment, - HelpLink = jsException.HelpLink + SourceFragment = sourceFragment }; return jsEngineException; diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs index c8ec0fd..c18739e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs @@ -33,30 +33,31 @@ public EdgeJsValue Error /// /// Initializes a new instance of the class /// - /// The error code returned + /// The error code returned /// The JavaScript error object - public EdgeJsScriptException(JsErrorCode code, EdgeJsValue error) - : this(code, error, "JavaScript Exception") + public EdgeJsScriptException(JsErrorCode errorCode, EdgeJsValue error) + : this(errorCode, error, "JavaScript Exception") { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The JavaScript error object /// The error message - public EdgeJsScriptException(JsErrorCode code, EdgeJsValue error, string message) - : base(code, message) + public EdgeJsScriptException(JsErrorCode errorCode, EdgeJsValue error, string message) + : base(errorCode, message) { _error = error; } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination private EdgeJsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 566855b..5d5f066 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -853,8 +853,7 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( Category = category, LineNumber = lineNumber, ColumnNumber = columnNumber, - SourceFragment = sourceFragment, - HelpLink = jsException.HelpLink + SourceFragment = sourceFragment }; return jsEngineException; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs index e45ed22..32bd3e7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs @@ -33,30 +33,31 @@ public IeJsValue Error /// /// Initializes a new instance of the class /// - /// The error code returned + /// The error code returned /// The JavaScript error object - public IeJsScriptException(JsErrorCode code, IeJsValue error) - : this(code, error, "JavaScript Exception") + public IeJsScriptException(JsErrorCode errorCode, IeJsValue error) + : this(errorCode, error, "JavaScript Exception") { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The JavaScript error object /// The error message - public IeJsScriptException(JsErrorCode code, IeJsValue error, string message) - : base(code, message) + public IeJsScriptException(JsErrorCode errorCode, IeJsValue error, string message) + : base(errorCode, message) { _error = error; } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination private IeJsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs index 04cf7dd..0dd940f 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -16,26 +16,27 @@ internal sealed class JsEngineException : JsException /// /// Initializes a new instance of the class /// - /// The error code returned - public JsEngineException(JsErrorCode code) - : this(code, "A fatal exception has occurred in a JavaScript runtime") + /// The error code returned + public JsEngineException(JsErrorCode errorCode) + : base(errorCode) { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The error message - public JsEngineException(JsErrorCode code, string message) - : base(code, message) + public JsEngineException(JsErrorCode errorCode, string message) + : base(errorCode, message) { } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination private JsEngineException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs index 02f51b6..f7bf28a 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsException.cs @@ -1,6 +1,7 @@ using System; #if !NETSTANDARD1_3 using System.Runtime.Serialization; +using System.Security.Permissions; #endif namespace MsieJavaScriptEngine.JsRt @@ -16,62 +17,73 @@ internal class JsException : Exception /// /// The error code /// - private readonly JsErrorCode _code; + private readonly JsErrorCode _errorCode; /// /// Gets a error code /// public JsErrorCode ErrorCode { - get { return _code; } + get { return _errorCode; } } /// /// Initializes a new instance of the class /// - /// The error code returned - public JsException(JsErrorCode code) - : this(code, "A fatal exception has occurred in a JavaScript runtime") + /// The error code returned + public JsException(JsErrorCode errorCode) + : this(errorCode, "A fatal exception has occurred in a JavaScript runtime") { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The error message - public JsException(JsErrorCode code, string message) + public JsException(JsErrorCode errorCode, string message) : base(message) { - _code = code; + _errorCode = errorCode; } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination protected JsException(SerializationInfo info, StreamingContext context) : base(info, context) { if (info != null) { - _code = (JsErrorCode) info.GetUInt32("code"); + _errorCode = (JsErrorCode)info.GetUInt32("ErrorCode"); } } + #region Exception overrides + /// - /// Serializes the exception information + /// Populates a with the data needed to serialize the target object /// - /// The serialization information - /// The streaming context + /// The to populate with data + /// The destination (see ) for this serialization + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { + if (info == null) + { + throw new ArgumentNullException("info"); + } + base.GetObjectData(info, context); - info.AddValue("code", (uint)_code); + info.AddValue("ErrorCode", (uint)_errorCode); } + + #endregion #endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs index 1804563..7c5e43d 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs @@ -6,7 +6,7 @@ namespace MsieJavaScriptEngine.JsRt { /// - /// The fatal exception + /// The fatal exception occurred /// #if !NETSTANDARD1_3 [Serializable] @@ -16,26 +16,27 @@ internal sealed class JsFatalException : JsException /// /// Initializes a new instance of the class /// - /// The error code returned - public JsFatalException(JsErrorCode code) - : this(code, "A fatal exception has occurred in a JavaScript runtime") + /// The error code returned + public JsFatalException(JsErrorCode errorCode) + : base(errorCode) { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The error message - public JsFatalException(JsErrorCode code, string message) - : base(code, message) + public JsFatalException(JsErrorCode errorCode, string message) + : base(errorCode, message) { } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination private JsFatalException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs index 56a1e8d..db22055 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs @@ -6,7 +6,7 @@ namespace MsieJavaScriptEngine.JsRt { /// - /// The API usage exception + /// The API usage exception occurred /// #if !NETSTANDARD1_3 [Serializable] @@ -16,26 +16,27 @@ internal sealed class JsUsageException : JsException /// /// Initializes a new instance of the class /// - /// The error code returned - public JsUsageException(JsErrorCode code) - : this(code, "A fatal exception has occurred in a JavaScript runtime") + /// The error code returned + public JsUsageException(JsErrorCode errorCode) + : base(errorCode) { } /// /// Initializes a new instance of the class + /// with a specified error message /// - /// The error code returned + /// The error code returned /// The error message - public JsUsageException(JsErrorCode code, string message) - : base(code, message) + public JsUsageException(JsErrorCode errorCode, string message) + : base(errorCode, message) { } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class with serialized data /// - /// The serialization info - /// The streaming context + /// The object that holds the serialized data + /// The contextual information about the source or destination private JsUsageException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs index ec43d3a..75b6198 100644 --- a/src/MsieJavaScriptEngine/JsRuntimeException.cs +++ b/src/MsieJavaScriptEngine/JsRuntimeException.cs @@ -1,19 +1,51 @@ using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +using System.Security.Permissions; +#endif namespace MsieJavaScriptEngine { /// - /// The exception that is thrown during a execution of code by JavaScript engine + /// The exception that is thrown during a execution of code by JS engine /// +#if !NETSTANDARD1_3 + [Serializable] +#endif public sealed class JsRuntimeException : JsException { + /// + /// Error code + /// + private string _errorCode = string.Empty; + + /// + /// Error category + /// + private string _category = string.Empty; + + /// + /// Line number + /// + private int _lineNumber; + + /// + /// Column number + /// + private int _columnNumber; + + /// + /// Source fragment + /// + private string _sourceFragment = string.Empty; + /// /// Gets or sets a error code /// public string ErrorCode { - get; - set; + get { return _errorCode; } + set { _errorCode = value; } } /// @@ -21,8 +53,8 @@ public string ErrorCode /// public string Category { - get; - set; + get { return _category; } + set { _category = value; } } /// @@ -30,8 +62,8 @@ public string Category /// public int LineNumber { - get; - set; + get { return _lineNumber; } + set { _lineNumber = value; } } /// @@ -39,8 +71,8 @@ public int LineNumber /// public int ColumnNumber { - get; - set; + get { return _columnNumber; } + set { _columnNumber = value; } } /// @@ -48,8 +80,8 @@ public int ColumnNumber /// public string SourceFragment { - get; - set; + get { return _sourceFragment; } + set { _sourceFragment = value; } } @@ -59,44 +91,83 @@ public string SourceFragment /// /// The message that describes the error public JsRuntimeException(string message) - : this(message, string.Empty) + : base(message) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception /// /// The error message that explains the reason for the exception /// The exception that is the cause of the current exception public JsRuntimeException(string message, Exception innerException) - : this(message, string.Empty, innerException) + : base(message, innerException) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode public JsRuntimeException(string message, string engineMode) - : this(message, engineMode, null) + : base(message, engineMode) { } /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception /// /// The error message that explains the reason for the exception - /// Name of JavaScript engine mode + /// Name of JS engine mode /// The exception that is the cause of the current exception public JsRuntimeException(string message, string engineMode, Exception innerException) : base(message, engineMode, innerException) + { } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private JsRuntimeException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info != null) + { + _errorCode = info.GetString("ErrorCode"); + _category = info.GetString("Category"); + _lineNumber = info.GetInt32("LineNumber"); + _columnNumber = info.GetInt32("ColumnNumber"); + _sourceFragment = info.GetString("SourceFragment"); + } + } + + + #region JsException overrides + + /// + /// Populates a with the data needed to serialize the target object + /// + /// The to populate with data + /// The destination (see ) for this serialization + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) { - ErrorCode = string.Empty; - Category = string.Empty; - LineNumber = 0; - ColumnNumber = 0; - SourceFragment = string.Empty; + if (info == null) + { + throw new ArgumentNullException("info"); + } + + base.GetObjectData(info, context); + info.AddValue("ErrorCode", _errorCode); + info.AddValue("Category", _category); + info.AddValue("LineNumber", _lineNumber); + info.AddValue("ColumnNumber", _columnNumber); + info.AddValue("SourceFragment", _sourceFragment); } + + #endregion +#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs index 868e4ff..cc9a845 100644 --- a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs +++ b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs @@ -1,10 +1,16 @@ using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif namespace MsieJavaScriptEngine { /// - /// The exception that is thrown when a .NET type is not supported by JavaScipt engine + /// The exception that is thrown when a .NET type is not supported by JS engine /// +#if !NETSTANDARD1_3 + [Serializable] +#endif public sealed class NotSupportedTypeException : Exception { /// @@ -18,12 +24,24 @@ public NotSupportedTypeException(string message) /// /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception that is the cause of this exception + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception /// /// The error message that explains the reason for the exception /// The exception that is the cause of the current exception public NotSupportedTypeException(string message, Exception innerException) : base(message, innerException) { } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private NotSupportedTypeException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj index ca99e5f..39984b4 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj index 13c856c..adf308a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj index 1e97d92..4c4e692 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj index 1496525..13ab808 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj index 61efd71..9325d15 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj index 97381f0..1e9cea5 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config index c108d44..f2fd55a 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index ee73bfc..351bcc9 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -4,7 +4,7 @@ "dependencies": { "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", - "NUnit": "3.5.0", + "NUnit": "3.4.1", "MsieJavaScriptEngine": "2.0.0" }, From af18a40d8628b3ba75a61ee74f2dc41978637488 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 8 Nov 2016 20:56:34 +0300 Subject: [PATCH 050/238] Version 2.0.1 --- NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 2 +- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 4 ++-- src/MsieJavaScriptEngine/project.json | 2 +- .../MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../MsieJavaScriptEngine.Test.ChakraActiveScript/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 16 files changed, 29 insertions(+), 29 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index c43742f..d77b7d8 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.0 + 2.0.1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn diff --git a/NuGet/readme.txt b/NuGet/readme.txt index d22eb93..0e58178 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.0 + README file for MSIE JavaScript Engine for .NET v2.0.1 -------------------------------------------------------------------------------- diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 0c54f78..2fd752a 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 0f72d9b..4245ece 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 21e35d9..2a60c5c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index bfa093d..1558c33 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0" + "MsieJavaScriptEngine.Test.Common": "2.0.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index 2f8d45c..34f0dcb 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index 4e06697..2f3122c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0" + "MsieJavaScriptEngine.Test.Common": "2.0.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index e2f9c03..a5b7f89 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index bfa093d..1558c33 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0" + "MsieJavaScriptEngine.Test.Common": "2.0.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 165d626..3bbe849 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index bfa093d..1558c33 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0" + "MsieJavaScriptEngine.Test.Common": "2.0.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index 8302f8c..7933315 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index 4e06697..2f3122c 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.0" + "MsieJavaScriptEngine.Test.Common": "2.0.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index d5e3fc4..838b521 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("2.0.0.0")] -[assembly: AssemblyFileVersion("2.0.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.0.1.0")] +[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 351bcc9..18a8e40 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.0.0", + "version": "2.0.1", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.0.0" + "MsieJavaScriptEngine": "2.0.1" }, "buildOptions": { From 27ff3bbad11a46cecb24bb8e19c9a9b5bd4fdd4a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 9 Nov 2016 10:47:02 +0300 Subject: [PATCH 051/238] CHANGELOG.md: Added information about version 2.0.1 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 38a9a5b..3aca636 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## November 8, 2016 - v2.0.1 + * All exceptions made serializable + ## September 19, 2016 - v2.0.0 * Added support of .NET Core 1.0.1 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) and .NET Framework 4.5.1 * Added the `CollectGarbage` method From 47f20e785f01f838f5f7422ac080cdc5d7c9f332 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 19 Nov 2016 11:24:27 +0300 Subject: [PATCH 052/238] README.md: Fixed formatting --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b1dc632..b6fa8de 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Consider in detail properties of the Boolean false - Flag for whether to allow debugging in Visual Studio by adding the `debugger` statement to script code (only works in the `ChakraIeJsRt` and `ChakraEdgeJsRt` modes). + Flag for whether to allow debugging in Visual Studio by adding the debugger statement to script code (only works in the ChakraIeJsRt and ChakraEdgeJsRt modes). EngineMode From 3a69a4d132cd1de5ab3c90f567afb9dab58d14f7 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 2 Dec 2016 20:33:43 +0300 Subject: [PATCH 053/238] Another attempt to prevent occurrence of the access violation exception in the `CallFunction` method --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 73 +++++++++++++++++-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 73 +++++++++++++++++-- 2 files changed, 136 insertions(+), 10 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 7b302f6..89b45b7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -172,7 +172,7 @@ private EdgeJsValue MapToScriptType(object value) switch (typeCode) { case TypeCode.Boolean: - return EdgeJsValue.FromBoolean((bool)value); + return (bool)value ? EdgeJsValue.True : EdgeJsValue.False; case TypeCode.SByte: case TypeCode.Byte: @@ -282,6 +282,50 @@ private object[] MapToHostType(EdgeJsValue[] args) { return args.Select(MapToHostType).ToArray(); } + + /// + /// Adds a reference to the value + /// + /// The value + private static void AddReferenceToValue(EdgeJsValue value) + { + if (CanHaveReferences(value)) + { + value.AddRef(); + } + } + + /// + /// Removes a reference to the value + /// + /// The value + private static void RemoveReferenceToValue(EdgeJsValue value) + { + if (CanHaveReferences(value)) + { + value.Release(); + } + } + + /// + /// Checks whether the value can have references + /// + /// The value + /// Result of check (true - may have; false - may not have) + private static bool CanHaveReferences(EdgeJsValue value) + { + JsValueType valueType = value.ValueType; + + switch (valueType) + { + case JsValueType.Null: + case JsValueType.Undefined: + case JsValueType.Boolean: + return false; + default: + return true; + } + } #if NETSTANDARD1_3 private EdgeJsValue FromObject(object value) @@ -945,11 +989,30 @@ public override object CallFunction(string functionName, params object[] args) string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); } - var processedArgs = MapToScriptType(args); - var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - + EdgeJsValue resultValue; EdgeJsValue functionValue = globalObj.GetProperty(functionId); - EdgeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + + if (args.Length > 0) + { + EdgeJsValue[] processedArgs = MapToScriptType(args); + + foreach (EdgeJsValue processedArg in processedArgs) + { + AddReferenceToValue(processedArg); + } + + EdgeJsValue[] allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); + resultValue = functionValue.CallFunction(allProcessedArgs); + + foreach (EdgeJsValue processedArg in processedArgs) + { + RemoveReferenceToValue(processedArg); + } + } + else + { + resultValue = functionValue.CallFunction(globalObj); + } return MapToHostType(resultValue); }); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 5d5f066..576d790 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -196,7 +196,7 @@ private IeJsValue MapToScriptType(object value) switch (typeCode) { case TypeCode.Boolean: - return IeJsValue.FromBoolean((bool)value); + return (bool)value ? IeJsValue.True : IeJsValue.False; case TypeCode.SByte: case TypeCode.Byte: @@ -306,6 +306,50 @@ private object[] MapToHostType(IeJsValue[] args) { return args.Select(MapToHostType).ToArray(); } + + /// + /// Adds a reference to the value + /// + /// The value + private static void AddReferenceToValue(IeJsValue value) + { + if (CanHaveReferences(value)) + { + value.AddRef(); + } + } + + /// + /// Removes a reference to the value + /// + /// The value + private static void RemoveReferenceToValue(IeJsValue value) + { + if (CanHaveReferences(value)) + { + value.Release(); + } + } + + /// + /// Checks whether the value can have references + /// + /// The value + /// Result of check (true - may have; false - may not have) + private static bool CanHaveReferences(IeJsValue value) + { + JsValueType valueType = value.ValueType; + + switch (valueType) + { + case JsValueType.Null: + case JsValueType.Undefined: + case JsValueType.Boolean: + return false; + default: + return true; + } + } #if NETSTANDARD1_3 private IeJsValue FromObject(object value) @@ -983,11 +1027,30 @@ public override object CallFunction(string functionName, params object[] args) string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); } - var processedArgs = MapToScriptType(args); - var allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); - + IeJsValue resultValue; IeJsValue functionValue = globalObj.GetProperty(functionId); - IeJsValue resultValue = functionValue.CallFunction(allProcessedArgs); + + if (args.Length > 0) + { + IeJsValue[] processedArgs = MapToScriptType(args); + + foreach (IeJsValue processedArg in processedArgs) + { + AddReferenceToValue(processedArg); + } + + IeJsValue[] allProcessedArgs = new[] { globalObj }.Concat(processedArgs).ToArray(); + resultValue = functionValue.CallFunction(allProcessedArgs); + + foreach (IeJsValue processedArg in processedArgs) + { + RemoveReferenceToValue(processedArg); + } + } + else + { + resultValue = functionValue.CallFunction(globalObj); + } return MapToHostType(resultValue); }); From f2cbeba306a13b61d4382a3848144b4f23a99bf7 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 2 Dec 2016 21:19:21 +0300 Subject: [PATCH 054/238] Version 2.0.2 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 4 ++-- NuGet/readme.txt | 5 +++-- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 4 ++-- src/MsieJavaScriptEngine/project.json | 2 +- test/MsieJavaScriptEngine.Test.Common/project.json | 2 +- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aca636..19696fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## December 2, 2016 - v2.0.2 + * Another attempt to prevent occurrence of the access violation exception in the `CallFunction` method + ## November 8, 2016 - v2.0.1 * All exceptions made serializable diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index d77b7d8..224d211 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.1 + 2.0.2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - All exceptions made serializable. + Another attempt to prevent occurrence of the access violation exception in the `CallFunction` method. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 0e58178..42838f5 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.1 + README file for MSIE JavaScript Engine for .NET v2.0.2 -------------------------------------------------------------------------------- @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - All exceptions made serializable. + Another attempt to prevent occurrence of the access violation exception in the + `CallFunction` method. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 2fd752a..dfd7a2c 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] +[assembly: AssemblyVersion("2.0.2.0")] +[assembly: AssemblyFileVersion("2.0.2.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 4245ece..22e2e25 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.0.1", + "version": "2.0.2", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 18a8e40..bf9a4eb 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -5,7 +5,7 @@ "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.0.1" + "MsieJavaScriptEngine": "2.0.2" }, "buildOptions": { From b2fc98e958c2a84789a8b1c38a3386affaf7faa9 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 11 Dec 2016 11:51:44 +0300 Subject: [PATCH 055/238] Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace --- NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 4 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 30 ++++++----- src/MsieJavaScriptEngine/MsieJsEngine.cs | 33 ++++++++---- src/MsieJavaScriptEngine/Utilities/Utils.cs | 54 +++++++++++++++++-- .../CommonTestsBase.cs | 6 +-- 6 files changed, 96 insertions(+), 33 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 224d211..1ccdc40 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Another attempt to prevent occurrence of the access violation exception in the `CallFunction` method. + Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 42838f5..4011699 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,8 +21,8 @@ ============= RELEASE NOTES ============= - Another attempt to prevent occurrence of the access violation exception in the - `CallFunction` method. + Now when you call the overloaded version of the `ExecuteResource` method, that + takes the type, need to pass the resource name without the namespace. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 5e1be39..1d6880b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -512,39 +512,45 @@ private void InnerCollectGarbage(ScriptGCType type) /// Flag for whether to use the JSON2 library private void LoadResources(bool useEcmaScript5Polyfill, bool useJson2Library) { - Type type = GetType(); + Assembly assembly = GetType().GetTypeInfo().Assembly; if (useEcmaScript5Polyfill) { - ExecuteResource(ES5_POLYFILL_RESOURCE_NAME, type); + ExecuteResource(ES5_POLYFILL_RESOURCE_NAME, assembly); } if (useJson2Library) { - ExecuteResource(JSON2_LIBRARY_RESOURCE_NAME, type); + ExecuteResource(JSON2_LIBRARY_RESOURCE_NAME, assembly); } } /// /// Executes a code from embedded JS-resource /// - /// JS-resource name - /// Type from assembly that containing an embedded resource - private void ExecuteResource(string resourceName, Type type) + /// The case-sensitive resource name + /// The assembly, which contains the embedded resource + private void ExecuteResource(string resourceName, Assembly assembly) { - if (string.IsNullOrWhiteSpace(resourceName)) + if (resourceName == null) { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + throw new ArgumentNullException( + "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); } - if (type == null) + if (assembly == null) { throw new ArgumentNullException( - "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); + "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); + } + + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); } - string code = Utils.GetResourceAsString(resourceName, type); + string code = Utils.GetResourceAsString(resourceName, assembly); Execute(code); } diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 743e0c0..344b5e7 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -305,8 +305,9 @@ public void ExecuteFile(string path, Encoding encoding = null) /// /// Executes a code from embedded JS-resource /// - /// JS-resource name - /// Type from assembly that containing an embedded resource + /// The case-sensitive resource name without the namespace of the specified type + /// The type, that determines the assembly and whose namespace is used to scope + /// the resource name /// Operation is performed on a disposed MSIE /// JavaScript engine. /// @@ -316,10 +317,10 @@ public void ExecuteResource(string resourceName, Type type) { VerifyNotDisposed(); - if (string.IsNullOrWhiteSpace(resourceName)) + if (resourceName == null) { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + throw new ArgumentNullException( + "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); } if (type == null) @@ -328,6 +329,12 @@ public void ExecuteResource(string resourceName, Type type) "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); } + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + } + string code = Utils.GetResourceAsString(resourceName, type); Execute(code); } @@ -335,8 +342,8 @@ public void ExecuteResource(string resourceName, Type type) /// /// Executes a code from embedded JS-resource /// - /// JS-resource name - /// Assembly that containing an embedded resource + /// The case-sensitive resource name + /// The assembly, which contains the embedded resource /// Operation is performed on a disposed MSIE /// JavaScript engine. /// @@ -346,10 +353,10 @@ public void ExecuteResource(string resourceName, Assembly assembly) { VerifyNotDisposed(); - if (string.IsNullOrWhiteSpace(resourceName)) + if (resourceName == null) { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + throw new ArgumentNullException( + "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); } if (assembly == null) @@ -358,6 +365,12 @@ public void ExecuteResource(string resourceName, Assembly assembly) "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); } + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + } + string code = Utils.GetResourceAsString(resourceName, assembly); Execute(code); } diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 07ab735..498a755 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -29,23 +29,67 @@ public static bool Is64BitProcess() /// /// Gets a content of the embedded resource as string /// - /// Resource name - /// Type from assembly that containing an embedded resource + /// The case-sensitive resource name without the namespace of the specified type + /// The type, that determines the assembly and whose namespace is used to scope + /// the resource name /// Сontent of the embedded resource as string public static string GetResourceAsString(string resourceName, Type type) { + if (resourceName == null) + { + throw new ArgumentNullException( + "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + } + + if (type == null) + { + throw new ArgumentNullException( + "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); + } + + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + } + Assembly assembly = type.GetTypeInfo().Assembly; + string nameSpace = type.Namespace; + string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; - return GetResourceAsString(resourceName, assembly); + return InnerGetResourceAsString(resourceFullName, assembly); } /// /// Gets a content of the embedded resource as string /// - /// Resource name - /// Assembly that containing an embedded resource + /// The case-sensitive resource name + /// The assembly, which contains the embedded resource /// Сontent of the embedded resource as string public static string GetResourceAsString(string resourceName, Assembly assembly) + { + if (resourceName == null) + { + throw new ArgumentNullException( + "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + } + + if (assembly == null) + { + throw new ArgumentNullException( + "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); + } + + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + } + + return InnerGetResourceAsString(resourceName, assembly); + } + + private static string InnerGetResourceAsString(string resourceName, Assembly assembly) { using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 6c7853c..c8dd75f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -201,10 +201,10 @@ public virtual void ExecutionOfFileIsCorrect() } [Test] - public virtual void ExecutionOfResourceByTypeIsCorrect() + public virtual void ExecutionOfResourceByNameAndTypeIsCorrect() { // Arrange - const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.cube.js"; + const string resourceName = "Resources.cube.js"; const string input = "cube(5);"; const int targetOutput = 125; @@ -222,7 +222,7 @@ public virtual void ExecutionOfResourceByTypeIsCorrect() } [Test] - public virtual void ExecutionOfResourceByAssemblyIsCorrect() + public virtual void ExecutionOfResourceByNameAndAssemblyIsCorrect() { // Arrange const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.power.js"; From d6b6665af4af8c892baaeaa6813a3d8b553d8c7b Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 16 Dec 2016 22:23:18 +0300 Subject: [PATCH 056/238] =?UTF-8?q?Fixed=20a=20error=20=E2=80=9COut=20of?= =?UTF-8?q?=20stack=20space=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- NuGet/MsieJavaScriptEngine.nuspec | 7 +- NuGet/readme.txt | 5 +- .../MsieJavaScriptEngine.Net40.csproj | 4 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 228 +++++++------- .../JsRt/ChakraJsRtJsEngineBase.cs | 46 ++- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 161 +++++----- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 165 +++++----- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 294 ++++++++++++++++++ src/MsieJavaScriptEngine/project.json | 6 +- 9 files changed, 620 insertions(+), 296 deletions(-) create mode 100644 src/MsieJavaScriptEngine/ScriptDispatcher.cs diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 1ccdc40..8aed8d7 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,8 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace. + 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; + 2. Fixed a error “Out of stack space”. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra @@ -36,11 +37,9 @@ + - - - diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 4011699..2d5b048 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,8 +21,9 @@ ============= RELEASE NOTES ============= - Now when you call the overloaded version of the `ExecuteResource` method, that - takes the type, need to pass the resource name without the namespace. + 1. Now when you call the overloaded version of the `ExecuteResource` method, that + takes the type, need to pass the resource name without the namespace; + 2. Fixed a error “Out of stack space”. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj index fedbcb5..d41d102 100644 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -345,6 +345,9 @@ Resources\NetFrameworkStrings.ru-ru.Designer.cs + + ScriptDispatcher.cs + StatedFlag.cs @@ -368,7 +371,6 @@ - diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 1d6880b..0bebef8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -5,7 +5,6 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Expando; -using System.Windows.Threading; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -87,9 +86,9 @@ internal abstract class ActiveScriptJsEngineBase : IInnerJsEngine, IActiveScript private readonly string _engineModeName; /// - /// for the thread currently executing + /// Script dispatcher /// - private readonly Dispatcher _dispatcher = Dispatcher.CurrentDispatcher; + private static readonly ScriptDispatcher _dispatcher = new ScriptDispatcher(); /// /// Flag that object is destroyed @@ -111,53 +110,57 @@ protected ActiveScriptJsEngineBase(string clsid, JsEngineMode engineMode, string { _engineMode = engineMode; _engineModeName = JsEngineModeHelpers.GetModeName(engineMode); - _pActiveScript = IntPtr.Zero; + _documentVersion = DateTime.UtcNow.ToString("o"); - try - { - _pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); - _activeScript = (IActiveScript)Marshal.GetObjectForIUnknown(_pActiveScript); - } - catch (Exception e) + _dispatcher.Invoke(() => { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, lowerIeVersion, e.Message), _engineModeName); - } + _pActiveScript = IntPtr.Zero; - if (languageVersion != ScriptLanguageVersion.None) - { - var activeScriptProperty = _activeScript as IActiveScriptProperty; - if (activeScriptProperty != null) + try + { + _pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); + _activeScript = (IActiveScript)Marshal.GetObjectForIUnknown(_pActiveScript); + } + catch (Exception e) + { + throw new JsEngineLoadException( + string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, + _engineModeName, lowerIeVersion, e.Message), _engineModeName); + } + + if (languageVersion != ScriptLanguageVersion.None) { - object scriptLanguageVersion = (int)languageVersion; - uint result = activeScriptProperty.SetProperty((uint)ScriptProperty.InvokeVersioning, - IntPtr.Zero, ref scriptLanguageVersion); - if (result != (uint)ScriptHResult.Ok) + var activeScriptProperty = _activeScript as IActiveScriptProperty; + if (activeScriptProperty != null) { - throw new JsEngineLoadException( - string.Format(NetFrameworkStrings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); + object scriptLanguageVersion = (int)languageVersion; + uint result = activeScriptProperty.SetProperty((uint)ScriptProperty.InvokeVersioning, + IntPtr.Zero, ref scriptLanguageVersion); + if (result != (uint)ScriptHResult.Ok) + { + throw new JsEngineLoadException( + string.Format(NetFrameworkStrings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); + } } } - } - _activeScriptParse = new ActiveScriptParseWrapper(_pActiveScript, _activeScript); - _activeScriptParse.InitNew(); + _activeScriptParse = new ActiveScriptParseWrapper(_pActiveScript, _activeScript); + _activeScriptParse.InitNew(); - _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow(_pActiveScript); - _activeScriptGarbageCollector = _activeScript as IActiveScriptGarbageCollector; + _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow(_pActiveScript); + _activeScriptGarbageCollector = _activeScript as IActiveScriptGarbageCollector; - _activeScript.SetScriptSite(this); - _activeScript.SetScriptState(ScriptState.Started); + _activeScript.SetScriptSite(this); + _activeScript.SetScriptState(ScriptState.Started); - InitScriptDispatch(); - _documentVersion = DateTime.UtcNow.ToString("o"); + InitScriptDispatch(); + }); LoadResources(useEcmaScript5Polyfill, useJson2Library); } /// - /// Destructs instance of ActiveScript JavaScript engine + /// Destructs an instance of ActiveScript JavaScript engine /// ~ActiveScriptJsEngineBase() { @@ -318,46 +321,52 @@ private void ThrowError() private void InvokeScript(Action action) { - try + _dispatcher.Invoke(() => { - _dispatcher.Invoke(DispatcherPriority.Input, action); - } - catch (ActiveScriptException e) - { - throw ConvertActiveScriptExceptionToJsRuntimeException(e); - } - catch (TargetInvocationException e) - { - var activeScriptException = e.InnerException as ActiveScriptException; - if (activeScriptException != null) + try + { + action(); + } + catch (ActiveScriptException e) { - throw ConvertActiveScriptExceptionToJsRuntimeException(activeScriptException); + throw ConvertActiveScriptExceptionToJsRuntimeException(e); } + catch (TargetInvocationException e) + { + var activeScriptException = e.InnerException as ActiveScriptException; + if (activeScriptException != null) + { + throw ConvertActiveScriptExceptionToJsRuntimeException(activeScriptException); + } - throw; - } + throw; + } + }); } private T InvokeScript(Func func) { - try + return _dispatcher.Invoke(() => { - return (T)_dispatcher.Invoke(DispatcherPriority.Input, func); - } - catch (ActiveScriptException e) - { - throw ConvertActiveScriptExceptionToJsRuntimeException(e); - } - catch (TargetInvocationException e) - { - var activeScriptException = e.InnerException as ActiveScriptException; - if (activeScriptException != null) + try + { + return func(); + } + catch (ActiveScriptException e) { - throw ConvertActiveScriptExceptionToJsRuntimeException(activeScriptException); + throw ConvertActiveScriptExceptionToJsRuntimeException(e); } + catch (TargetInvocationException e) + { + var activeScriptException = e.InnerException as ActiveScriptException; + if (activeScriptException != null) + { + throw ConvertActiveScriptExceptionToJsRuntimeException(activeScriptException); + } - throw; - } + throw; + } + }); } /// @@ -554,51 +563,6 @@ private void ExecuteResource(string resourceName, Assembly assembly) Execute(code); } - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) - { - _dispatcher.Invoke(DispatcherPriority.Input, (Action)(() => - { - if (_disposedFlag.Set()) - { - if (_dispatch != null) - { - ComHelpers.ReleaseComObject(ref _dispatch, !disposing); - _dispatch = null; - } - - _activeScriptGarbageCollector = null; - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptGarbageCollector); - - if (_activeScriptParse != null) - { - _activeScriptParse.Dispose(); - _activeScriptParse = null; - } - - if (_activeScript != null) - { - _activeScript.Close(); - Marshal.FinalReleaseComObject(_activeScript); - _activeScript = null; - } - - ComHelpers.ReleaseAndEmpty(ref _pActiveScript); - - if (_hostItems != null) - { - _hostItems.Clear(); - } - - _lastException = null; - } - })); - } - #region IActiveScriptSite implementation /// @@ -832,7 +796,7 @@ public void EmbedHostType(string itemName, Type type) public void CollectGarbage() { - InvokeScript(() => InnerCollectGarbage(ScriptGCType.Exhaustive)); + _dispatcher.Invoke(() => InnerCollectGarbage(ScriptGCType.Exhaustive)); } #endregion @@ -848,6 +812,54 @@ public void Dispose() GC.SuppressFinalize(this); } + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + private void Dispose(bool disposing) + { + if (_disposedFlag.Set()) + { + _dispatcher.Invoke(() => + { + if (_dispatch != null) + { + ComHelpers.ReleaseComObject(ref _dispatch, !disposing); + _dispatch = null; + } + + _activeScriptGarbageCollector = null; + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptGarbageCollector); + + if (_activeScriptParse != null) + { + _activeScriptParse.Dispose(); + _activeScriptParse = null; + } + + if (_activeScript != null) + { + _activeScript.Close(); + Marshal.FinalReleaseComObject(_activeScript); + _activeScript = null; + } + + ComHelpers.ReleaseAndEmpty(ref _pActiveScript); + + if (disposing) + { + if (_hostItems != null) + { + _hostItems.Clear(); + } + + _lastException = null; + } + }); + } + } + #endregion } } diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index e83e822..9df536d 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -32,15 +32,10 @@ internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine /// Flag indicating whether debugging started /// private StatedFlag _debuggingStartedFlag; - - /// - /// Synchronizer of code execution - /// - protected readonly object _executionSynchronizer = new object(); #if NETSTANDARD1_3 /// - /// List of external objects + /// Set of external objects /// protected readonly HashSet _externalObjects = new HashSet(); @@ -50,9 +45,19 @@ internal abstract class ChakraJsRtJsEngineBase : IInnerJsEngine protected JsObjectFinalizeCallback _externalObjectFinalizeCallback; #endif + /// + /// Script dispatcher + /// + protected readonly ScriptDispatcher _dispatcher = new ScriptDispatcher(); /// - /// Constructs instance of the Chakra JsRT JavaScript engine + /// Flag that object is destroyed + /// + protected StatedFlag _disposedFlag = new StatedFlag(); + + + /// + /// Constructs an instance of the Chakra JsRT JavaScript engine /// /// JavaScript engine mode /// Flag for whether to enable script debugging features @@ -96,12 +101,9 @@ private void ExternalObjectFinalizeCallback(IntPtr data) return; } - lock (_executionSynchronizer) + if (_externalObjects != null) { - if (_externalObjects != null) - { - _externalObjects.Remove(obj); - } + _externalObjects.Remove(obj); } } #endif @@ -135,15 +137,25 @@ private void ExternalObjectFinalizeCallback(IntPtr data) #region IDisposable implementation - public virtual void Dispose() + public abstract void Dispose(); + + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected virtual void Dispose(bool disposing) { #if NETSTANDARD1_3 - if (_externalObjects != null) + if (disposing) { - _externalObjects.Clear(); - } + if (_externalObjects != null) + { + _externalObjects.Clear(); + } - _externalObjectFinalizeCallback = null; + _externalObjectFinalizeCallback = null; + } #endif } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 89b45b7..17145a9 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -29,7 +29,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Instance of JavaScript context /// - private readonly EdgeJsContext _jsContext; + private EdgeJsContext _jsContext; /// /// Flag indicating whether this JavaScript engine is supported @@ -48,47 +48,45 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase private readonly HashSet _nativeFunctions = new HashSet(); #endif - /// - /// Flag that object is destroyed - /// - private StatedFlag _disposedFlag = new StatedFlag(); - /// - /// Constructs instance of the Chakra “Edge” JsRT JavaScript engine + /// Constructs an instance of the Chakra “Edge” JsRT JavaScript engine /// /// Flag for whether to enable script debugging features public ChakraEdgeJsRtJsEngine(bool enableDebugging) : base(JsEngineMode.ChakraEdgeJsRt, enableDebugging) { - try + _dispatcher.Invoke(() => { - _jsRuntime = CreateJsRuntime(); - _jsContext = _jsRuntime.CreateContext(); - } - catch (JsUsageException e) - { - string errorMessage; - if (e.ErrorCode == JsErrorCode.WrongThread) + try { - errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + _jsRuntime = CreateJsRuntime(); + _jsContext = _jsRuntime.CreateContext(); } - else + catch (JsUsageException e) { - errorMessage = string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message); - } + string errorMessage; + if (e.ErrorCode == JsErrorCode.WrongThread) + { + errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + } + else + { + errorMessage = string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message); + } - throw new JsEngineLoadException(errorMessage, _engineModeName); - } - catch (Exception e) - { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); - } + throw new JsEngineLoadException(errorMessage, _engineModeName); + } + catch (Exception e) + { + throw new JsEngineLoadException( + string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); + } + }); } /// - /// Destructs instance of the Chakra “Edge” JsRT JavaScript engine + /// Destructs an instance of the Chakra “Edge” JsRT JavaScript engine /// ~ChakraEdgeJsRtJsEngine() { @@ -887,68 +885,48 @@ protected override void InnerStartDebugging() private void InvokeScript(Action action) { - lock (_executionSynchronizer) - using (new EdgeJsScope(_jsContext)) + _dispatcher.Invoke(() => { - if (_enableDebugging) + using (new EdgeJsScope(_jsContext)) { - StartDebugging(); - } + if (_enableDebugging) + { + StartDebugging(); + } - try - { - action(); - } - catch (JsException e) - { - throw ConvertJsExceptionToJsRuntimeException(e); + try + { + action(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); + } } - } + }); } private T InvokeScript(Func func) { - lock (_executionSynchronizer) - using (new EdgeJsScope(_jsContext)) - { - if (_enableDebugging) - { - StartDebugging(); - } - - try - { - return func(); - } - catch (JsException e) - { - throw ConvertJsExceptionToJsRuntimeException(e); - } - } - } - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) - { - lock (_executionSynchronizer) + return _dispatcher.Invoke(() => { - if (_disposedFlag.Set()) + using (new EdgeJsScope(_jsContext)) { - _jsRuntime.Dispose(); - base.Dispose(); -#if NETSTANDARD1_3 + if (_enableDebugging) + { + StartDebugging(); + } - if (_nativeFunctions != null) + try { - _nativeFunctions.Clear(); + return func(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); } -#endif } - } + }); } #region IInnerJsEngine implementation @@ -1099,10 +1077,7 @@ public override void EmbedHostType(string itemName, Type type) public override void CollectGarbage() { - lock (_executionSynchronizer) - { - _jsRuntime.CollectGarbage(); - } + _dispatcher.Invoke(() => _jsRuntime.CollectGarbage()); } #endregion @@ -1118,6 +1093,34 @@ public override void Dispose() GC.SuppressFinalize(this); } + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected override void Dispose(bool disposing) + { + if (_disposedFlag.Set()) + { + _dispatcher.Invoke(() => + { + _jsRuntime.Dispose(); + base.Dispose(disposing); +#if NETSTANDARD1_3 + + if (disposing) + { + if (_nativeFunctions != null) + { + _nativeFunctions.Clear(); + } + } +#endif + }); + _dispatcher.Dispose(); + } + } + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 576d790..1e8cbf1 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -34,7 +34,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Instance of JavaScript context /// - private readonly IeJsContext _jsContext; + private IeJsContext _jsContext; /// /// Flag indicating whether this JavaScript engine is supported @@ -53,49 +53,47 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase private readonly HashSet _nativeFunctions = new HashSet(); #endif - /// - /// Flag that object is destroyed - /// - private StatedFlag _disposedFlag = new StatedFlag(); - /// - /// Constructs instance of the Chakra “IE” JsRT JavaScript engine + /// Constructs an instance of the Chakra “IE” JsRT JavaScript engine /// /// Flag for whether to enable script debugging features public ChakraIeJsRtJsEngine(bool enableDebugging) : base(JsEngineMode.ChakraIeJsRt, enableDebugging) { - try + _dispatcher.Invoke(() => { - _jsRuntime = CreateJsRuntime(); - _jsContext = _jsRuntime.CreateContext(); - } - catch (JsUsageException e) - { - string errorMessage; - if (e.ErrorCode == JsErrorCode.WrongThread) + try { - errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + _jsRuntime = CreateJsRuntime(); + _jsContext = _jsRuntime.CreateContext(); } - else + catch (JsUsageException e) { - errorMessage = string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message); - } + string errorMessage; + if (e.ErrorCode == JsErrorCode.WrongThread) + { + errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + } + else + { + errorMessage = string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, + _engineModeName, LOWER_IE_VERSION, e.Message); + } - throw new JsEngineLoadException(errorMessage, _engineModeName); - } - catch (Exception e) - { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message), _engineModeName); - } + throw new JsEngineLoadException(errorMessage, _engineModeName); + } + catch (Exception e) + { + throw new JsEngineLoadException( + string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, + _engineModeName, LOWER_IE_VERSION, e.Message), _engineModeName); + } + }); } /// - /// Destructs instance of the Chakra “IE” JsRT JavaScript engine + /// Destructs an instance of the Chakra “IE” JsRT JavaScript engine /// ~ChakraIeJsRtJsEngine() { @@ -925,68 +923,48 @@ protected override void InnerStartDebugging() private void InvokeScript(Action action) { - lock (_executionSynchronizer) - using (new IeJsScope(_jsContext)) + _dispatcher.Invoke(() => { - if (_enableDebugging) + using (new IeJsScope(_jsContext)) { - StartDebugging(); - } + if (_enableDebugging) + { + StartDebugging(); + } - try - { - action(); - } - catch (JsException e) - { - throw ConvertJsExceptionToJsRuntimeException(e); + try + { + action(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); + } } - } + }); } private T InvokeScript(Func func) { - lock (_executionSynchronizer) - using (new IeJsScope(_jsContext)) - { - if (_enableDebugging) - { - StartDebugging(); - } - - try - { - return func(); - } - catch (JsException e) - { - throw ConvertJsExceptionToJsRuntimeException(e); - } - } - } - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) - { - lock (_executionSynchronizer) + return _dispatcher.Invoke(() => { - if (_disposedFlag.Set()) + using (new IeJsScope(_jsContext)) { - _jsRuntime.Dispose(); - base.Dispose(); -#if NETSTANDARD1_3 + if (_enableDebugging) + { + StartDebugging(); + } - if (_nativeFunctions != null) + try { - _nativeFunctions.Clear(); + return func(); + } + catch (JsException e) + { + throw ConvertJsExceptionToJsRuntimeException(e); } -#endif } - } + }); } #region IInnerJsEngine implementation @@ -1137,10 +1115,7 @@ public override void EmbedHostType(string itemName, Type type) public override void CollectGarbage() { - lock (_executionSynchronizer) - { - _jsRuntime.CollectGarbage(); - } + _dispatcher.Invoke(() => _jsRuntime.CollectGarbage()); } #endregion @@ -1156,6 +1131,34 @@ public override void Dispose() GC.SuppressFinalize(this); } + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected override void Dispose(bool disposing) + { + if (_disposedFlag.Set()) + { + _dispatcher.Invoke(() => + { + _jsRuntime.Dispose(); + base.Dispose(disposing); +#if NETSTANDARD1_3 + + if (disposing) + { + if (_nativeFunctions != null) + { + _nativeFunctions.Clear(); + } + } +#endif + }); + _dispatcher.Dispose(); + } + } + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs new file mode 100644 index 0000000..6cda14d --- /dev/null +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -0,0 +1,294 @@ +using System; +using System.Collections.Generic; +using System.Threading; + +namespace MsieJavaScriptEngine +{ + /// + /// Provides services for managing the queue of script tasks on the thread with increased stack size + /// + internal sealed class ScriptDispatcher : IDisposable + { +#if !NETSTANDARD1_3 + /// + /// The stack size is sufficient to run the code of modern JavaScript libraries + /// + const int SUFFICIENT_STACK_SIZE = 2 * 1024 * 1024; + +#endif + /// + /// The thread with increased stack size + /// + private Thread _thread; + + /// + /// Event to signal when the new script task entered to the queue + /// + private AutoResetEvent _waitHandle = new AutoResetEvent(false); + + /// + /// Queue of script tasks + /// + private Queue _taskQueue = new Queue(); + + /// + /// Synchronizer of script task queue + /// + private readonly object _taskQueueSynchronizer = new object(); + + /// + /// Flag that object is destroyed + /// + private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); + + + /// + /// Constructs an instance of script dispatcher + /// + public ScriptDispatcher() + { +#if NETSTANDARD1_3 + _thread = new Thread(StartThread) +#else + _thread = new Thread(StartThread, SUFFICIENT_STACK_SIZE) +#endif + { + IsBackground = true + }; + _thread.Start(); + } + + /// + /// Destructs an instance of script dispatcher + /// + ~ScriptDispatcher() + { + Dispose(false); + } + + + private void VerifyNotDisposed() + { + if (_disposedFlag.IsSet()) + { + throw new ObjectDisposedException(ToString()); + } + } + + /// + /// Starts a thread with increased stack size. + /// Loops forever, processing script tasks from the queue. + /// + private void StartThread() + { + while(true) + { + ScriptTask task = null; + + lock (_taskQueueSynchronizer) + { + if (_taskQueue.Count > 0) + { + task = _taskQueue.Dequeue(); + if (task == null) + { + return; + } + } + } + + if (task != null) + { + try + { + task.Result = task.Delegate(); + } + catch (Exception e) + { + task.Exception = e; + } + + task.WaitHandle.Set(); + } + else + { + _waitHandle.WaitOne(); + } + } + } + + /// + /// Adds a script task to the end of the queue + /// + /// Script task + private void EnqueueTask(ScriptTask task) + { + lock (_taskQueueSynchronizer) + { + _taskQueue.Enqueue(task); + } + _waitHandle.Set(); + } + + /// + /// Runs a specified delegate on the thread with increased stack size, + /// and returns its result as an . + /// Blocks until the invocation of delegate is completed. + /// + /// Delegate to invocation + /// Result of the delegate invocation + private object InnnerInvoke(Func del) + { + var waitHandle = new ManualResetEvent(false); + var task = new ScriptTask(del, waitHandle); + EnqueueTask(task); + + waitHandle.WaitOne(); + waitHandle.Dispose(); + + if (task.Exception != null) + { + throw task.Exception; + } + + return task.Result; + } + + /// + /// Runs a specified delegate on the thread with increased stack size, + /// and returns its result as an . + /// Blocks until the invocation of delegate is completed. + /// + /// The type of the return value of the method, + /// that specified delegate encapsulates + /// Delegate to invocation + /// Result of the delegate invocation + public T Invoke(Func func) + { + VerifyNotDisposed(); + + return (T)InnnerInvoke(() => func()); + } + + /// + /// Runs a specified delegate on the thread with increased stack size. + /// Blocks until the invocation of delegate is completed. + /// + /// Delegate to invocation + public void Invoke(Action action) + { + VerifyNotDisposed(); + + InnnerInvoke(() => + { + action(); + return null; + }); + } + + #region IDisposable implementation + + /// + /// Destroys object + /// + public void Dispose() + { + Dispose(true /* disposing */); + GC.SuppressFinalize(this); + } + + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + private void Dispose(bool disposing) + { + if (_disposedFlag.Set()) + { + EnqueueTask(null); + _thread.Join(); + + if (_waitHandle != null) + { + _waitHandle.Dispose(); + _waitHandle = null; + } + + if (disposing) + { + lock (_taskQueueSynchronizer) + { + if (_taskQueue != null) + { + _taskQueue.Clear(); + } + } + + _thread = null; + } + } + } + + #endregion + + #region Internal types + + /// + /// Represents a script task, that must be executed on separate thread + /// + private sealed class ScriptTask + { + /// + /// Gets a delegate to invocation + /// + public Func Delegate + { + get; + private set; + } + + /// + /// Gets a event to signal when the invocation of delegate has completed + /// + public ManualResetEvent WaitHandle + { + get; + private set; + } + + /// + /// Gets or sets a result of the delegate invocation + /// + public object Result + { + get; + set; + } + + /// + /// Gets or sets a exception, that occurred during the invocation of delegate. + /// If no exception has occurred, this will be null. + /// + public Exception Exception + { + get; + set; + } + + + /// + /// Constructs an instance of script task + /// + /// Delegate to invocation + /// Event to signal when the invocation of delegate has completed + public ScriptTask(Func del, ManualResetEvent waitHandle) + { + Delegate = del; + WaitHandle = waitHandle; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 22e2e25..417e11f 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -34,7 +34,8 @@ "System.Runtime.InteropServices": "4.1.0", "System.Text.Encoding": "4.0.11", "System.Text.RegularExpressions": "4.1.0", - "System.Threading": "4.0.11" + "System.Threading": "4.0.11", + "System.Threading.Thread": "4.0.0" }, "buildOptions": { "compile": { @@ -53,9 +54,6 @@ } }, "net451": { - "frameworkAssemblies": { - "WindowsBase": "4.0.0.0" - }, "buildOptions": { "embed": [ "Resources/ES5.min.js", "Resources/json2.min.js" ], "compile": { From 0f6481b0898a4ecdc5980a0325770893cbcb1405 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 18 Dec 2016 17:05:52 +0300 Subject: [PATCH 057/238] Changed a sufficient stack size --- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 6cda14d..ef7493d 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Threading; +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine { /// @@ -11,9 +13,14 @@ internal sealed class ScriptDispatcher : IDisposable { #if !NETSTANDARD1_3 /// - /// The stack size is sufficient to run the code of modern JavaScript libraries + /// The stack size is sufficient to run the code of modern JavaScript libraries in 32-bit process /// - const int SUFFICIENT_STACK_SIZE = 2 * 1024 * 1024; + const int STACK_SIZE_32 = 492 * 1024; // like 32-bit Node.js + + /// + /// The stack size is sufficient to run the code of modern JavaScript libraries in 64-bit process + /// + const int STACK_SIZE_64 = 984 * 1024; // like 64-bit Node.js #endif /// @@ -29,7 +36,7 @@ internal sealed class ScriptDispatcher : IDisposable /// /// Queue of script tasks /// - private Queue _taskQueue = new Queue(); + private readonly Queue _taskQueue = new Queue(); /// /// Synchronizer of script task queue @@ -50,7 +57,9 @@ public ScriptDispatcher() #if NETSTANDARD1_3 _thread = new Thread(StartThread) #else - _thread = new Thread(StartThread, SUFFICIENT_STACK_SIZE) + int sufficientStackSize = Utils.Is64BitProcess() ? STACK_SIZE_64 : STACK_SIZE_32; + + _thread = new Thread(StartThread, sufficientStackSize) #endif { IsBackground = true From 17ad92aab4ccd1db49f54a4d4ff2e318bee29dee Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Dec 2016 11:50:44 +0300 Subject: [PATCH 058/238] JSON2 library was updated to version of October 28, 2016 --- NuGet/MsieJavaScriptEngine.nuspec | 3 ++- NuGet/readme.txt | 3 ++- src/MsieJavaScriptEngine/Resources/json2.js | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 8aed8d7..6e4e806 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -13,7 +13,8 @@ This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; - 2. Fixed a error “Out of stack space”. +2. Fixed a error “Out of stack space”; +3. JSON2 library was updated to version of October 28, 2016. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 2d5b048..4be7dde 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -23,7 +23,8 @@ ============= 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; - 2. Fixed a error “Out of stack space”. + 2. Fixed a error “Out of stack space”; + 3. JSON2 library was updated to version of October 28, 2016. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js index d4720c0..e66f817 100644 --- a/src/MsieJavaScriptEngine/Resources/json2.js +++ b/src/MsieJavaScriptEngine/Resources/json2.js @@ -1,5 +1,5 @@ // json2.js -// 2016-05-01 +// 2016-10-28 // Public Domain. // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. // See http://www.JSON.org/js.html @@ -10,7 +10,7 @@ // NOT CONTROL. // This file creates a global JSON object containing two methods: stringify -// and parse. This file is provides the ES5 JSON capability to ES3 systems. +// and parse. This file provides the ES5 JSON capability to ES3 systems. // If a project might run on IE8 or earlier, then this file should be included. // This file does nothing on ES5 systems. @@ -162,7 +162,7 @@ if (typeof JSON !== "object") { var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g; var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g; var rx_four = /(?:^|:|,)(?:\s*\[)+/g; - var rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; function f(n) { From d0a6a514d69db655cfc0835a9c4acb33e5008218 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Dec 2016 16:07:28 +0300 Subject: [PATCH 059/238] Was made refactoring --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 16 +++++----- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 21 +++++++------ .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 21 +++++++------ src/MsieJavaScriptEngine/ScriptDispatcher.cs | 31 ++++++++++--------- 4 files changed, 47 insertions(+), 42 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 0bebef8..ceb75e9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -846,17 +846,17 @@ private void Dispose(bool disposing) } ComHelpers.ReleaseAndEmpty(ref _pActiveScript); + }); - if (disposing) + if (disposing) + { + if (_hostItems != null) { - if (_hostItems != null) - { - _hostItems.Clear(); - } - - _lastException = null; + _hostItems.Clear(); } - }); + + _lastException = null; + } } } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 17145a9..8a90ae0 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1102,22 +1102,23 @@ protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - _dispatcher.Invoke(() => + if (_dispatcher != null) { - _jsRuntime.Dispose(); - base.Dispose(disposing); + _dispatcher.Invoke(() => _jsRuntime.Dispose()); + _dispatcher.Dispose(); + } + + base.Dispose(disposing); #if NETSTANDARD1_3 - if (disposing) + if (disposing) + { + if (_nativeFunctions != null) { - if (_nativeFunctions != null) - { - _nativeFunctions.Clear(); - } + _nativeFunctions.Clear(); } + } #endif - }); - _dispatcher.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 1e8cbf1..ea262ab 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1140,22 +1140,23 @@ protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - _dispatcher.Invoke(() => + if (_dispatcher != null) { - _jsRuntime.Dispose(); - base.Dispose(disposing); + _dispatcher.Invoke(() => _jsRuntime.Dispose()); + _dispatcher.Dispose(); + } + + base.Dispose(disposing); #if NETSTANDARD1_3 - if (disposing) + if (disposing) + { + if (_nativeFunctions != null) { - if (_nativeFunctions != null) - { - _nativeFunctions.Clear(); - } + _nativeFunctions.Clear(); } + } #endif - }); - _dispatcher.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index ef7493d..a1abaef 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -101,6 +101,7 @@ private void StartThread() task = _taskQueue.Dequeue(); if (task == null) { + _taskQueue.Clear(); return; } } @@ -176,6 +177,11 @@ public T Invoke(Func func) { VerifyNotDisposed(); + if (func == null) + { + throw new ArgumentNullException("func"); + } + return (T)InnnerInvoke(() => func()); } @@ -188,6 +194,11 @@ public void Invoke(Action action) { VerifyNotDisposed(); + if (action == null) + { + throw new ArgumentNullException("action"); + } + InnnerInvoke(() => { action(); @@ -216,25 +227,17 @@ private void Dispose(bool disposing) if (_disposedFlag.Set()) { EnqueueTask(null); - _thread.Join(); - if (_waitHandle != null) + if (_thread != null) { - _waitHandle.Dispose(); - _waitHandle = null; + _thread.Join(); + _thread = null; } - if (disposing) + if (_waitHandle != null) { - lock (_taskQueueSynchronizer) - { - if (_taskQueue != null) - { - _taskQueue.Clear(); - } - } - - _thread = null; + _waitHandle.Dispose(); + _waitHandle = null; } } } From 5412abf60d501633229ec19366a505ce5d9aeca0 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Dec 2016 18:56:36 +0300 Subject: [PATCH 060/238] Downgraded .NET Framework version from 4.5.1 to 4.5 --- NuGet/MsieJavaScriptEngine.nuspec | 5 +++-- NuGet/build-package.cmd | 8 ++++---- NuGet/readme.txt | 3 ++- _generate-resx.shade | 2 +- src/MsieJavaScriptEngine/Helpers/ComHelpers.cs | 2 +- .../Resources/CommonStrings.Designer.cs | 2 +- .../Resources/NetCoreStrings.Designer.cs | 2 +- .../Resources/NetFrameworkStrings.Designer.cs | 2 +- src/MsieJavaScriptEngine/Utilities/TypeConverter.cs | 2 +- src/MsieJavaScriptEngine/project.json | 2 +- 10 files changed, 16 insertions(+), 14 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 6e4e806..eba26d3 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -14,13 +14,14 @@ This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; 2. Fixed a error “Out of stack space”; -3. JSON2 library was updated to version of October 28, 2016. +3. JSON2 library was updated to version of October 28, 2016; +4. Downgraded .NET Framework version from 4.5.1 to 4.5. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra - + diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index a543c8b..3196634 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -20,10 +20,10 @@ del bundler-and-minifier-license.txt /Q/S xcopy "%net4_project_bin_dir%\%project_name%.dll" lib\net40-client\ xcopy "%net4_project_bin_dir%\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ -%dotnet_cli% build "%dotnet_project_source_dir%" --framework net451 --configuration Release --no-dependencies --no-incremental -xcopy "%dotnet_project_bin_dir%\net451\%project_name%.dll" lib\net451\ -xcopy "%dotnet_project_bin_dir%\net451\%project_name%.xml" lib\net451\ -xcopy "%dotnet_project_bin_dir%\net451\ru-ru\%project_name%.resources.dll" lib\net451\ru-ru\ +%dotnet_cli% build "%dotnet_project_source_dir%" --framework net45 --configuration Release --no-dependencies --no-incremental +xcopy "%dotnet_project_bin_dir%\net45\%project_name%.dll" lib\net45\ +xcopy "%dotnet_project_bin_dir%\net45\%project_name%.xml" lib\net45\ +xcopy "%dotnet_project_bin_dir%\net45\ru-ru\%project_name%.resources.dll" lib\net45\ru-ru\ %dotnet_cli% build "%dotnet_project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental xcopy "%dotnet_project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 4be7dde..2bf54d3 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -24,7 +24,8 @@ 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; 2. Fixed a error “Out of stack space”; - 3. JSON2 library was updated to version of October 28, 2016. + 3. JSON2 library was updated to version of October 28, 2016; + 4. Downgraded .NET Framework version from 4.5.1 to 4.5. ============ PROJECT SITE diff --git a/_generate-resx.shade b/_generate-resx.shade index c50bead..187e837 100644 --- a/_generate-resx.shade +++ b/_generate-resx.shade @@ -62,7 +62,7 @@ namespace {0} private static Lazy _resourceManager = new Lazy(() => new ResourceManager( ""{0}.{1}"", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 typeof({1}).GetTypeInfo().Assembly #elif NET40 typeof({1}).Assembly diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index e609771..3f27157 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,6 +1,6 @@ #if !NETSTANDARD1_3 using System; -#if NET451 +#if NET45 using System.Reflection; #endif using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 5ebfdff..8542227 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -21,7 +21,7 @@ public class CommonStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.CommonStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 typeof(CommonStrings).GetTypeInfo().Assembly #elif NET40 typeof(CommonStrings).Assembly diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index 8f57048..a2d7c3f 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -21,7 +21,7 @@ public class NetCoreStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetCoreStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 typeof(NetCoreStrings).GetTypeInfo().Assembly #elif NET40 typeof(NetCoreStrings).Assembly diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index 221d426..0d043fb 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -21,7 +21,7 @@ public class NetFrameworkStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetFrameworkStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 +#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 typeof(NetFrameworkStrings).GetTypeInfo().Assembly #elif NET40 typeof(NetFrameworkStrings).Assembly diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index e1944a5..93a4d16 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Globalization; using System.Linq; -#if NETSTANDARD1_3 || NET451 +#if NETSTANDARD1_3 || NET45 using System.Reflection; #endif using OriginalTypeConverter = System.ComponentModel.TypeConverter; diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 417e11f..f9cd402 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -53,7 +53,7 @@ } } }, - "net451": { + "net45": { "buildOptions": { "embed": [ "Resources/ES5.min.js", "Resources/json2.min.js" ], "compile": { From d29aab1f4e2f2021cf80cd6fcb7eff148d927b07 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Dec 2016 19:38:41 +0300 Subject: [PATCH 061/238] Added support of .NET Core 1.0.3 --- NuGet/MsieJavaScriptEngine.nuspec | 3 ++- NuGet/readme.txt | 3 ++- build.cmd | 2 +- build.sh | 2 +- global.json | 2 +- test/MsieJavaScriptEngine.Test.Auto/project.json | 2 +- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 2 +- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 2 +- test/MsieJavaScriptEngine.Test.Common/project.json | 2 +- 9 files changed, 11 insertions(+), 9 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index eba26d3..9fe62c9 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -15,7 +15,8 @@ 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; 2. Fixed a error “Out of stack space”; 3. JSON2 library was updated to version of October 28, 2016; -4. Downgraded .NET Framework version from 4.5.1 to 4.5. +4. Downgraded .NET Framework version from 4.5.1 to 4.5; +5. Added support of .NET Core 1.0.3. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 2bf54d3..cf94ac9 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -25,7 +25,8 @@ takes the type, need to pass the resource name without the namespace; 2. Fixed a error “Out of stack space”; 3. JSON2 library was updated to version of October 28, 2016; - 4. Downgraded .NET Framework version from 4.5.1 to 4.5. + 4. Downgraded .NET Framework version from 4.5.1 to 4.5; + 5. Added support of .NET Core 1.0.3. ============ PROJECT SITE diff --git a/build.cmd b/build.cmd index d4aa0c5..b8213c1 100644 --- a/build.cmd +++ b/build.cmd @@ -3,7 +3,7 @@ setlocal set ORIGINAL_CURRENT_DIR=%cd% set KOREBUILD_DOTNET_CHANNEL=preview -set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003131 +set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003156 cd %~dp0 diff --git a/build.sh b/build.sh index b7f945d..e916a5a 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ORIGINAL_CURRENT_DIR=%cd% KOREBUILD_DOTNET_CHANNEL=preview -KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003131 +KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003156 repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder diff --git a/global.json b/global.json index 4b13e7a..30a0fdd 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "projects": [ "src", "test" ], "sdk": { - "version": "1.0.0-preview2-003131" + "version": "1.0.0-preview2-003156" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index 1558c33..e3f9f3e 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.1", + "version": "1.0.3", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index 1558c33..e3f9f3e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.1", + "version": "1.0.3", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index 1558c33..e3f9f3e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -18,7 +18,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.1", + "version": "1.0.3", "type": "platform" } } diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index bf9a4eb..f68e208 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -24,7 +24,7 @@ "imports": [ "portable-net451+win8" ], "dependencies": { "Microsoft.NETCore.App": { - "version": "1.0.1", + "version": "1.0.3", "type": "platform" } } From d25d1d21d2faf2ff4322ee7e3cc213a2ef72aca7 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 19 Dec 2016 20:13:43 +0300 Subject: [PATCH 062/238] Version 2.1.0 --- CHANGELOG.md | 7 +++++++ NuGet/MsieJavaScriptEngine.nuspec | 12 ++++++------ NuGet/readme.txt | 14 +++++++------- .../Properties/AssemblyInfo.cs | 4 ++-- src/MsieJavaScriptEngine/project.json | 2 +- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 17 files changed, 47 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19696fb..262cd6a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,13 @@ Change log ========== +## December 19, 2016 - v2.1.0 + * Added support of .NET Core 1.0.3 + * Downgraded .NET Framework version from 4.5.1 to 4.5 + * Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace + * Fixed a error “Out of stack space” + * JSON2 library was updated to version of October 28, 2016 + ## December 2, 2016 - v2.0.2 * Another attempt to prevent occurrence of the access violation exception in the `CallFunction` method diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 9fe62c9..6e8457c 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.0.2 + 2.1.0 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,11 +12,11 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; -2. Fixed a error “Out of stack space”; -3. JSON2 library was updated to version of October 28, 2016; -4. Downgraded .NET Framework version from 4.5.1 to 4.5; -5. Added support of .NET Core 1.0.3. + 1. Added support of .NET Core 1.0.3; +2. Downgraded .NET Framework version from 4.5.1 to 4.5; +3. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; +4. Fixed a error “Out of stack space”; +5. JSON2 library was updated to version of October 28, 2016. Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index cf94ac9..fcf1c9d 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@ -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.0.2 + README file for MSIE JavaScript Engine for .NET v2.1.0 -------------------------------------------------------------------------------- @@ -21,12 +21,12 @@ ============= RELEASE NOTES ============= - 1. Now when you call the overloaded version of the `ExecuteResource` method, that - takes the type, need to pass the resource name without the namespace; - 2. Fixed a error “Out of stack space”; - 3. JSON2 library was updated to version of October 28, 2016; - 4. Downgraded .NET Framework version from 4.5.1 to 4.5; - 5. Added support of .NET Core 1.0.3. + 1. Added support of .NET Core 1.0.3; + 2. Downgraded .NET Framework version from 4.5.1 to 4.5; + 3. Now when you call the overloaded version of the `ExecuteResource` method, + that takes the type, need to pass the resource name without the namespace; + 4. Fixed a error “Out of stack space”; + 5. JSON2 library was updated to version of October 28, 2016. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index dfd7a2c..5e38754 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("2.0.2.0")] -[assembly: AssemblyFileVersion("2.0.2.0")] +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] [module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index f9cd402..36ffa24 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.0.2", + "version": "2.1.0", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 2a60c5c..9da6fee 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index e3f9f3e..d7c04ae 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.1" + "MsieJavaScriptEngine.Test.Common": "2.1.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index 34f0dcb..b2a49b9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index 2f3122c..a2bb52f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.1" + "MsieJavaScriptEngine.Test.Common": "2.1.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index a5b7f89..349d344 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index e3f9f3e..d7c04ae 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.1" + "MsieJavaScriptEngine.Test.Common": "2.1.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 3bbe849..aeba34e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index e3f9f3e..d7c04ae 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.1" + "MsieJavaScriptEngine.Test.Common": "2.1.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index 7933315..6624399 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index 2f3122c..a2bb52f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.0.1" + "MsieJavaScriptEngine.Test.Common": "2.1.0" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index 838b521..c616f12 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("2.0.1.0")] -[assembly: AssemblyFileVersion("2.0.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.0.0")] +[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index f68e208..d372a8f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.0.1", + "version": "2.1.0", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.0.2" + "MsieJavaScriptEngine": "2.1.0" }, "buildOptions": { From 88a7882f180d894e88ae73fcd0e98a4cf7e06f95 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 17 Jan 2017 21:04:28 +0300 Subject: [PATCH 063/238] Was made refactoring --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 4 +- .../JsRt/Edge/EdgeJsErrorHelpers.cs | 22 +++- .../JsRt/Edge/EdgeJsValue.cs | 21 +++ .../JsRt/Edge/EdgeNativeMethods.cs | 121 +++++++++++------- .../JsRt/Ie/IeJsErrorHelpers.cs | 22 +++- .../JsRt/Ie/IeNativeMethods.cs | 121 +++++++++++------- src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs | 16 +++ .../JsRt/JsRuntimeAttributes.cs | 2 +- 8 files changed, 229 insertions(+), 100 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 8a90ae0..14eb5a3 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -836,14 +836,14 @@ private JsRuntimeException ConvertJsExceptionToJsRuntimeException( if (errorValue.HasProperty(linePropertyId)) { EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; + lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; } EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); if (errorValue.HasProperty(columnPropertyId)) { EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; + columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; } EdgeJsPropertyId sourcePropertyId = EdgeJsPropertyId.FromString("source"); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs index fbb2e04..bb92be3 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs @@ -15,6 +15,8 @@ public static void ThrowIfError(JsErrorCode error) { switch (error) { + #region Usage + case JsErrorCode.InvalidArgument: throw new JsUsageException(error, "Invalid argument."); @@ -45,9 +47,6 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.CannotDisableExecution: throw new JsUsageException(error, "Cannot disable execution."); - case JsErrorCode.AlreadyDebuggingContext: - throw new JsUsageException(error, "Context is already in debug mode."); - case JsErrorCode.HeapEnumInProgress: throw new JsUsageException(error, "Heap enumeration is in progress."); @@ -63,15 +62,26 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.CannotSerializeDebugScript: throw new JsUsageException(error, "Cannot serialize a debug script."); + case JsErrorCode.AlreadyDebuggingContext: + throw new JsUsageException(error, "Context is already in debug mode."); + case JsErrorCode.AlreadyProfilingContext: throw new JsUsageException(error, "Already profiling this context."); case JsErrorCode.IdleNotEnabled: throw new JsUsageException(error, "Idle is not enabled."); + #endregion + + #region Engine + case JsErrorCode.OutOfMemory: throw new JsEngineException(error, "Out of memory."); + #endregion + + #region Script + case JsErrorCode.ScriptException: { EdgeJsValue errorObject; @@ -104,9 +114,15 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.ScriptEvalDisabled: throw new EdgeJsScriptException(error, EdgeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + #endregion + + #region Fatal + case JsErrorCode.Fatal: throw new JsFatalException(error); + #endregion + default: throw new JsFatalException(error); } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index aacbc1a..47e6012 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -568,6 +568,27 @@ public double ToDouble() return value; } + /// + /// Retrieves a int value of a Number value + /// + /// + /// + /// This function retrieves the value of a Number value. It will fail with + /// InvalidArgument if the type of the value is not Number. + /// + /// + /// Requires an active script context. + /// + /// + /// The int value + public int ToInt32() + { + int value; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsNumberToInt(this, out value)); + + return value; + } + /// /// Retrieves a string pointer of a String value /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 463f6da..1a5f3dd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -10,8 +10,46 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// internal static class EdgeNativeMethods { + #region Hosting + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, + string sourceUrl, out EdgeJsValue result); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, + string sourceUrl, out EdgeJsValue result); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, + JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, + JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, + out EdgeJsValue stringValue); + + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, + out UIntPtr stringLength); + + #endregion + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); + internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, + JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); @@ -29,10 +67,12 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); + internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, + IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); + internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, + IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); @@ -64,27 +104,6 @@ internal static class EdgeNativeMethods [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); @@ -119,26 +138,25 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); + internal static extern JsErrorCode JsNumberToInt(EdgeJsValue value, out int intValue); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); + internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); + internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); #if !NETSTANDARD1_3 [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); + internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, + out EdgeJsValue value); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); + internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, + [MarshalAs(UnmanagedType.Struct)] out object var); #endif [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] @@ -148,7 +166,8 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); + internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, + JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); @@ -166,34 +185,42 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); + internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, + out EdgeJsValue value); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); + internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, + out EdgeJsValue propertyDescriptor); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); + internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, + EdgeJsValue value, bool useStrictRules); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); + internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, + out bool hasProperty); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); + internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, + bool useStrictRules, out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); + internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, + EdgeJsValue propertyDescriptor, out bool result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); + internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, + out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); + internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, + EdgeJsValue value); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); @@ -217,13 +244,16 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); + internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, + ushort argumentCount, out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); + internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, + ushort argumentCount, out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); + internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, + IntPtr externalData, out EdgeJsValue function); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); @@ -262,7 +292,8 @@ internal static class EdgeNativeMethods internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); + internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, + ProfilerEventMask eventMask, int context); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStopProfiling(int reason); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs index 0faa906..d221437 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs @@ -15,6 +15,8 @@ public static void ThrowIfError(JsErrorCode error) { switch (error) { + #region Usage + case JsErrorCode.InvalidArgument: throw new JsUsageException(error, "Invalid argument."); @@ -45,9 +47,6 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.CannotDisableExecution: throw new JsUsageException(error, "Cannot disable execution."); - case JsErrorCode.AlreadyDebuggingContext: - throw new JsUsageException(error, "Context is already in debug mode."); - case JsErrorCode.HeapEnumInProgress: throw new JsUsageException(error, "Heap enumeration is in progress."); @@ -63,15 +62,26 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.CannotSerializeDebugScript: throw new JsUsageException(error, "Cannot serialize a debug script."); + case JsErrorCode.AlreadyDebuggingContext: + throw new JsUsageException(error, "Context is already in debug mode."); + case JsErrorCode.AlreadyProfilingContext: throw new JsUsageException(error, "Already profiling this context."); case JsErrorCode.IdleNotEnabled: throw new JsUsageException(error, "Idle is not enabled."); + #endregion + + #region Engine + case JsErrorCode.OutOfMemory: throw new JsEngineException(error, "Out of memory."); + #endregion + + #region Script + case JsErrorCode.ScriptException: { IeJsValue errorObject; @@ -104,9 +114,15 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.ScriptEvalDisabled: throw new IeJsScriptException(error, IeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + #endregion + + #region Fatal + case JsErrorCode.Fatal: throw new JsFatalException(error); + #endregion + default: throw new JsFatalException(error); } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 4eef484..8242609 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -10,8 +10,46 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// internal static class IeNativeMethods { + #region Hosting + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, + string sourceUrl, out IeJsValue result); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, + string sourceUrl, out IeJsValue result); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, + JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, + JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, + out IeJsValue stringValue); + + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, + out UIntPtr stringLength); + + #endregion + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); + internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, + JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); @@ -29,10 +67,12 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); + internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, + IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); + internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, + IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); @@ -47,10 +87,12 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); + internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, + out IeJsContext newContext); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); + internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, + out IeJsContext newContext); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); @@ -70,27 +112,6 @@ internal static class IeNativeMethods [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); @@ -130,21 +151,17 @@ internal static class IeNativeMethods [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); #if !NETSTANDARD1_3 [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); + internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, + out IeJsValue value); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); + internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, + [MarshalAs(UnmanagedType.Struct)] out object var); #endif [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] @@ -154,7 +171,8 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); + internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, + JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); @@ -172,31 +190,38 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); + internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, + out IeJsValue value); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); + internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, + out IeJsValue propertyDescriptor); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); + internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, + bool useStrictRules); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); + internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, + out bool hasProperty); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); + internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, + bool useStrictRules, out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); + internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, + IeJsValue propertyDescriptor, out bool result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); + internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, + out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); @@ -223,13 +248,16 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); + internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, + ushort argumentCount, out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); + internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, + ushort argumentCount, out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); + internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, + IntPtr externalData, out IeJsValue function); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); @@ -268,7 +296,8 @@ internal static class IeNativeMethods internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context); + internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, + ProfilerEventMask eventMask, int context); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStopProfiling(int reason); diff --git a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs index 3c53b8e..3c857c2 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs @@ -12,6 +12,8 @@ internal enum JsErrorCode : uint /// NoError = 0, + #region Usage + /// /// Category of errors that relates to incorrect usage of the API itself /// @@ -109,6 +111,10 @@ internal enum JsErrorCode : uint /// IdleNotEnabled, + #endregion + + #region Engine + /// /// Category of errors that relates to errors occurring within the engine itself /// @@ -119,6 +125,10 @@ internal enum JsErrorCode : uint /// OutOfMemory, + #endregion + + #region Script + /// /// Category of errors that relates to errors in a script /// @@ -145,6 +155,10 @@ internal enum JsErrorCode : uint [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] ScriptEvalDisabled, + #endregion + + #region Fatal + /// /// Category of errors that are fatal and signify failure of the engine /// @@ -154,5 +168,7 @@ internal enum JsErrorCode : uint /// A fatal error in the engine has occurred /// Fatal + + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs index cbedbf1..de0b008 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs @@ -41,6 +41,6 @@ internal enum JsRuntimeAttributes /// Using Eval or Function constructor will throw an exception /// [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] - DisableEval = 0x00000010, + DisableEval = 0x00000010 } } \ No newline at end of file From 2c89bff6041ee89adb2fec5af9b7bb38f916c81f Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 10 Feb 2017 17:32:35 +0300 Subject: [PATCH 064/238] Version 2.1.1 --- LICENSE.md | 2 +- NuGet/MsieJavaScriptEngine.nuspec | 10 +++------- NuGet/readme.txt | 13 ++++--------- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 8 +++----- src/MsieJavaScriptEngine/project.json | 2 +- .../Properties/AssemblyInfo.cs | 6 +++--- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 6 +++--- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 6 +++--- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 6 +++--- .../project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 6 +++--- test/MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 6 +++--- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 17 files changed, 42 insertions(+), 53 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index 6cfac88..f53d932 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ -Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru +Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru Microsoft Public License (Ms-PL) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 6e8457c..2bc72b2 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.1.0 + 2.1.1 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn @@ -12,12 +12,8 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - 1. Added support of .NET Core 1.0.3; -2. Downgraded .NET Framework version from 4.5.1 to 4.5; -3. Now when you call the overloaded version of the `ExecuteResource` method, that takes the type, need to pass the resource name without the namespace; -4. Fixed a error “Out of stack space”; -5. JSON2 library was updated to version of October 28, 2016. - Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru + Was made refactoring. + Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index fcf1c9d..9a94cb1 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,11 +1,11 @@ - + -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.1.0 + README file for MSIE JavaScript Engine for .NET v2.1.1 -------------------------------------------------------------------------------- - Copyright (c) 2012-2016 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru =========== @@ -21,12 +21,7 @@ ============= RELEASE NOTES ============= - 1. Added support of .NET Core 1.0.3; - 2. Downgraded .NET Framework version from 4.5.1 to 4.5; - 3. Now when you call the overloaded version of the `ExecuteResource` method, - that takes the type, need to pass the resource name without the namespace; - 4. Fixed a error “Out of stack space”; - 5. JSON2 library was updated to version of October 28, 2016. + Was made refactoring. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 5e38754..6bb5608 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -6,14 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] - -[module: DefaultCharSet(CharSet.Unicode)] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index 36ffa24..aff92fb 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 9da6fee..65c9c5a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Auto Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index d7c04ae..ab2379c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.0" + "MsieJavaScriptEngine.Test.Common": "2.1.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index b2a49b9..9a4d1b0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index a2bb52f..403febe 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.0" + "MsieJavaScriptEngine.Test.Common": "2.1.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index 349d344..55ef51e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index d7c04ae..ab2379c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.0" + "MsieJavaScriptEngine.Test.Common": "2.1.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index aeba34e..1d29382 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index d7c04ae..ab2379c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.0" + "MsieJavaScriptEngine.Test.Common": "2.1.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index 6624399..853f5d4 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Classic Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index a2bb52f..403febe 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.0" + "MsieJavaScriptEngine.Test.Common": "2.1.1" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index c616f12..85c5a10 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -6,12 +6,12 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("MSIE JavaScript Engine: Common Tests")] -[assembly: AssemblyCopyright("Copyright © 2012-2016 Andrey Taritsyn")] +[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("2.1.0.0")] -[assembly: AssemblyFileVersion("2.1.0.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.1.0")] +[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index d372a8f..3bffb5a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.1.0", + "version": "2.1.1", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.1.0" + "MsieJavaScriptEngine": "2.1.1" }, "buildOptions": { From 69c1c6ab87fa5c8c04cdad2305796293e15b0186 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 10 Feb 2017 17:56:03 +0300 Subject: [PATCH 065/238] CHANGELOG.md: Added information about version 2.1.1 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 262cd6a..d993ffe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## February 10, 2017 - v2.1.1 + * Was made refactoring + ## December 19, 2016 - v2.1.0 * Added support of .NET Core 1.0.3 * Downgraded .NET Framework version from 4.5.1 to 4.5 From c6b56d9a5cd8db1a836c3af8a39b880b52286a4d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 12 Feb 2017 14:43:06 +0300 Subject: [PATCH 066/238] Fixed a error causing a crash during finalization --- NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 2 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 19 ------------------- 3 files changed, 2 insertions(+), 21 deletions(-) diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 2bc72b2..02af78c 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Was made refactoring. + Fixed a error causing a crash during finalization. Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 9a94cb1..36a518c 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Was made refactoring. + Fixed a error causing a crash during finalization. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index a1abaef..45bb16a 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -67,14 +67,6 @@ public ScriptDispatcher() _thread.Start(); } - /// - /// Destructs an instance of script dispatcher - /// - ~ScriptDispatcher() - { - Dispose(false); - } - private void VerifyNotDisposed() { @@ -212,17 +204,6 @@ public void Invoke(Action action) /// Destroys object /// public void Dispose() - { - Dispose(true /* disposing */); - GC.SuppressFinalize(this); - } - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) { if (_disposedFlag.Set()) { From 6513b4701de78e7f8e94a4c79f2ef26bae640175 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 12 Feb 2017 16:25:59 +0300 Subject: [PATCH 067/238] Version 2.1.2 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 2 +- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 4 ++-- src/MsieJavaScriptEngine/project.json | 2 +- .../MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Auto/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- .../MsieJavaScriptEngine.Test.ChakraActiveScript/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Classic/project.json | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- test/MsieJavaScriptEngine.Test.Common/project.json | 4 ++-- 17 files changed, 32 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d993ffe..2c6e9ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## February 12, 2017 - v2.1.2 + * Fixed a error causing a crash during finalization + ## February 10, 2017 - v2.1.1 * Was made refactoring diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 02af78c..8c5c035 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 2.1.1 + 2.1.2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 36a518c..85fccdd 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v2.1.1 + README file for MSIE JavaScript Engine for .NET v2.1.2 -------------------------------------------------------------------------------- diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs index 6bb5608..c24a240 100644 --- a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ae6911c9-e2a9-4386-ab90-3722a9166564")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/project.json b/src/MsieJavaScriptEngine/project.json index aff92fb..084e943 100644 --- a/src/MsieJavaScriptEngine/project.json +++ b/src/MsieJavaScriptEngine/project.json @@ -1,5 +1,5 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": {}, diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs index 65c9c5a..ff8febe 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/project.json b/test/MsieJavaScriptEngine.Test.Auto/project.json index ab2379c..14996f2 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/project.json +++ b/test/MsieJavaScriptEngine.Test.Auto/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.1" + "MsieJavaScriptEngine.Test.Common": "2.1.2" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs index 9a4d1b0..46ea36d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json index 403febe..f020c36 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.1" + "MsieJavaScriptEngine.Test.Common": "2.1.2" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs index 55ef51e..08e4b60 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json index ab2379c..14996f2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.1" + "MsieJavaScriptEngine.Test.Common": "2.1.2" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs index 1d29382..46395fd 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json index ab2379c..14996f2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.1" + "MsieJavaScriptEngine.Test.Common": "2.1.2" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs index 853f5d4..f36e7aa 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/project.json b/test/MsieJavaScriptEngine.Test.Classic/project.json index 403febe..f020c36 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/project.json +++ b/test/MsieJavaScriptEngine.Test.Classic/project.json @@ -1,8 +1,8 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { - "MsieJavaScriptEngine.Test.Common": "2.1.1" + "MsieJavaScriptEngine.Test.Common": "2.1.2" }, "buildOptions": { diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs index 85c5a10..75d8739 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs @@ -13,5 +13,5 @@ [assembly: ComVisible(false)] [assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -[assembly: AssemblyVersion("2.1.1.0")] -[assembly: AssemblyFileVersion("2.1.1.0")] \ No newline at end of file +[assembly: AssemblyVersion("2.1.2.0")] +[assembly: AssemblyFileVersion("2.1.2.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/project.json b/test/MsieJavaScriptEngine.Test.Common/project.json index 3bffb5a..37a265f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/project.json +++ b/test/MsieJavaScriptEngine.Test.Common/project.json @@ -1,11 +1,11 @@ { - "version": "2.1.1", + "version": "2.1.2", "dependencies": { "dotnet-test-nunit": "3.4.0-beta-3", "Microsoft.Extensions.PlatformAbstractions": "1.0.0", "NUnit": "3.4.1", - "MsieJavaScriptEngine": "2.1.1" + "MsieJavaScriptEngine": "2.1.2" }, "buildOptions": { From b884dc1796cf60d73e8160cbef741a53822d5874 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 14 Mar 2017 13:49:47 +0300 Subject: [PATCH 068/238] Added support of KoreBuild 1.1.2 --- _generate-resx.shade | 5 +---- build.cmd | 2 -- build.ps1 | 2 +- build.sh | 22 ++++++++++------------ 4 files changed, 12 insertions(+), 19 deletions(-) diff --git a/_generate-resx.shade b/_generate-resx.shade index 187e837..6bea240 100644 --- a/_generate-resx.shade +++ b/_generate-resx.shade @@ -276,7 +276,6 @@ functions @{ private static string GetProjectDirectoryName(string resourceDirPath) { - const string projectFileName = "project.json"; string rootPath = RemoveLastSlash(Path.GetPathRoot(resourceDirPath)); string projectDirPath = RemoveLastSlash(resourceDirPath); @@ -287,9 +286,7 @@ functions @{ throw new FileNotFoundException("Project file not exist."); } - string projectFilePath = Path.Combine(projectDirPath, projectFileName); - if (File.Exists(projectFilePath) - || Directory.EnumerateFiles(projectDirPath, "*.csproj", SearchOption.TopDirectoryOnly).Any()) + if (Directory.EnumerateFiles(projectDirPath, "*.csproj", SearchOption.TopDirectoryOnly).Any()) { break; } diff --git a/build.cmd b/build.cmd index b8213c1..6bdab91 100644 --- a/build.cmd +++ b/build.cmd @@ -2,8 +2,6 @@ setlocal set ORIGINAL_CURRENT_DIR=%cd% -set KOREBUILD_DOTNET_CHANNEL=preview -set KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003156 cd %~dp0 diff --git a/build.ps1 b/build.ps1 index 6d49c4d..88367c7 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.2.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index e916a5a..73233f5 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,5 @@ #!/usr/bin/env bash ORIGINAL_CURRENT_DIR=%cd% -KOREBUILD_DOTNET_CHANNEL=preview -KOREBUILD_DOTNET_VERSION=1.0.0-preview2-003156 repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder @@ -13,7 +11,7 @@ if test ! -d $packageDir/NUnit.Runners; then mono $localNugetPackageManager install NUnit.Runners -Version 3.4.1 -O $packageDir% -ExcludeVersion -NoCache fi -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/1.0.0.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.2.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi @@ -23,12 +21,12 @@ buildFile="$buildFolder/KoreBuild.sh" if test ! -d $buildFolder; then echo "Downloading KoreBuild from $koreBuildZip" - - tempFolder="/tmp/KoreBuild-$(uuidgen)" + + tempFolder="/tmp/KoreBuild-$(uuidgen)" mkdir $tempFolder - + localZipFile="$tempFolder/korebuild.zip" - + retries=6 until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) do @@ -40,17 +38,17 @@ if test ! -d $buildFolder; then echo "Waiting 10 seconds before retrying. Retries left: $retries" sleep 10s done - + unzip -q -d $tempFolder $localZipFile - + mkdir $buildFolder cp -r $tempFolder/**/build/** $buildFolder - + chmod +x $buildFile - + # Cleanup if test ! -d $tempFolder; then - rm -rf $tempFolder + rm -rf $tempFolder fi fi From 4bfb386596b887bcff359486c5dd0f5fc66c276a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 16 Mar 2017 21:16:14 +0300 Subject: [PATCH 069/238] project.json -> .csproj --- MsieJavaScriptEngine.DotNet.sln | 33 ++++----- NuGet/MsieJavaScriptEngine.nuspec | 17 +---- NuGet/readme.txt | 2 +- build.cmd | 2 + build.ps1 | 2 +- build.sh | 4 +- global.json | 6 -- makefile.shade | 68 ++++++++++------- .../MsieJavaScriptEngine.Net40.csproj | 6 +- src/MsieJavaScriptEngine.Net4/packages.config | 2 +- .../MsieJavaScriptEngine.csproj | 47 ++++++++++++ .../MsieJavaScriptEngine.xproj | 19 ----- .../Properties/AssemblyInfo.cs | 4 + .../Utilities/TypeInfoExtensions.cs | 6 +- src/MsieJavaScriptEngine/project.json | 73 ------------------- .../MsieJavaScriptEngine.Test.Auto.csproj | 30 ++++++++ .../MsieJavaScriptEngine.Test.Auto.xproj | 19 ----- .../MsieJavaScriptEngine.Test.Auto/Program.cs | 16 ++++ .../Properties/AssemblyInfo.cs | 4 + .../project.json | 28 ------- ...criptEngine.Test.ChakraActiveScript.csproj | 26 +++++++ ...ScriptEngine.Test.ChakraActiveScript.xproj | 19 ----- .../Program.cs | 16 ++++ .../project.json | 19 ----- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 30 ++++++++ ...JavaScriptEngine.Test.ChakraEdgeJsRt.xproj | 19 ----- .../Program.cs | 16 ++++ .../Properties/AssemblyInfo.cs | 4 + .../project.json | 28 ------- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 30 ++++++++ ...ieJavaScriptEngine.Test.ChakraIeJsRt.xproj | 19 ----- .../Program.cs | 16 ++++ .../Properties/AssemblyInfo.cs | 4 + .../project.json | 28 ------- .../MsieJavaScriptEngine.Test.Classic.csproj | 26 +++++++ .../MsieJavaScriptEngine.Test.Classic.xproj | 19 ----- .../Program.cs | 16 ++++ .../project.json | 19 ----- .../FileSystemTestsBase.cs | 10 +-- .../MsieJavaScriptEngine.Test.Common.csproj | 41 +++++++++++ .../MsieJavaScriptEngine.Test.Common.xproj | 19 ----- .../Program.cs | 16 ++++ .../Properties/AssemblyInfo.cs | 4 + .../project.json | 43 ----------- 44 files changed, 423 insertions(+), 452 deletions(-) delete mode 100644 global.json create mode 100644 src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj delete mode 100644 src/MsieJavaScriptEngine/MsieJavaScriptEngine.xproj delete mode 100644 src/MsieJavaScriptEngine/project.json create mode 100644 test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.xproj create mode 100644 test/MsieJavaScriptEngine.Test.Auto/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Auto/project.json create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.xproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/project.json create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/project.json create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/project.json create mode 100644 test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.xproj create mode 100644 test/MsieJavaScriptEngine.Test.Classic/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Classic/project.json create mode 100644 test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.xproj create mode 100644 test/MsieJavaScriptEngine.Test.Common/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/project.json diff --git a/MsieJavaScriptEngine.DotNet.sln b/MsieJavaScriptEngine.DotNet.sln index aa0447f..1715d38 100644 --- a/MsieJavaScriptEngine.DotNet.sln +++ b/MsieJavaScriptEngine.DotNet.sln @@ -1,12 +1,9 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.4 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4BC3AE92-2685-4223-AA35-097A54C5FBEA}" - ProjectSection(SolutionItems) = preProject - global.json = global.json - EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{262F5A48-E8AC-41F1-9FC6-4DA3785CCD93}" EndProject @@ -18,19 +15,19 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles" test\SharedFiles\square.js = test\SharedFiles\square.js EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.xproj", "{3C9CD486-50AD-476E-9515-3F85EBAFCC38}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{3C9CD486-50AD-476E-9515-3F85EBAFCC38}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.xproj", "{6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.xproj", "{3DD423C5-DC32-42D4-9924-B5D8C2F23195}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.csproj", "{3DD423C5-DC32-42D4-9924-B5D8C2F23195}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.xproj", "{56218CBF-F251-4A3A-A50F-7C3FCC9258F6}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj", "{56218CBF-F251-4A3A-A50F-7C3FCC9258F6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt\MsieJavaScriptEngine.Test.ChakraIeJsRt.xproj", "{5864D57D-2EB8-4684-9908-26111127E75B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt\MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj", "{5864D57D-2EB8-4684-9908-26111127E75B}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.ChakraActiveScript", "test\MsieJavaScriptEngine.Test.ChakraActiveScript\MsieJavaScriptEngine.Test.ChakraActiveScript.xproj", "{EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraActiveScript", "test\MsieJavaScriptEngine.Test.ChakraActiveScript\MsieJavaScriptEngine.Test.ChakraActiveScript.csproj", "{EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.xproj", "{72233C70-DF61-449F-8D53-D456284CDA5D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{72233C70-DF61-449F-8D53-D456284CDA5D}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -50,10 +47,6 @@ Global {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Debug|Any CPU.Build.0 = Debug|Any CPU {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Release|Any CPU.Build.0 = Release|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.Build.0 = Release|Any CPU {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Debug|Any CPU.Build.0 = Debug|Any CPU {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -62,6 +55,10 @@ Global {5864D57D-2EB8-4684-9908-26111127E75B}.Debug|Any CPU.Build.0 = Debug|Any CPU {5864D57D-2EB8-4684-9908-26111127E75B}.Release|Any CPU.ActiveCfg = Release|Any CPU {5864D57D-2EB8-4684-9908-26111127E75B}.Release|Any CPU.Build.0 = Release|Any CPU + {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.Build.0 = Release|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -71,13 +68,13 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {3C9CD486-50AD-476E-9515-3F85EBAFCC38} = {262F5A48-E8AC-41F1-9FC6-4DA3785CCD93} {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {3DD423C5-DC32-42D4-9924-B5D8C2F23195} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {56218CBF-F251-4A3A-A50F-7C3FCC9258F6} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {5864D57D-2EB8-4684-9908-26111127E75B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} + {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {72233C70-DF61-449F-8D53-D456284CDA5D} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} EndGlobalSection EndGlobal diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 8c5c035..471a45b 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Fixed a error causing a crash during finalization. + Added support of .NET Core 1.0.4. Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra @@ -20,22 +20,9 @@ - + - - - - - - - - - - - - - diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 85fccdd..f49c009 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error causing a crash during finalization. + Added support of .NET Core 1.0.4. ============ PROJECT SITE diff --git a/build.cmd b/build.cmd index 6bdab91..519b2e7 100644 --- a/build.cmd +++ b/build.cmd @@ -2,6 +2,8 @@ setlocal set ORIGINAL_CURRENT_DIR=%cd% +set KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 +set KOREBUILD_DOTNET_VERSION=1.0.1 cd %~dp0 diff --git a/build.ps1 b/build.ps1 index 88367c7..756a66a 100644 --- a/build.ps1 +++ b/build.ps1 @@ -33,7 +33,7 @@ cd $PSScriptRoot $repoFolder = $PSScriptRoot $env:REPO_FOLDER = $repoFolder -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.2.zip" +$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/02bd945d32558d24c1e5c6b74e37d44585ad9691.zip" if ($env:KOREBUILD_ZIP) { $koreBuildZip=$env:KOREBUILD_ZIP diff --git a/build.sh b/build.sh index 73233f5..cef18ef 100644 --- a/build.sh +++ b/build.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash ORIGINAL_CURRENT_DIR=%cd% +KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 +KOREBUILD_DOTNET_VERSION=1.0.1 repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder @@ -11,7 +13,7 @@ if test ! -d $packageDir/NUnit.Runners; then mono $localNugetPackageManager install NUnit.Runners -Version 3.4.1 -O $packageDir% -ExcludeVersion -NoCache fi -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/rel/1.1.2.zip" +koreBuildZip="https://github.com/aspnet/KoreBuild/archive/02bd945d32558d24c1e5c6b74e37d44585ad9691.zip" if [ ! -z $KOREBUILD_ZIP ]; then koreBuildZip=$KOREBUILD_ZIP fi diff --git a/global.json b/global.json deleted file mode 100644 index 30a0fdd..0000000 --- a/global.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "projects": [ "src", "test" ], - "sdk": { - "version": "1.0.0-preview2-003156" - } -} \ No newline at end of file diff --git a/makefile.shade b/makefile.shade index 891f0b4..9f7fc1a 100644 --- a/makefile.shade +++ b/makefile.shade @@ -6,13 +6,13 @@ use import="Files" use import="BuildEnv" use import="Environment" -default BASE_DIR='${Directory.GetCurrentDirectory()}' +default BASE_DIR="${Directory.GetCurrentDirectory()}" -var AUTHORS='Andrey Taritsyn' +var AUTHORS="Andrey Taritsyn" use-standard-lifecycle -#resx description='Converts .resx files to .Designer.cs' target='initialize' +#resx description="Converts .resx files to .Designer.cs" target="initialize" @{ string currentDirPath; string originalCurrentDirPath = Environment.GetEnvironmentVariable("ORIGINAL_CURRENT_DIR"); @@ -41,48 +41,66 @@ use-standard-lifecycle Log.Info(string.Format(' * "{0}" is processed', relativeFilePath)); } - Log.Info(''); + Log.Info(""); } -#run-dotnet-tests description='Runs a unit tests for DotNet version' +#run-dotnet-tests description="Runs a unit tests for DotNet version" @{ string testDirPath = Path.Combine(BASE_DIR, "test"); - string[] testProjectDirPaths = { - 'MsieJavaScriptEngine.Test.Common', - 'MsieJavaScriptEngine.Test.Auto', - 'MsieJavaScriptEngine.Test.ChakraEdgeJsRt', - 'MsieJavaScriptEngine.Test.ChakraIeJsRt', - 'MsieJavaScriptEngine.Test.ChakraActiveScript', - 'MsieJavaScriptEngine.Test.Classic' + string[] testProjectNames = { + "MsieJavaScriptEngine.Test.Common", + "MsieJavaScriptEngine.Test.Auto", + "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", + "MsieJavaScriptEngine.Test.ChakraIeJsRt", + "MsieJavaScriptEngine.Test.ChakraActiveScript", + "MsieJavaScriptEngine.Test.Classic" }; - Log.Info('Run unit tests for DotNet version:'); - Log.Info(''); + Log.Info("Run unit tests for DotNet version:"); + Log.Info(""); - foreach (string testProjectDirPath in testProjectDirPaths) + foreach (string testProjectName in testProjectNames) { - Exec('dotnet', string.Format('test {0}', testProjectDirPath), testDirPath); + Log.Info(string.Format('Tests for "{0}" project:', testProjectName)); + Log.Info(""); + + string testProjectDirPath = Path.Combine(testDirPath, testProjectName); + string testAssemblyDirPath; + string testAssemblyFilePath; + + testAssemblyDirPath = Path.Combine(testProjectDirPath, "bin/Release/net451"); + testAssemblyFilePath = Path.Combine(testAssemblyDirPath, testProjectName + ".exe"); + Exec(testAssemblyFilePath, "", testProjectDirPath); + + testAssemblyDirPath = Path.Combine(testProjectDirPath, "bin/Release/netcoreapp1.0"); + if (Directory.Exists(testAssemblyDirPath)) + { + testAssemblyFilePath = Path.Combine(testAssemblyDirPath, testProjectName + ".dll"); + Exec("dotnet", testAssemblyFilePath, testProjectDirPath); + } + + Log.Info(""); } - Log.Info(''); + Log.Info(""); } -#run-net4-tests description='Runs a unit tests for .NET 4.0 version' +#run-net4-tests description="Runs a unit tests for .NET 4.0 version" @{ string nunitConsolePath = "packages/NUnit.ConsoleRunner/tools/nunit3-console.exe"; string testDirPath = Path.Combine(BASE_DIR, "test"); - Log.Info('Run unit tests for .NET 4.0 version:'); - Log.Info(''); - Exec(nunitConsolePath, 'MsieJavaScriptEngine.Test.Net4.nunit --verbose', testDirPath); - Log.Info(''); + Log.Info("Run unit tests for .NET 4.0 version:"); + Log.Info(""); + Exec(nunitConsolePath, "MsieJavaScriptEngine.Test.Net4.nunit --verbose", testDirPath); + Log.Info(""); } -macro name="GenerateResx" resxFile='string' +macro name="GenerateResx" resxFile="string" generate-resx -macro name='Exec' program='string' commandline='string' +macro name="Exec" program="string" commandline="string" exec -macro name='Exec' program='string' commandline='string' workingdir='string' +macro name="Exec" program="string" commandline="string" workingdir="string" exec \ No newline at end of file diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj index d41d102..6904c41 100644 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -14,7 +14,7 @@ Client ..\..\ true - 673c479a + 3c63c2a2 AnyCPU @@ -423,9 +423,9 @@ build resx This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + - + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine.Net4/packages.config b/src/MsieJavaScriptEngine.Net4/packages.config index ffdc074..89c5ad7 100644 --- a/src/MsieJavaScriptEngine.Net4/packages.config +++ b/src/MsieJavaScriptEngine.Net4/packages.config @@ -1,4 +1,5 @@  + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index e02c646..1a9e622 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -38,11 +38,19 @@ + - + - + + true + + + + + + true + - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 6f61541..38fb6db 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -21,12 +21,10 @@ public class CommonStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.CommonStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 - typeof(CommonStrings).GetTypeInfo().Assembly -#elif NET40 +#if NET40 typeof(CommonStrings).Assembly #else -#error No implementation for this target + typeof(CommonStrings).GetTypeInfo().Assembly #endif )); diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index a2d7c3f..f146cb9 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -21,12 +21,10 @@ public class NetCoreStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetCoreStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 - typeof(NetCoreStrings).GetTypeInfo().Assembly -#elif NET40 +#if NET40 typeof(NetCoreStrings).Assembly #else -#error No implementation for this target + typeof(NetCoreStrings).GetTypeInfo().Assembly #endif )); diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index 90cd0dc..85ae48e 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -21,12 +21,10 @@ public class NetFrameworkStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetFrameworkStrings", -#if NETSTANDARD1_0 || NETSTANDARD1_1 || NETSTANDARD1_2 || NETSTANDARD1_3 || NETSTANDARD1_4 || NETSTANDARD1_5 || NETSTANDARD1_6 || NETCOREAPP1_0 || NET45 || NET451 || NET452 || NET46 || NET461 || NET462 || NET463 - typeof(NetFrameworkStrings).GetTypeInfo().Assembly -#elif NET40 +#if NET40 typeof(NetFrameworkStrings).Assembly #else -#error No implementation for this target + typeof(NetFrameworkStrings).GetTypeInfo().Assembly #endif )); From a89295c70d826fb41e321ec9b6ce828d82ca80f5 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 17 Nov 2017 16:19:28 +0300 Subject: [PATCH 102/238] Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object --- NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 3 +- .../Helpers/ReflectionHelpers.cs | 104 +++++++++++------- ...eJavaScriptEngine.Test.Common.Net40.csproj | 12 ++ .../Interop/Animals/AnimalTrainer.cs | 10 ++ .../Interop/Animals/Cat.cs | 10 ++ .../Interop/Animals/Dog.cs | 10 ++ .../Interop/Animals/IAnimal.cs | 7 ++ .../Interop/Date.cs | 10 +- .../InteropTestsBase.cs | 70 ++++++++++-- 10 files changed, 184 insertions(+), 54 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Animals/AnimalTrainer.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Cat.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Dog.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Animals/IAnimal.cs diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index e359114..88fc939 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -12,7 +12,7 @@ false This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Added a ability to interrupt execution of the script. + Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object. Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru en-US JavaScript ECMAScript MSIE IE Edge Chakra diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 1708f23..34a5eec 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - Added a ability to interrupt execution of the script. + Fixed a error, that occurred during finding the suitable method overload, that + receives numeric values and interfaces as parameters, of the host object. ============ PROJECT SITE diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 33da84d..b254e74 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,5 +1,6 @@ #if NETSTANDARD1_3 using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -85,9 +86,8 @@ public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] para public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValues) { - int argCount = argValues.Length; - var methodCandidates = methods - .Select(m => new + MethodWithMetadata[] methodCandidates = methods + .Select(m => new MethodWithMetadata { Method = m, ParameterTypes = m.GetParameters() @@ -96,12 +96,14 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu }) .ToArray() ; - - var methodsWithSameArity = methodCandidates + int argCount = argValues.Length; + MethodWithMetadata[] sameArityMethods = methodCandidates .Where(m => m.ParameterTypes.Length == argCount) .ToArray() ; - if (methodsWithSameArity.Length == 0) + + int sameArityMethodCount = sameArityMethods.Length; + if (sameArityMethodCount == 0) { return null; } @@ -110,40 +112,46 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu .Select(a => a.GetType()) .ToArray() ; - var weaklyCompatibleMethods = methodsWithSameArity - .Where(m => CompareParameterTypes(argValues, argTypes, m.ParameterTypes, false)) - .ToArray() - ; + var compatibleMethods = new List(); - int weaklyCompatibleMethodCount = weaklyCompatibleMethods.Length; - if (weaklyCompatibleMethodCount > 0) + for (int methodIndex = 0; methodIndex < sameArityMethodCount; methodIndex++) { - if (weaklyCompatibleMethodCount == 1) + MethodWithMetadata method = sameArityMethods[methodIndex]; + ushort compatibilityScore; + + if (CompareParameterTypes(argValues, argTypes, method.ParameterTypes, out compatibilityScore)) { - return weaklyCompatibleMethods[0].Method; + method.CompatibilityScore = compatibilityScore; + compatibleMethods.Add(method); } + } - var strictlyCompatibleMethods = weaklyCompatibleMethods - .Where(m => CompareParameterTypes(argValues, argTypes, m.ParameterTypes, true)) - .ToArray() - ; - if (strictlyCompatibleMethods.Length > 0) + int compatibleMethodCount = compatibleMethods.Count; + if (compatibleMethodCount > 0) + { + if (compatibleMethodCount == 1) { - return strictlyCompatibleMethods[0].Method; + return compatibleMethods[0].Method; } - return weaklyCompatibleMethods[0].Method; + MethodWithMetadata bestFitMethod = compatibleMethods + .OrderByDescending(m => m.CompatibilityScore) + .First() + ; + + return bestFitMethod.Method; } return null; } private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, Type[] parameterTypes, - bool strictСompliance) + out ushort compatibilityScore) { int argValueCount = argValues.Length; int argTypeCount = argTypes.Length; int parameterCount = parameterTypes.Length; + compatibilityScore = 0; if (argValueCount != argTypeCount || argTypeCount != parameterCount) { @@ -156,32 +164,50 @@ private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, T Type argType = argTypes[argIndex]; Type parameterType = parameterTypes[argIndex]; - if (argType != parameterType) + if (argType == parameterType) { - if (!strictСompliance - && NumericHelpers.IsNumericType(argType) && NumericHelpers.IsNumericType(parameterType)) - { - object convertedArgValue; - - if (!TypeConverter.TryConvertToType(argValue, parameterType, out convertedArgValue)) - { - return false; - } - - if (argValue != convertedArgValue) - { - return false; - } + compatibilityScore++; + } + else + { + // TODO: It is necessary to calculate the compatibility score based on length + // of inheritance and interface implementation chains. + object convertedArgValue; - continue; + if (!TypeConverter.TryConvertToType(argValue, parameterType, out convertedArgValue)) + { + return false; } - return false; + continue; } } return true; } + + + private sealed class MethodWithMetadata + { + public MethodBase Method + { + get; + set; + } + + public Type[] ParameterTypes + { + get; + set; + } + + /// TODO: In future will need to change type to double + public ushort CompatibilityScore + { + get; + set; + } + } } } #endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj index 1e9cea5..faf2753 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj @@ -61,6 +61,18 @@ InteropTestsBase.cs + + Animals\AnimalTrainer.cs + + + Animals\Cat.cs + + + Animals\Dog.cs + + + Animals\IAnimal.cs + Interop\Base64Encoder.cs diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/AnimalTrainer.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/AnimalTrainer.cs new file mode 100644 index 0000000..3ff6d23 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/AnimalTrainer.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Animals +{ + public sealed class AnimalTrainer + { + public string ExecuteVoiceCommand(IAnimal animal) + { + return animal.Cry(); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Cat.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Cat.cs new file mode 100644 index 0000000..b7c009a --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Cat.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Animals +{ + public sealed class Cat : IAnimal + { + public string Cry() + { + return "Meow!"; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Dog.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Dog.cs new file mode 100644 index 0000000..dbf82b6 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/Dog.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Animals +{ + public sealed class Dog : IAnimal + { + public string Cry() + { + return "Woof!"; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/IAnimal.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/IAnimal.cs new file mode 100644 index 0000000..ce697b2 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Animals/IAnimal.cs @@ -0,0 +1,7 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Animals +{ + public interface IAnimal + { + string Cry(); + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs index 313dc55..82302fa 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs @@ -16,7 +16,7 @@ public static Date Today get { DateTime currentDateTime = DateTime.Today; - Date currentDate = new Date(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day); + var currentDate = new Date(currentDateTime.Year, currentDateTime.Month, currentDateTime.Day); return currentDate; } @@ -43,5 +43,13 @@ public int GetDayOfYear() (Month > 2 && IsLeapYear(Year) ? 1 : 0) ; } + + public Date AddDays(double value) + { + var dateTime = new DateTime(Year, Month, Day); + DateTime newDateTime = dateTime.AddDays(value); + + return new Date(newDateTime.Year, newDateTime.Month, newDateTime.Day); + } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index b39575f..445376b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -9,6 +9,7 @@ using NUnit.Framework; using MsieJavaScriptEngine.Test.Common.Interop; +using MsieJavaScriptEngine.Test.Common.Interop.Animals; #if NETCOREAPP1_0 using MsieJavaScriptEngine.Test.Common.Interop.Drawing; #endif @@ -305,25 +306,32 @@ public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithMethodIsCorrect } [Test] - public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethodIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethodsIsCorrect() { // Arrange var programmerDayDate = new Date(2015, 9, 13); - const string input = "programmerDay.GetDayOfYear()"; - const int targetOutput = 256; + const string input1 = "programmerDay.GetDayOfYear()"; + const int targetOutput1 = 256; + + const string input2 = @"var smileDay = programmerDay.AddDays(6); +smileDay.GetDayOfYear();"; + const int targetOutput2 = 262; // Act - int output; + int output1; + int output2; using (var jsEngine = CreateJsEngine()) { jsEngine.EmbedHostObject("programmerDay", programmerDayDate); - output = jsEngine.Evaluate(input); + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); } // Assert - Assert.AreEqual(targetOutput, output); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); } [Test] @@ -349,6 +357,38 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect( Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameterIsCorrect() + { + // Arrange + var animalTrainer = new AnimalTrainer(); + var cat = new Cat(); + var dog = new Dog(); + + const string input1 = "animalTrainer.ExecuteVoiceCommand(cat)"; + const string targetOutput1 = "Meow!"; + + const string input2 = "animalTrainer.ExecuteVoiceCommand(dog)"; + const string targetOutput2 = "Woof!"; + + // Act + string output1; + string output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("animalTrainer", animalTrainer); + jsEngine.EmbedHostObject("cat", cat); + jsEngine.EmbedHostObject("dog", dog); + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + } + #endregion #region Delegates @@ -903,25 +943,31 @@ public virtual void EmbeddingOfBuiltinValueTypeWithMethodIsCorrect() } [Test] - public virtual void EmbeddingOfBuiltinReferenceTypeWithMethodIsCorrect() + public virtual void EmbeddingOfBuiltinReferenceTypeWithMethodsIsCorrect() { // Arrange Type mathType = typeof(Math); - const string input = "Math2.Max(5.37, 5.56)"; - const double targetOutput = 5.56; + const string input1 = "Math2.Max(5.37, 5.56)"; + const double targetOutput1 = 5.56; + + const string input2 = "Math2.Log10(23)"; + const double targetOutput2 = 1.36172783601759; // Act - double output; + double output1; + double output2; using (var jsEngine = CreateJsEngine()) { jsEngine.EmbedHostType("Math2", mathType); - output = jsEngine.Evaluate(input); + output1 = jsEngine.Evaluate(input1); + output2 = Math.Round(jsEngine.Evaluate(input2), 14); } // Assert - Assert.AreEqual(targetOutput, output); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); } [Test] From 230a304e5735ae1cd44c954893ffcde8681cf861 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 17 Nov 2017 16:31:51 +0300 Subject: [PATCH 103/238] Version 3.0.0 Alpha 2 --- CHANGELOG.md | 3 +++ NuGet/MsieJavaScriptEngine.nuspec | 2 +- NuGet/readme.txt | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f73ad2..7f3b605 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.0 Alpha 2 - November 17, 2017 + * Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object + ## v3.0.0 Alpha 1 - September 13, 2017 * Added a ability to interrupt execution of the script diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec index 88fc939..aa14928 100644 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ b/NuGet/MsieJavaScriptEngine.nuspec @@ -2,7 +2,7 @@ MsieJavaScriptEngine - 3.0.0-alpha1 + 3.0.0-alpha2 MSIE JavaScript Engine for .NET Andrey Taritsyn Andrey Taritsyn diff --git a/NuGet/readme.txt b/NuGet/readme.txt index 34a5eec..ffcd31a 100644 --- a/NuGet/readme.txt +++ b/NuGet/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Alpha 1 + README file for MSIE JavaScript Engine for .NET v3.0.0 Alpha 2 -------------------------------------------------------------------------------- diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 1a9e622..87604bb 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 netstandard1.3;net45 1.6.0 Library diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 6b0d274..74b9d8c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 netcoreapp1.0;net451 1.0.4 Exe diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index d98cd91..d1f7b8e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 net451 Exe true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 6b0d274..74b9d8c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 netcoreapp1.0;net451 1.0.4 Exe diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 6b0d274..74b9d8c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 netcoreapp1.0;net451 1.0.4 Exe diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d98cd91..d1f7b8e 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 net451 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c4ee741..59272fb 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ 3.0.0 - alpha1 + alpha2 netcoreapp1.0;net451 1.0.4 Exe From 1b2c589733508687ae79ce1ed0fbfa78cd018d4b Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 18 Nov 2017 21:37:59 +0300 Subject: [PATCH 104/238] Added a unit test to verify the correctness of embedding of anonymous type instance --- .../InteropTestsBase.cs | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 445376b..8d4a915 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -244,6 +244,70 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorr Assert.AreEqual(targetOutput2, output2); } + [Test] + public virtual void EmbeddingOfInstanceOfAnonymousTypeWithPropertiesIsCorrect() + { + // Arrange + var person = new + { + FirstName = "John", + LastName = "Doe", + Address = new + { + StreetAddress = "103 Elm Street", + City = "Atlanta", + State = "GA", + PostalCode = 30339 + } + }; + + const string input1 = "person.FirstName"; + const string targetOutput1 = "John"; + + const string input2 = "person.LastName"; + const string targetOutput2 = "Doe"; + + const string input3 = "person.Address.StreetAddress"; + const string targetOutput3 = "103 Elm Street"; + + const string input4 = "person.Address.City"; + const string targetOutput4 = "Atlanta"; + + const string input5 = "person.Address.State"; + const string targetOutput5 = "GA"; + + const string input6 = "person.Address.PostalCode"; + const int targetOutput6 = 30339; + + // Act + string output1; + string output2; + string output3; + string output4; + string output5; + int output6; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("person", person); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); + output4 = jsEngine.Evaluate(input4); + output5 = jsEngine.Evaluate(input5); + output6 = jsEngine.Evaluate(input6); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + Assert.AreEqual(targetOutput4, output4); + Assert.AreEqual(targetOutput5, output5); + Assert.AreEqual(targetOutput6, output6); + } + #endregion #region Objects with methods From af2458e4a419dc92c3e321c7bfe285b368eccda1 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 29 Nov 2017 13:45:58 +0300 Subject: [PATCH 105/238] ResxToCs was updated to version 1.0.0 Alpha 4 --- .../MsieJavaScriptEngine.Net40.csproj | 17 +++-- src/MsieJavaScriptEngine.Net4/packages.config | 2 +- .../MsieJavaScriptEngine.csproj | 9 +-- .../Resources/CommonStrings.Designer.cs | 74 +++++++++---------- .../Resources/NetCoreStrings.Designer.cs | 58 +++++++-------- .../Resources/NetFrameworkStrings.Designer.cs | 28 +++---- 6 files changed, 93 insertions(+), 95 deletions(-) diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj index 675fb78..cea3ecf 100644 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -14,7 +14,8 @@ Client ..\..\ true - 9c0c6282 + 93f7ad1b + true AnyCPU @@ -596,14 +597,14 @@ - + - - - - - true - + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine.Net4/packages.config b/src/MsieJavaScriptEngine.Net4/packages.config index 89c5ad7..f1604bf 100644 --- a/src/MsieJavaScriptEngine.Net4/packages.config +++ b/src/MsieJavaScriptEngine.Net4/packages.config @@ -1,5 +1,5 @@  - + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 87604bb..9c478e8 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -38,7 +38,7 @@ - + @@ -47,10 +47,7 @@ true - - - - true - + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 38fb6db..574da86 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class CommonStrings + internal class CommonStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class CommonStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-empty string." /// - public static string Common_ArgumentIsEmpty + internal static string Common_ArgumentIsEmpty { get { return GetString("Common_ArgumentIsEmpty"); } } @@ -68,7 +68,7 @@ public static string Common_ArgumentIsEmpty /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-nullable." /// - public static string Common_ArgumentIsNull + internal static string Common_ArgumentIsNull { get { return GetString("Common_ArgumentIsNull"); } } @@ -76,7 +76,7 @@ public static string Common_ArgumentIsNull /// /// Looks up a localized string similar to "Cannot convert object of type `{0}` to type `{1}`." /// - public static string Common_CannotConvertObjectToType + internal static string Common_CannotConvertObjectToType { get { return GetString("Common_CannotConvertObjectToType"); } } @@ -84,7 +84,7 @@ public static string Common_CannotConvertObjectToType /// /// Looks up a localized string similar to "File '{0}' not exist." /// - public static string Common_FileNotExist + internal static string Common_FileNotExist { get { return GetString("Common_FileNotExist"); } } @@ -92,7 +92,7 @@ public static string Common_FileNotExist /// /// Looks up a localized string similar to "Cannot convert null to a value type." /// - public static string Common_ValueTypeCannotBeNull + internal static string Common_ValueTypeCannotBeNull { get { return GetString("Common_ValueTypeCannotBeNull"); } } @@ -100,7 +100,7 @@ public static string Common_ValueTypeCannotBeNull /// /// Looks up a localized string similar to "Category" /// - public static string ErrorDetails_Category + internal static string ErrorDetails_Category { get { return GetString("ErrorDetails_Category"); } } @@ -108,7 +108,7 @@ public static string ErrorDetails_Category /// /// Looks up a localized string similar to "Column number" /// - public static string ErrorDetails_ColumnNumber + internal static string ErrorDetails_ColumnNumber { get { return GetString("ErrorDetails_ColumnNumber"); } } @@ -116,7 +116,7 @@ public static string ErrorDetails_ColumnNumber /// /// Looks up a localized string similar to "Engine mode" /// - public static string ErrorDetails_EngineMode + internal static string ErrorDetails_EngineMode { get { return GetString("ErrorDetails_EngineMode"); } } @@ -124,7 +124,7 @@ public static string ErrorDetails_EngineMode /// /// Looks up a localized string similar to "Error code" /// - public static string ErrorDetails_ErrorCode + internal static string ErrorDetails_ErrorCode { get { return GetString("ErrorDetails_ErrorCode"); } } @@ -132,7 +132,7 @@ public static string ErrorDetails_ErrorCode /// /// Looks up a localized string similar to "Line number" /// - public static string ErrorDetails_LineNumber + internal static string ErrorDetails_LineNumber { get { return GetString("ErrorDetails_LineNumber"); } } @@ -140,7 +140,7 @@ public static string ErrorDetails_LineNumber /// /// Looks up a localized string similar to "Message" /// - public static string ErrorDetails_Message + internal static string ErrorDetails_Message { get { return GetString("ErrorDetails_Message"); } } @@ -148,7 +148,7 @@ public static string ErrorDetails_Message /// /// Looks up a localized string similar to "Source fragment" /// - public static string ErrorDetails_SourceFragment + internal static string ErrorDetails_SourceFragment { get { return GetString("ErrorDetails_SourceFragment"); } } @@ -156,7 +156,7 @@ public static string ErrorDetails_SourceFragment /// /// Looks up a localized string similar to "Resource with name '{0}' is null." /// - public static string Resources_ResourceIsNull + internal static string Resources_ResourceIsNull { get { return GetString("Resources_ResourceIsNull"); } } @@ -164,7 +164,7 @@ public static string Resources_ResourceIsNull /// /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." /// - public static string Runtime_EdgeJsEngineNotLoaded + internal static string Runtime_EdgeJsEngineNotLoaded { get { return GetString("Runtime_EdgeJsEngineNotLoaded"); } } @@ -172,7 +172,7 @@ public static string Runtime_EdgeJsEngineNotLoaded /// /// Looks up a localized string similar to "The embedded host object '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_EmbeddedHostObjectTypeNotSupported + internal static string Runtime_EmbeddedHostObjectTypeNotSupported { get { return GetString("Runtime_EmbeddedHostObjectTypeNotSupported"); } } @@ -180,7 +180,7 @@ public static string Runtime_EmbeddedHostObjectTypeNotSupported /// /// Looks up a localized string similar to "The embedded host type `{0}` is not supported." /// - public static string Runtime_EmbeddedHostTypeNotSupported + internal static string Runtime_EmbeddedHostTypeNotSupported { get { return GetString("Runtime_EmbeddedHostTypeNotSupported"); } } @@ -188,7 +188,7 @@ public static string Runtime_EmbeddedHostTypeNotSupported /// /// Looks up a localized string similar to "The function with the name '{0}' does not exist." /// - public static string Runtime_FunctionNotExist + internal static string Runtime_FunctionNotExist { get { return GetString("Runtime_FunctionNotExist"); } } @@ -196,7 +196,7 @@ public static string Runtime_FunctionNotExist /// /// Looks up a localized string similar to "One of the function parameters '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_FunctionParameterTypeNotSupported + internal static string Runtime_FunctionParameterTypeNotSupported { get { return GetString("Runtime_FunctionParameterTypeNotSupported"); } } @@ -204,7 +204,7 @@ public static string Runtime_FunctionParameterTypeNotSupported /// /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." /// - public static string Runtime_IeJsEngineNotLoaded + internal static string Runtime_IeJsEngineNotLoaded { get { return GetString("Runtime_IeJsEngineNotLoaded"); } } @@ -212,7 +212,7 @@ public static string Runtime_IeJsEngineNotLoaded /// /// Looks up a localized string similar to "The function name '{0}' has incorrect format." /// - public static string Runtime_InvalidFunctionNameFormat + internal static string Runtime_InvalidFunctionNameFormat { get { return GetString("Runtime_InvalidFunctionNameFormat"); } } @@ -220,7 +220,7 @@ public static string Runtime_InvalidFunctionNameFormat /// /// Looks up a localized string similar to "The script item name '{0}' has incorrect format." /// - public static string Runtime_InvalidScriptItemNameFormat + internal static string Runtime_InvalidScriptItemNameFormat { get { return GetString("Runtime_InvalidScriptItemNameFormat"); } } @@ -228,7 +228,7 @@ public static string Runtime_InvalidScriptItemNameFormat /// /// Looks up a localized string similar to "The variable name '{0}' has incorrect format." /// - public static string Runtime_InvalidVariableNameFormat + internal static string Runtime_InvalidVariableNameFormat { get { return GetString("Runtime_InvalidVariableNameFormat"); } } @@ -236,7 +236,7 @@ public static string Runtime_InvalidVariableNameFormat /// /// Looks up a localized string similar to "Selected '{0}' mode of JavaScript engine is not supported." /// - public static string Runtime_JsEngineModeNotSupported + internal static string Runtime_JsEngineModeNotSupported { get { return GetString("Runtime_JsEngineModeNotSupported"); } } @@ -244,7 +244,7 @@ public static string Runtime_JsEngineModeNotSupported /// /// Looks up a localized string similar to "It is prohibited to use the {0} and {1} engines in one process." /// - public static string Runtime_JsEnginesConflictInProcess + internal static string Runtime_JsEnginesConflictInProcess { get { return GetString("Runtime_JsEnginesConflictInProcess"); } } @@ -252,7 +252,7 @@ public static string Runtime_JsEnginesConflictInProcess /// /// Looks up a localized string similar to "It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time." /// - public static string Runtime_JsEnginesConflictOnMachine + internal static string Runtime_JsEnginesConflictOnMachine { get { return GetString("Runtime_JsEnginesConflictOnMachine"); } } @@ -260,7 +260,7 @@ public static string Runtime_JsEnginesConflictOnMachine /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// - public static string Runtime_ReturnValueTypeNotSupported + internal static string Runtime_ReturnValueTypeNotSupported { get { return GetString("Runtime_ReturnValueTypeNotSupported"); } } @@ -268,7 +268,7 @@ public static string Runtime_ReturnValueTypeNotSupported /// /// Looks up a localized string similar to "Script execution was interrupted." /// - public static string Runtime_ScriptInterrupted + internal static string Runtime_ScriptInterrupted { get { return GetString("Runtime_ScriptInterrupted"); } } @@ -276,16 +276,16 @@ public static string Runtime_ScriptInterrupted /// /// Looks up a localized string similar to "The variable '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_VariableTypeNotSupported + internal static string Runtime_VariableTypeNotSupported { get { return GetString("Runtime_VariableTypeNotSupported"); } } - private static string GetString(string name) - { - string value = ResourceManager.GetString(name, _resourceCulture); + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); - return value; - } + return value; } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index f146cb9..fe57bd8 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class NetCoreStrings + internal class NetCoreStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class NetCoreStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." /// - public static string Runtime_HostDelegateInvocationFailed + internal static string Runtime_HostDelegateInvocationFailed { get { return GetString("Runtime_HostDelegateInvocationFailed"); } } @@ -68,7 +68,7 @@ public static string Runtime_HostDelegateInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectFieldGettingFailed + internal static string Runtime_HostObjectFieldGettingFailed { get { return GetString("Runtime_HostObjectFieldGettingFailed"); } } @@ -76,7 +76,7 @@ public static string Runtime_HostObjectFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectFieldSettingFailed + internal static string Runtime_HostObjectFieldSettingFailed { get { return GetString("Runtime_HostObjectFieldSettingFailed"); } } @@ -84,7 +84,7 @@ public static string Runtime_HostObjectFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectMethodInvocationFailed + internal static string Runtime_HostObjectMethodInvocationFailed { get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } } @@ -92,7 +92,7 @@ public static string Runtime_HostObjectMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectPropertyGettingFailed + internal static string Runtime_HostObjectPropertyGettingFailed { get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } } @@ -100,7 +100,7 @@ public static string Runtime_HostObjectPropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectPropertySettingFailed + internal static string Runtime_HostObjectPropertySettingFailed { get { return GetString("Runtime_HostObjectPropertySettingFailed"); } } @@ -108,7 +108,7 @@ public static string Runtime_HostObjectPropertySettingFailed /// /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." /// - public static string Runtime_HostTypeConstructorInvocationFailed + internal static string Runtime_HostTypeConstructorInvocationFailed { get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } } @@ -116,7 +116,7 @@ public static string Runtime_HostTypeConstructorInvocationFailed /// /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." /// - public static string Runtime_HostTypeConstructorNotFound + internal static string Runtime_HostTypeConstructorNotFound { get { return GetString("Runtime_HostTypeConstructorNotFound"); } } @@ -124,7 +124,7 @@ public static string Runtime_HostTypeConstructorNotFound /// /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeFieldGettingFailed + internal static string Runtime_HostTypeFieldGettingFailed { get { return GetString("Runtime_HostTypeFieldGettingFailed"); } } @@ -132,7 +132,7 @@ public static string Runtime_HostTypeFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeFieldSettingFailed + internal static string Runtime_HostTypeFieldSettingFailed { get { return GetString("Runtime_HostTypeFieldSettingFailed"); } } @@ -140,7 +140,7 @@ public static string Runtime_HostTypeFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeMethodInvocationFailed + internal static string Runtime_HostTypeMethodInvocationFailed { get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } } @@ -148,7 +148,7 @@ public static string Runtime_HostTypeMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypePropertyGettingFailed + internal static string Runtime_HostTypePropertyGettingFailed { get { return GetString("Runtime_HostTypePropertyGettingFailed"); } } @@ -156,7 +156,7 @@ public static string Runtime_HostTypePropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." /// - public static string Runtime_HostTypePropertySettingFailed + internal static string Runtime_HostTypePropertySettingFailed { get { return GetString("Runtime_HostTypePropertySettingFailed"); } } @@ -164,7 +164,7 @@ public static string Runtime_HostTypePropertySettingFailed /// /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectField + internal static string Runtime_InvalidThisContextForHostObjectField { get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } } @@ -172,7 +172,7 @@ public static string Runtime_InvalidThisContextForHostObjectField /// /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectMethod + internal static string Runtime_InvalidThisContextForHostObjectMethod { get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } } @@ -180,7 +180,7 @@ public static string Runtime_InvalidThisContextForHostObjectMethod /// /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectProperty + internal static string Runtime_InvalidThisContextForHostObjectProperty { get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } } @@ -188,7 +188,7 @@ public static string Runtime_InvalidThisContextForHostObjectProperty /// /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." /// - public static string Runtime_JsEngineModeNotCompatibleWithNetCore + internal static string Runtime_JsEngineModeNotCompatibleWithNetCore { get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } } @@ -196,7 +196,7 @@ public static string Runtime_JsEngineModeNotCompatibleWithNetCore /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." /// - public static string Runtime_JsEnginesNotFound + internal static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -204,7 +204,7 @@ public static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." /// - public static string Runtime_SuitableConstructorOfHostTypeNotFound + internal static string Runtime_SuitableConstructorOfHostTypeNotFound { get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } } @@ -212,16 +212,16 @@ public static string Runtime_SuitableConstructorOfHostTypeNotFound /// /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." /// - public static string Runtime_SuitableMethodOfHostObjectNotFound + internal static string Runtime_SuitableMethodOfHostObjectNotFound { get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } } - private static string GetString(string name) - { - string value = ResourceManager.GetString(name, _resourceCulture); + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); - return value; - } + return value; } - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index 85ae48e..81ce790 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class NetFrameworkStrings + internal class NetFrameworkStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class NetFrameworkStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." /// - public static string Runtime_ActiveScriptDispatcherNotInitialized + internal static string Runtime_ActiveScriptDispatcherNotInitialized { get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } } @@ -68,7 +68,7 @@ public static string Runtime_ActiveScriptDispatcherNotInitialized /// /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." /// - public static string Runtime_ActiveScriptLanguageVersionSelectionFailed + internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed { get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } } @@ -76,7 +76,7 @@ public static string Runtime_ActiveScriptLanguageVersionSelectionFailed /// /// Looks up a localized string similar to "Item with name '{0}' not found." /// - public static string Runtime_ItemNotFound + internal static string Runtime_ItemNotFound { get { return GetString("Runtime_ItemNotFound"); } } @@ -84,7 +84,7 @@ public static string Runtime_ItemNotFound /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." /// - public static string Runtime_JsEnginesNotFound + internal static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -92,16 +92,16 @@ public static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "The variable with the name '{0}' does not exist." /// - public static string Runtime_VariableNotExist + internal static string Runtime_VariableNotExist { get { return GetString("Runtime_VariableNotExist"); } } - private static string GetString(string name) - { - string value = ResourceManager.GetString(name, _resourceCulture); + private static string GetString(string name) + { + string value = ResourceManager.GetString(name, _resourceCulture); - return value; - } + return value; } - } \ No newline at end of file + } +} \ No newline at end of file From dc59b6cf9338484e07c922fe0d432d2d63d13c66 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 29 Nov 2017 21:50:53 +0300 Subject: [PATCH 106/238] ResxToCs was updated to version 1.0.0 Alpha 5 --- .../MsieJavaScriptEngine.Net40.csproj | 6 +++--- src/MsieJavaScriptEngine.Net4/packages.config | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj index cea3ecf..5cabe5d 100644 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -14,7 +14,7 @@ Client ..\..\ true - 93f7ad1b + 9f1c37fe true @@ -597,10 +597,10 @@ - + - + - + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 9c478e8..053e82a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -38,7 +38,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 74b9d8c..dfc9397 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 netcoreapp1.0;net451 - 1.0.4 + 1.0.8 Exe true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 74b9d8c..dfc9397 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 netcoreapp1.0;net451 - 1.0.4 + 1.0.8 Exe true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 74b9d8c..dfc9397 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 netcoreapp1.0;net451 - 1.0.4 + 1.0.8 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 59272fb..c28ce84 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 netcoreapp1.0;net451 - 1.0.4 + 1.0.8 Exe true From 6440359321c00881660a0aa6082d1a31be824e3a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 29 Nov 2017 22:32:59 +0300 Subject: [PATCH 107/238] In `build.cmd` and `build.sh` files were changed version of SDK --- build.cmd | 2 +- build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index f58ee41..9d8d513 100644 --- a/build.cmd +++ b/build.cmd @@ -3,7 +3,7 @@ setlocal set ORIGINAL_CURRENT_DIR=%cd% set KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 -set KOREBUILD_DOTNET_VERSION=1.0.4 +set KOREBUILD_DOTNET_VERSION=1.1.5 cd %~dp0 diff --git a/build.sh b/build.sh index 3620f35..92331bf 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash ORIGINAL_CURRENT_DIR=%cd% KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 -KOREBUILD_DOTNET_VERSION=1.0.4 +KOREBUILD_DOTNET_VERSION=1.1.5 repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $repoFolder From ab224d5ca51de48316c94ce94125993cd41b2990 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 3 Dec 2017 21:30:37 +0300 Subject: [PATCH 108/238] NUnit was updated to version 3.9.0 --- build.cmd | 4 +- build.sh | 4 +- makefile.shade | 16 +---- .../MsieJavaScriptEngine.Net40.csproj | 7 --- .../MsieJavaScriptEngine.csproj | 16 +---- .../Resources/CommonStrings.Designer.cs | 62 +++++++++---------- .../Resources/NetCoreStrings.Designer.cs | 46 +++++++------- .../Resources/NetFrameworkStrings.Designer.cs | 16 ++--- ...sieJavaScriptEngine.Test.Auto.Net40.csproj | 4 +- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 +- .../MsieJavaScriptEngine.Test.Auto/Program.cs | 16 ----- ...ngine.Test.ChakraActiveScript.Net40.csproj | 4 +- .../packages.config | 2 +- ...criptEngine.Test.ChakraActiveScript.csproj | 4 +- .../Program.cs | 16 ----- ...iptEngine.Test.ChakraEdgeJsRt.Net40.csproj | 4 +- .../packages.config | 2 +- .../CommonTests.cs | 9 +-- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 +- .../Program.cs | 16 ----- ...criptEngine.Test.ChakraIeJsRt.Net40.csproj | 4 +- .../packages.config | 2 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 +- .../Program.cs | 16 ----- ...JavaScriptEngine.Test.Classic.Net40.csproj | 4 +- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 4 +- .../Program.cs | 16 ----- ...eJavaScriptEngine.Test.Common.Net40.csproj | 4 +- .../packages.config | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 7 ++- .../Program.cs | 16 ----- test/MsieJavaScriptEngine.Test.Net4.nunit | 1 - 34 files changed, 112 insertions(+), 228 deletions(-) delete mode 100644 test/MsieJavaScriptEngine.Test.Auto/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Classic/Program.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Program.cs diff --git a/build.cmd b/build.cmd index 9d8d513..7214fae 100644 --- a/build.cmd +++ b/build.cmd @@ -10,8 +10,8 @@ cd %~dp0 set local_nuget_package_manager=.nuget\NuGet.exe set package_dir=packages -if not exist %package_dir%\NUnit.Runners ( - %local_nuget_package_manager% install NUnit.Runners -Version 3.4.1 -O %package_dir% -ExcludeVersion -NoCache +if not exist %package_dir%\NUnit.Console ( + %local_nuget_package_manager% install NUnit.Console -Version 3.7.0 -O %package_dir% -ExcludeVersion -NoCache ) PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file diff --git a/build.sh b/build.sh index 92331bf..724e1da 100644 --- a/build.sh +++ b/build.sh @@ -9,8 +9,8 @@ cd $repoFolder localNugetPackageManager=.nuget/NuGet.exe packageDir=packages -if test ! -d $packageDir/NUnit.Runners; then - mono $localNugetPackageManager install NUnit.Runners -Version 3.4.1 -O $packageDir% -ExcludeVersion -NoCache +if test ! -d $packageDir/NUnit.Console; then + mono $localNugetPackageManager install NUnit.Console -Version 3.7.0 -O $packageDir% -ExcludeVersion -NoCache fi koreBuildZip="https://github.com/aspnet/KoreBuild/archive/02bd945d32558d24c1e5c6b74e37d44585ad9691.zip" diff --git a/makefile.shade b/makefile.shade index f218337..90ce538 100644 --- a/makefile.shade +++ b/makefile.shade @@ -32,19 +32,7 @@ use-standard-lifecycle Log.Info(""); string testProjectDirPath = Path.Combine(testDirPath, testProjectName); - string testAssemblyDirPath; - string testAssemblyFilePath; - - testAssemblyDirPath = Path.Combine(testProjectDirPath, "bin/Release/net451"); - testAssemblyFilePath = Path.Combine(testAssemblyDirPath, testProjectName + ".exe"); - Exec(testAssemblyFilePath, "", testProjectDirPath); - - testAssemblyDirPath = Path.Combine(testProjectDirPath, "bin/Release/netcoreapp1.0"); - if (Directory.Exists(testAssemblyDirPath)) - { - testAssemblyFilePath = Path.Combine(testAssemblyDirPath, testProjectName + ".dll"); - Exec("dotnet", testAssemblyFilePath, testProjectDirPath); - } + Exec("dotnet", "test", testProjectDirPath); Log.Info(""); } @@ -59,7 +47,7 @@ use-standard-lifecycle Log.Info("Run unit tests for .NET 4.0 version:"); Log.Info(""); - Exec(nunitConsolePath, "MsieJavaScriptEngine.Test.Net4.nunit --verbose", testDirPath); + Exec(nunitConsolePath, "MsieJavaScriptEngine.Test.Net4.nunit --process=Multiple --domain=Single --trace=Verbose", testDirPath); Log.Info(""); } diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj index 5cabe5d..0924a88 100644 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj @@ -15,7 +15,6 @@ ..\..\ true 9f1c37fe - true AnyCPU @@ -601,10 +600,4 @@ - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 053e82a..750faa6 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -27,6 +27,8 @@ + + @@ -36,18 +38,4 @@ - - - - - - - - - true - - - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 574da86..ef313a6 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - internal class CommonStrings + public class CommonStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ internal class CommonStrings /// /// Returns a cached ResourceManager instance used by this class /// - internal static ResourceManager ResourceManager + public static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ internal static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - internal static CultureInfo Culture + public static CultureInfo Culture { get { @@ -60,7 +60,7 @@ internal static CultureInfo Culture /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-empty string." /// - internal static string Common_ArgumentIsEmpty + public static string Common_ArgumentIsEmpty { get { return GetString("Common_ArgumentIsEmpty"); } } @@ -68,7 +68,7 @@ internal static string Common_ArgumentIsEmpty /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-nullable." /// - internal static string Common_ArgumentIsNull + public static string Common_ArgumentIsNull { get { return GetString("Common_ArgumentIsNull"); } } @@ -76,7 +76,7 @@ internal static string Common_ArgumentIsNull /// /// Looks up a localized string similar to "Cannot convert object of type `{0}` to type `{1}`." /// - internal static string Common_CannotConvertObjectToType + public static string Common_CannotConvertObjectToType { get { return GetString("Common_CannotConvertObjectToType"); } } @@ -84,7 +84,7 @@ internal static string Common_CannotConvertObjectToType /// /// Looks up a localized string similar to "File '{0}' not exist." /// - internal static string Common_FileNotExist + public static string Common_FileNotExist { get { return GetString("Common_FileNotExist"); } } @@ -92,7 +92,7 @@ internal static string Common_FileNotExist /// /// Looks up a localized string similar to "Cannot convert null to a value type." /// - internal static string Common_ValueTypeCannotBeNull + public static string Common_ValueTypeCannotBeNull { get { return GetString("Common_ValueTypeCannotBeNull"); } } @@ -100,7 +100,7 @@ internal static string Common_ValueTypeCannotBeNull /// /// Looks up a localized string similar to "Category" /// - internal static string ErrorDetails_Category + public static string ErrorDetails_Category { get { return GetString("ErrorDetails_Category"); } } @@ -108,7 +108,7 @@ internal static string ErrorDetails_Category /// /// Looks up a localized string similar to "Column number" /// - internal static string ErrorDetails_ColumnNumber + public static string ErrorDetails_ColumnNumber { get { return GetString("ErrorDetails_ColumnNumber"); } } @@ -116,7 +116,7 @@ internal static string ErrorDetails_ColumnNumber /// /// Looks up a localized string similar to "Engine mode" /// - internal static string ErrorDetails_EngineMode + public static string ErrorDetails_EngineMode { get { return GetString("ErrorDetails_EngineMode"); } } @@ -124,7 +124,7 @@ internal static string ErrorDetails_EngineMode /// /// Looks up a localized string similar to "Error code" /// - internal static string ErrorDetails_ErrorCode + public static string ErrorDetails_ErrorCode { get { return GetString("ErrorDetails_ErrorCode"); } } @@ -132,7 +132,7 @@ internal static string ErrorDetails_ErrorCode /// /// Looks up a localized string similar to "Line number" /// - internal static string ErrorDetails_LineNumber + public static string ErrorDetails_LineNumber { get { return GetString("ErrorDetails_LineNumber"); } } @@ -140,7 +140,7 @@ internal static string ErrorDetails_LineNumber /// /// Looks up a localized string similar to "Message" /// - internal static string ErrorDetails_Message + public static string ErrorDetails_Message { get { return GetString("ErrorDetails_Message"); } } @@ -148,7 +148,7 @@ internal static string ErrorDetails_Message /// /// Looks up a localized string similar to "Source fragment" /// - internal static string ErrorDetails_SourceFragment + public static string ErrorDetails_SourceFragment { get { return GetString("ErrorDetails_SourceFragment"); } } @@ -156,7 +156,7 @@ internal static string ErrorDetails_SourceFragment /// /// Looks up a localized string similar to "Resource with name '{0}' is null." /// - internal static string Resources_ResourceIsNull + public static string Resources_ResourceIsNull { get { return GetString("Resources_ResourceIsNull"); } } @@ -164,7 +164,7 @@ internal static string Resources_ResourceIsNull /// /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." /// - internal static string Runtime_EdgeJsEngineNotLoaded + public static string Runtime_EdgeJsEngineNotLoaded { get { return GetString("Runtime_EdgeJsEngineNotLoaded"); } } @@ -172,7 +172,7 @@ internal static string Runtime_EdgeJsEngineNotLoaded /// /// Looks up a localized string similar to "The embedded host object '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_EmbeddedHostObjectTypeNotSupported + public static string Runtime_EmbeddedHostObjectTypeNotSupported { get { return GetString("Runtime_EmbeddedHostObjectTypeNotSupported"); } } @@ -180,7 +180,7 @@ internal static string Runtime_EmbeddedHostObjectTypeNotSupported /// /// Looks up a localized string similar to "The embedded host type `{0}` is not supported." /// - internal static string Runtime_EmbeddedHostTypeNotSupported + public static string Runtime_EmbeddedHostTypeNotSupported { get { return GetString("Runtime_EmbeddedHostTypeNotSupported"); } } @@ -188,7 +188,7 @@ internal static string Runtime_EmbeddedHostTypeNotSupported /// /// Looks up a localized string similar to "The function with the name '{0}' does not exist." /// - internal static string Runtime_FunctionNotExist + public static string Runtime_FunctionNotExist { get { return GetString("Runtime_FunctionNotExist"); } } @@ -196,7 +196,7 @@ internal static string Runtime_FunctionNotExist /// /// Looks up a localized string similar to "One of the function parameters '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_FunctionParameterTypeNotSupported + public static string Runtime_FunctionParameterTypeNotSupported { get { return GetString("Runtime_FunctionParameterTypeNotSupported"); } } @@ -204,7 +204,7 @@ internal static string Runtime_FunctionParameterTypeNotSupported /// /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." /// - internal static string Runtime_IeJsEngineNotLoaded + public static string Runtime_IeJsEngineNotLoaded { get { return GetString("Runtime_IeJsEngineNotLoaded"); } } @@ -212,7 +212,7 @@ internal static string Runtime_IeJsEngineNotLoaded /// /// Looks up a localized string similar to "The function name '{0}' has incorrect format." /// - internal static string Runtime_InvalidFunctionNameFormat + public static string Runtime_InvalidFunctionNameFormat { get { return GetString("Runtime_InvalidFunctionNameFormat"); } } @@ -220,7 +220,7 @@ internal static string Runtime_InvalidFunctionNameFormat /// /// Looks up a localized string similar to "The script item name '{0}' has incorrect format." /// - internal static string Runtime_InvalidScriptItemNameFormat + public static string Runtime_InvalidScriptItemNameFormat { get { return GetString("Runtime_InvalidScriptItemNameFormat"); } } @@ -228,7 +228,7 @@ internal static string Runtime_InvalidScriptItemNameFormat /// /// Looks up a localized string similar to "The variable name '{0}' has incorrect format." /// - internal static string Runtime_InvalidVariableNameFormat + public static string Runtime_InvalidVariableNameFormat { get { return GetString("Runtime_InvalidVariableNameFormat"); } } @@ -236,7 +236,7 @@ internal static string Runtime_InvalidVariableNameFormat /// /// Looks up a localized string similar to "Selected '{0}' mode of JavaScript engine is not supported." /// - internal static string Runtime_JsEngineModeNotSupported + public static string Runtime_JsEngineModeNotSupported { get { return GetString("Runtime_JsEngineModeNotSupported"); } } @@ -244,7 +244,7 @@ internal static string Runtime_JsEngineModeNotSupported /// /// Looks up a localized string similar to "It is prohibited to use the {0} and {1} engines in one process." /// - internal static string Runtime_JsEnginesConflictInProcess + public static string Runtime_JsEnginesConflictInProcess { get { return GetString("Runtime_JsEnginesConflictInProcess"); } } @@ -252,7 +252,7 @@ internal static string Runtime_JsEnginesConflictInProcess /// /// Looks up a localized string similar to "It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time." /// - internal static string Runtime_JsEnginesConflictOnMachine + public static string Runtime_JsEnginesConflictOnMachine { get { return GetString("Runtime_JsEnginesConflictOnMachine"); } } @@ -260,7 +260,7 @@ internal static string Runtime_JsEnginesConflictOnMachine /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// - internal static string Runtime_ReturnValueTypeNotSupported + public static string Runtime_ReturnValueTypeNotSupported { get { return GetString("Runtime_ReturnValueTypeNotSupported"); } } @@ -268,7 +268,7 @@ internal static string Runtime_ReturnValueTypeNotSupported /// /// Looks up a localized string similar to "Script execution was interrupted." /// - internal static string Runtime_ScriptInterrupted + public static string Runtime_ScriptInterrupted { get { return GetString("Runtime_ScriptInterrupted"); } } @@ -276,7 +276,7 @@ internal static string Runtime_ScriptInterrupted /// /// Looks up a localized string similar to "The variable '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_VariableTypeNotSupported + public static string Runtime_VariableTypeNotSupported { get { return GetString("Runtime_VariableTypeNotSupported"); } } diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index fe57bd8..dfa1c69 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - internal class NetCoreStrings + public class NetCoreStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ internal class NetCoreStrings /// /// Returns a cached ResourceManager instance used by this class /// - internal static ResourceManager ResourceManager + public static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ internal static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - internal static CultureInfo Culture + public static CultureInfo Culture { get { @@ -60,7 +60,7 @@ internal static CultureInfo Culture /// /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." /// - internal static string Runtime_HostDelegateInvocationFailed + public static string Runtime_HostDelegateInvocationFailed { get { return GetString("Runtime_HostDelegateInvocationFailed"); } } @@ -68,7 +68,7 @@ internal static string Runtime_HostDelegateInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." /// - internal static string Runtime_HostObjectFieldGettingFailed + public static string Runtime_HostObjectFieldGettingFailed { get { return GetString("Runtime_HostObjectFieldGettingFailed"); } } @@ -76,7 +76,7 @@ internal static string Runtime_HostObjectFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." /// - internal static string Runtime_HostObjectFieldSettingFailed + public static string Runtime_HostObjectFieldSettingFailed { get { return GetString("Runtime_HostObjectFieldSettingFailed"); } } @@ -84,7 +84,7 @@ internal static string Runtime_HostObjectFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." /// - internal static string Runtime_HostObjectMethodInvocationFailed + public static string Runtime_HostObjectMethodInvocationFailed { get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } } @@ -92,7 +92,7 @@ internal static string Runtime_HostObjectMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." /// - internal static string Runtime_HostObjectPropertyGettingFailed + public static string Runtime_HostObjectPropertyGettingFailed { get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } } @@ -100,7 +100,7 @@ internal static string Runtime_HostObjectPropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." /// - internal static string Runtime_HostObjectPropertySettingFailed + public static string Runtime_HostObjectPropertySettingFailed { get { return GetString("Runtime_HostObjectPropertySettingFailed"); } } @@ -108,7 +108,7 @@ internal static string Runtime_HostObjectPropertySettingFailed /// /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." /// - internal static string Runtime_HostTypeConstructorInvocationFailed + public static string Runtime_HostTypeConstructorInvocationFailed { get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } } @@ -116,7 +116,7 @@ internal static string Runtime_HostTypeConstructorInvocationFailed /// /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." /// - internal static string Runtime_HostTypeConstructorNotFound + public static string Runtime_HostTypeConstructorNotFound { get { return GetString("Runtime_HostTypeConstructorNotFound"); } } @@ -124,7 +124,7 @@ internal static string Runtime_HostTypeConstructorNotFound /// /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - internal static string Runtime_HostTypeFieldGettingFailed + public static string Runtime_HostTypeFieldGettingFailed { get { return GetString("Runtime_HostTypeFieldGettingFailed"); } } @@ -132,7 +132,7 @@ internal static string Runtime_HostTypeFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - internal static string Runtime_HostTypeFieldSettingFailed + public static string Runtime_HostTypeFieldSettingFailed { get { return GetString("Runtime_HostTypeFieldSettingFailed"); } } @@ -140,7 +140,7 @@ internal static string Runtime_HostTypeFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." /// - internal static string Runtime_HostTypeMethodInvocationFailed + public static string Runtime_HostTypeMethodInvocationFailed { get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } } @@ -148,7 +148,7 @@ internal static string Runtime_HostTypeMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." /// - internal static string Runtime_HostTypePropertyGettingFailed + public static string Runtime_HostTypePropertyGettingFailed { get { return GetString("Runtime_HostTypePropertyGettingFailed"); } } @@ -156,7 +156,7 @@ internal static string Runtime_HostTypePropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." /// - internal static string Runtime_HostTypePropertySettingFailed + public static string Runtime_HostTypePropertySettingFailed { get { return GetString("Runtime_HostTypePropertySettingFailed"); } } @@ -164,7 +164,7 @@ internal static string Runtime_HostTypePropertySettingFailed /// /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." /// - internal static string Runtime_InvalidThisContextForHostObjectField + public static string Runtime_InvalidThisContextForHostObjectField { get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } } @@ -172,7 +172,7 @@ internal static string Runtime_InvalidThisContextForHostObjectField /// /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." /// - internal static string Runtime_InvalidThisContextForHostObjectMethod + public static string Runtime_InvalidThisContextForHostObjectMethod { get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } } @@ -180,7 +180,7 @@ internal static string Runtime_InvalidThisContextForHostObjectMethod /// /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." /// - internal static string Runtime_InvalidThisContextForHostObjectProperty + public static string Runtime_InvalidThisContextForHostObjectProperty { get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } } @@ -188,7 +188,7 @@ internal static string Runtime_InvalidThisContextForHostObjectProperty /// /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." /// - internal static string Runtime_JsEngineModeNotCompatibleWithNetCore + public static string Runtime_JsEngineModeNotCompatibleWithNetCore { get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } } @@ -196,7 +196,7 @@ internal static string Runtime_JsEngineModeNotCompatibleWithNetCore /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." /// - internal static string Runtime_JsEnginesNotFound + public static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -204,7 +204,7 @@ internal static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." /// - internal static string Runtime_SuitableConstructorOfHostTypeNotFound + public static string Runtime_SuitableConstructorOfHostTypeNotFound { get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } } @@ -212,7 +212,7 @@ internal static string Runtime_SuitableConstructorOfHostTypeNotFound /// /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." /// - internal static string Runtime_SuitableMethodOfHostObjectNotFound + public static string Runtime_SuitableMethodOfHostObjectNotFound { get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } } diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index 81ce790..a519e7b 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - internal class NetFrameworkStrings + public class NetFrameworkStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ internal class NetFrameworkStrings /// /// Returns a cached ResourceManager instance used by this class /// - internal static ResourceManager ResourceManager + public static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ internal static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - internal static CultureInfo Culture + public static CultureInfo Culture { get { @@ -60,7 +60,7 @@ internal static CultureInfo Culture /// /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." /// - internal static string Runtime_ActiveScriptDispatcherNotInitialized + public static string Runtime_ActiveScriptDispatcherNotInitialized { get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } } @@ -68,7 +68,7 @@ internal static string Runtime_ActiveScriptDispatcherNotInitialized /// /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." /// - internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed + public static string Runtime_ActiveScriptLanguageVersionSelectionFailed { get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } } @@ -76,7 +76,7 @@ internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed /// /// Looks up a localized string similar to "Item with name '{0}' not found." /// - internal static string Runtime_ItemNotFound + public static string Runtime_ItemNotFound { get { return GetString("Runtime_ItemNotFound"); } } @@ -84,7 +84,7 @@ internal static string Runtime_ItemNotFound /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." /// - internal static string Runtime_JsEnginesNotFound + public static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -92,7 +92,7 @@ internal static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "The variable with the name '{0}' does not exist." /// - internal static string Runtime_VariableNotExist + public static string Runtime_VariableNotExist { get { return GetString("Runtime_VariableNotExist"); } } diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj index 39984b4..2e088d1 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index dfc9397..30630d8 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -5,7 +5,7 @@ alpha2 netcoreapp1.0;net451 1.0.8 - Exe + Library true false @@ -19,6 +19,8 @@ + + diff --git a/test/MsieJavaScriptEngine.Test.Auto/Program.cs b/test/MsieJavaScriptEngine.Test.Auto/Program.cs deleted file mode 100644 index 3f643e5..0000000 --- a/test/MsieJavaScriptEngine.Test.Auto/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.Auto -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj index adf308a..aa57811 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index d1f7b8e..93afdc1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 net451 - Exe + Library true false @@ -18,6 +18,8 @@ + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Program.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Program.cs deleted file mode 100644 index c9769fd..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.ChakraActiveScript -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj index 4c4e692..beab245 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index b7be3d2..1089ce2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -1,4 +1,5 @@ using System; +using System.Text.RegularExpressions; using NUnit.Framework; @@ -101,9 +102,9 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() var b = 15; foo(a, b);"; - string targetOutput = "ReferenceError: 'bar' is undefined\n" + - " at foo (functions.js:4:3)\n" + - " at Global code (functions.js:11:1)" + string targetOutputPattern = @"ReferenceError: 'bar' is (un|not )defined\n" + + @" at foo \(functions.js:4:3\)\n" + + @" at Global code \(functions.js:11:1\)" ; JsException exception = null; @@ -123,7 +124,7 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() Assert.NotNull(exception); Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(targetOutput, exception.Message); + Assert.True(Regex.IsMatch(exception.Message, targetOutputPattern)); } #endregion diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index dfc9397..30630d8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -5,7 +5,7 @@ alpha2 netcoreapp1.0;net451 1.0.8 - Exe + Library true false @@ -19,6 +19,8 @@ + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Program.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Program.cs deleted file mode 100644 index be240ca..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj index 13ab808..a4e6381 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index dfc9397..30630d8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -5,7 +5,7 @@ alpha2 netcoreapp1.0;net451 1.0.8 - Exe + Library true false @@ -19,6 +19,8 @@ + + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Program.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Program.cs deleted file mode 100644 index 5e6f94c..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.ChakraIeJsRt -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj index 9325d15..63167da 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d1f7b8e..93afdc1 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -4,7 +4,7 @@ 3.0.0 alpha2 net451 - Exe + Library true false @@ -18,6 +18,8 @@ + + diff --git a/test/MsieJavaScriptEngine.Test.Classic/Program.cs b/test/MsieJavaScriptEngine.Test.Classic/Program.cs deleted file mode 100644 index 31317e5..0000000 --- a/test/MsieJavaScriptEngine.Test.Classic/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.Classic -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj index faf2753..c833754 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj @@ -34,8 +34,8 @@ false - - ..\..\packages\NUnit.3.4.1\lib\net45\nunit.framework.dll + + ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll True diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config index f2fd55a..967e817 100644 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config +++ b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config @@ -1,4 +1,4 @@  - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c28ce84..85924ce 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -5,7 +5,7 @@ alpha2 netcoreapp1.0;net451 1.0.8 - Exe + Library true false @@ -24,8 +24,9 @@ - - + + + diff --git a/test/MsieJavaScriptEngine.Test.Common/Program.cs b/test/MsieJavaScriptEngine.Test.Common/Program.cs deleted file mode 100644 index 07d6dd2..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Program.cs +++ /dev/null @@ -1,16 +0,0 @@ -#if NETCOREAPP1_0 || NET451 -using System.Reflection; - -using NUnitLite; - -namespace MsieJavaScriptEngine.Test.Common -{ - class Program - { - public static int Main(string[] args) - { - return new AutoRun(typeof(Program).GetTypeInfo().Assembly).Execute(args); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Net4.nunit b/test/MsieJavaScriptEngine.Test.Net4.nunit index e617cb8..090eb43 100644 --- a/test/MsieJavaScriptEngine.Test.Net4.nunit +++ b/test/MsieJavaScriptEngine.Test.Net4.nunit @@ -1,5 +1,4 @@  - From 50e46e0b2a0bbd5c328454027aed167070543caa Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 4 Dec 2017 20:41:56 +0300 Subject: [PATCH 109/238] `MsieJavaScriptEngine.Net4.sln` and `MsieJavaScriptEngine.DotNet.sln` solutions have been combined into one solution - `MsieJavaScriptEngine.sln` --- MsieJavaScriptEngine.Net4.sln | 83 --- ...ine.DotNet.sln => MsieJavaScriptEngine.sln | 0 NuGet/build-package.cmd | 32 +- .../MsieJavaScriptEngine.Net40.csproj | 603 ------------------ .../bundleconfig.json | 14 - src/MsieJavaScriptEngine.Net4/packages.config | 5 - .../MsieJavaScriptEngine.csproj | 28 +- .../Resources/CommonStrings.Designer.cs | 62 +- .../Resources/NetCoreStrings.Designer.cs | 46 +- .../Resources/NetFrameworkStrings.Designer.cs | 16 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 4 +- .../Utilities/DelegateExtensions.cs | 0 .../Utilities/ExceptionExtensions.cs | 2 +- .../Utilities/TypeConverter.cs | 2 +- .../Utilities/TypeExtensions.cs | 7 +- .../Utilities/TypeInfo.cs | 2 +- .../Utilities/TypeInfoExtensions.cs | 2 +- ...sieJavaScriptEngine.Test.Auto.Net40.csproj | 89 --- .../packages.config | 4 - .../MsieJavaScriptEngine.Test.Auto.csproj | 10 +- ...ngine.Test.ChakraActiveScript.Net40.csproj | 89 --- .../packages.config | 4 - ...criptEngine.Test.ChakraActiveScript.csproj | 5 +- ...iptEngine.Test.ChakraEdgeJsRt.Net40.csproj | 89 --- .../packages.config | 4 - .../CommonTests.cs | 4 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 10 +- ...criptEngine.Test.ChakraIeJsRt.Net40.csproj | 89 --- .../packages.config | 4 - ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 10 +- ...JavaScriptEngine.Test.Classic.Net40.csproj | 89 --- .../packages.config | 4 - .../MsieJavaScriptEngine.Test.Classic.csproj | 5 +- ...eJavaScriptEngine.Test.Common.Net40.csproj | 142 ----- .../packages.config | 4 - .../CommonTestsBase.cs | 4 + .../FileSystemTestsBase.cs | 4 +- .../MsieJavaScriptEngine.Test.Common.csproj | 18 +- test/MsieJavaScriptEngine.Test.Net4.nunit | 24 +- 39 files changed, 151 insertions(+), 1462 deletions(-) delete mode 100644 MsieJavaScriptEngine.Net4.sln rename MsieJavaScriptEngine.DotNet.sln => MsieJavaScriptEngine.sln (100%) delete mode 100644 src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj delete mode 100644 src/MsieJavaScriptEngine.Net4/bundleconfig.json delete mode 100644 src/MsieJavaScriptEngine.Net4/packages.config rename src/{MsieJavaScriptEngine.Net4 => MsieJavaScriptEngine}/Utilities/DelegateExtensions.cs (100%) rename src/{MsieJavaScriptEngine.Net4 => MsieJavaScriptEngine}/Utilities/ExceptionExtensions.cs (98%) rename src/{MsieJavaScriptEngine.Net4 => MsieJavaScriptEngine}/Utilities/TypeInfo.cs (98%) delete mode 100644 test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config delete mode 100644 test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config delete mode 100644 test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj delete mode 100644 test/MsieJavaScriptEngine.Test.Common.Net4/packages.config diff --git a/MsieJavaScriptEngine.Net4.sln b/MsieJavaScriptEngine.Net4.sln deleted file mode 100644 index c3f5830..0000000 --- a/MsieJavaScriptEngine.Net4.sln +++ /dev/null @@ -1,83 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{7179145C-46AE-47D9-AD3B-DC4A3035A4DF}" - ProjectSection(SolutionItems) = preProject - .nuget\NuGet.Config = .nuget\NuGet.Config - .nuget\NuGet.exe = .nuget\NuGet.exe - .nuget\NuGet.targets = .nuget\NuGet.targets - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{1ACC225D-6787-47AB-AF34-C6021002390C}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{2A0DC227-73C5-4E3A-853A-83007AD56B85}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{76F4C14E-54ED-42AC-84F7-2072B14ED59E}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\link.txt = test\SharedFiles\link.txt - test\SharedFiles\square.js = test\SharedFiles\square.js - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Net40", "src\MsieJavaScriptEngine.Net4\MsieJavaScriptEngine.Net40.csproj", "{D672BC49-C454-4975-BD25-A555B9BDD793}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Common.Net40", "test\MsieJavaScriptEngine.Test.Common.Net4\MsieJavaScriptEngine.Test.Common.Net40.csproj", "{A4085B9E-A5D3-4749-BD07-6D1EB7C23820}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Auto.Net40", "test\MsieJavaScriptEngine.Test.Auto.Net4\MsieJavaScriptEngine.Test.Auto.Net40.csproj", "{A4874C43-2097-4FDB-882A-0D74E5508BBD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj", "{16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4\MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj", "{7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.ChakraActiveScript.Net40", "test\MsieJavaScriptEngine.Test.ChakraActiveScript.Net4\MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj", "{21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Test.Classic.Net40", "test\MsieJavaScriptEngine.Test.Classic.Net4\MsieJavaScriptEngine.Test.Classic.Net40.csproj", "{50453B82-ACBF-4E25-9582-1113F274D53E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D672BC49-C454-4975-BD25-A555B9BDD793}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D672BC49-C454-4975-BD25-A555B9BDD793}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D672BC49-C454-4975-BD25-A555B9BDD793}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D672BC49-C454-4975-BD25-A555B9BDD793}.Release|Any CPU.Build.0 = Release|Any CPU - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820}.Release|Any CPU.Build.0 = Release|Any CPU - {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4874C43-2097-4FDB-882A-0D74E5508BBD}.Release|Any CPU.Build.0 = Release|Any CPU - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731}.Release|Any CPU.Build.0 = Release|Any CPU - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1}.Release|Any CPU.Build.0 = Release|Any CPU - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA}.Release|Any CPU.Build.0 = Release|Any CPU - {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50453B82-ACBF-4E25-9582-1113F274D53E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50453B82-ACBF-4E25-9582-1113F274D53E}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {D672BC49-C454-4975-BD25-A555B9BDD793} = {1ACC225D-6787-47AB-AF34-C6021002390C} - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {A4874C43-2097-4FDB-882A-0D74E5508BBD} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {50453B82-ACBF-4E25-9582-1113F274D53E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - {76F4C14E-54ED-42AC-84F7-2072B14ED59E} = {2A0DC227-73C5-4E3A-853A-83007AD56B85} - EndGlobalSection -EndGlobal diff --git a/MsieJavaScriptEngine.DotNet.sln b/MsieJavaScriptEngine.sln similarity index 100% rename from MsieJavaScriptEngine.DotNet.sln rename to MsieJavaScriptEngine.sln diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd index c245170..792f039 100644 --- a/NuGet/build-package.cmd +++ b/NuGet/build-package.cmd @@ -1,10 +1,7 @@ set project_name=MsieJavaScriptEngine -set net4_project_source_dir=..\src\%project_name%.Net4 -set net4_project_bin_dir=%net4_project_source_dir%\bin\Release -set dotnet_project_source_dir=..\src\%project_name% -set dotnet_project_bin_dir=%dotnet_project_source_dir%\bin\Release +set project_source_dir=..\src\%project_name% +set project_bin_dir=%project_source_dir%\bin\Release set licenses_dir=..\Licenses -set net40_msbuild="\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" set dotnet_cli="%ProgramFiles%\dotnet\dotnet.exe" set nuget_package_manager=..\.nuget\nuget.exe @@ -16,21 +13,22 @@ del jsrt-dotnet-license.txt /Q/S del cross-browser-split-license.txt /Q/S del bundler-and-minifier-license.txt /Q/S -%net40_msbuild% "%net4_project_source_dir%\%project_name%.Net40.csproj" /p:Configuration=Release -xcopy "%net4_project_bin_dir%\%project_name%.dll" lib\net40-client\ -xcopy "%net4_project_bin_dir%\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ +%dotnet_cli% restore "%project_source_dir%" -%dotnet_cli% restore "%dotnet_project_source_dir%" +%dotnet_cli% build "%project_source_dir%" --framework net40-client --configuration Release --no-dependencies --no-incremental +xcopy "%project_bin_dir%\net40-client\%project_name%.dll" lib\net40-client\ +xcopy "%project_bin_dir%\net40-client\%project_name%.xml" lib\net40-client\ +xcopy "%project_bin_dir%\net40-client\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ -%dotnet_cli% build "%dotnet_project_source_dir%" --framework net45 --configuration Release --no-dependencies --no-incremental -xcopy "%dotnet_project_bin_dir%\net45\%project_name%.dll" lib\net45\ -xcopy "%dotnet_project_bin_dir%\net45\%project_name%.xml" lib\net45\ -xcopy "%dotnet_project_bin_dir%\net45\ru-ru\%project_name%.resources.dll" lib\net45\ru-ru\ +%dotnet_cli% build "%project_source_dir%" --framework net45 --configuration Release --no-dependencies --no-incremental +xcopy "%project_bin_dir%\net45\%project_name%.dll" lib\net45\ +xcopy "%project_bin_dir%\net45\%project_name%.xml" lib\net45\ +xcopy "%project_bin_dir%\net45\ru-ru\%project_name%.resources.dll" lib\net45\ru-ru\ -%dotnet_cli% build "%dotnet_project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental -xcopy "%dotnet_project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ -xcopy "%dotnet_project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ -xcopy "%dotnet_project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ +%dotnet_cli% build "%project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental +xcopy "%project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ +xcopy "%project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ +xcopy "%project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ copy "%licenses_dir%\sass-and-coffee-license.txt" sass-and-coffee-license.txt /Y copy "%licenses_dir%\chakra-host-license.txt" chakra-host-license.txt /Y diff --git a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj b/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj deleted file mode 100644 index 0924a88..0000000 --- a/src/MsieJavaScriptEngine.Net4/MsieJavaScriptEngine.Net40.csproj +++ /dev/null @@ -1,603 +0,0 @@ - - - - - Debug - AnyCPU - {D672BC49-C454-4975-BD25-A555B9BDD793} - Library - Properties - MsieJavaScriptEngine - MsieJavaScriptEngine - v4.0 - 512 - Client - ..\..\ - true - 9f1c37fe - - - AnyCPU - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - - - - - - true - - - ..\..\tools\Key.snk - - - - ActiveScript\ActiveScriptException.cs - - - ActiveScript\ActiveScriptJsEngineBase.cs - - - ActiveScript\ActiveScriptJsEngineBase.ScriptSiteBase.cs - - - ActiveScript\ActiveScriptWrapper32.cs - - - ActiveScript\ActiveScriptWrapper64.cs - - - ActiveScript\ActiveScriptWrapperBase.cs - - - ActiveScript\ChakraActiveScriptJsEngine.cs - - - ActiveScript\ChakraActiveScriptJsEngine.ScriptSite.cs - - - ActiveScript\ClassicActiveScriptJsEngine.cs - - - ActiveScript\ClassicActiveScriptJsEngine.ScriptSite.cs - - - ActiveScript\Debugging\AppBreakFlags.cs - - - ActiveScript\Debugging\BreakpointState.cs - - - ActiveScript\Debugging\BreakReason.cs - - - ActiveScript\Debugging\BreakResumeAction.cs - - - ActiveScript\Debugging\DebugApplicationWrapper.cs - - - ActiveScript\Debugging\DebugDocument.cs - - - ActiveScript\Debugging\DebugDocumentContext.cs - - - ActiveScript\Debugging\DebugLineInfo.cs - - - ActiveScript\Debugging\DebugStackFrameDescriptor.cs - - - ActiveScript\Debugging\DocumentNameType.cs - - - ActiveScript\Debugging\ErrorResumeAction.cs - - - ActiveScript\Debugging\IActiveScriptDebug32.cs - - - ActiveScript\Debugging\IActiveScriptDebug64.cs - - - ActiveScript\Debugging\IActiveScriptErrorDebug.cs - - - ActiveScript\Debugging\IActiveScriptSiteDebug32.cs - - - ActiveScript\Debugging\IActiveScriptSiteDebug64.cs - - - ActiveScript\Debugging\IActiveScriptSiteDebugEx.cs - - - ActiveScript\Debugging\IApplicationDebugger.cs - - - ActiveScript\Debugging\IDebugApplication32.cs - - - ActiveScript\Debugging\IDebugApplication64.cs - - - ActiveScript\Debugging\IDebugApplicationNode.cs - - - ActiveScript\Debugging\IDebugApplicationThread.cs - - - ActiveScript\Debugging\IDebugAsyncOperation.cs - - - ActiveScript\Debugging\IDebugCodeContext.cs - - - ActiveScript\Debugging\IDebugDocument.cs - - - ActiveScript\Debugging\IDebugDocumentContext.cs - - - ActiveScript\Debugging\IDebugDocumentHelper32.cs - - - ActiveScript\Debugging\IDebugDocumentHelper64.cs - - - ActiveScript\Debugging\IDebugDocumentInfo.cs - - - ActiveScript\Debugging\IDebugDocumentProvider.cs - - - ActiveScript\Debugging\IDebugDocumentText.cs - - - ActiveScript\Debugging\IDebugProperty.cs - - - ActiveScript\Debugging\IDebugStackFrame.cs - - - ActiveScript\Debugging\IDebugStackFrameSniffer.cs - - - ActiveScript\Debugging\IDebugStackFrameSnifferEx32.cs - - - ActiveScript\Debugging\IDebugStackFrameSnifferEx64.cs - - - ActiveScript\Debugging\IDebugSyncOperation.cs - - - ActiveScript\Debugging\IDebugThreadCall32.cs - - - ActiveScript\Debugging\IDebugThreadCall64.cs - - - ActiveScript\Debugging\IEnumDebugApplicationNodes.cs - - - ActiveScript\Debugging\IEnumDebugCodeContexts.cs - - - ActiveScript\Debugging\IEnumDebugExpressionContexts.cs - - - ActiveScript\Debugging\IEnumDebugStackFrames.cs - - - ActiveScript\Debugging\IEnumRemoteDebugApplicationThreads.cs - - - ActiveScript\Debugging\IProcessDebugManager32.cs - - - ActiveScript\Debugging\IProcessDebugManager64.cs - - - ActiveScript\Debugging\IProvideExpressionContexts.cs - - - ActiveScript\Debugging\IRemoteDebugApplicationThread.cs - - - ActiveScript\Debugging\NullEnumDebugStackFrames.cs - - - ActiveScript\Debugging\ProcessDebugManager.cs - - - ActiveScript\Debugging\ProcessDebugManagerWrapper.cs - - - ActiveScript\Debugging\RawEnumCodeContextsOfPosition32.cs - - - ActiveScript\Debugging\RawEnumCodeContextsOfPosition64.cs - - - ActiveScript\Debugging\SourceTextAttrs.cs - - - ActiveScript\Debugging\TextDocAttrs.cs - - - ActiveScript\IActiveScript.cs - - - ActiveScript\IActiveScriptError.cs - - - ActiveScript\IActiveScriptGarbageCollector.cs - - - ActiveScript\IActiveScriptParse32.cs - - - ActiveScript\IActiveScriptParse64.cs - - - ActiveScript\IActiveScriptProperty.cs - - - ActiveScript\IActiveScriptSite.cs - - - ActiveScript\IActiveScriptSiteInterruptPoll.cs - - - ActiveScript\IActiveScriptWrapper.cs - - - ActiveScript\JsErrorNumber.cs - - - ActiveScript\Profiling\IActiveScriptProfilerCallback.cs - - - ActiveScript\Profiling\IActiveScriptProfilerHeapEnum.cs - - - ActiveScript\Profiling\ProfilerEventMask.cs - - - ActiveScript\Profiling\ProfilerScriptType.cs - - - ActiveScript\ScriptGCType.cs - - - ActiveScript\ScriptInfoFlags.cs - - - ActiveScript\ScriptInterruptFlags.cs - - - ActiveScript\ScriptItemFlags.cs - - - ActiveScript\ScriptLanguageVersion.cs - - - ActiveScript\ScriptProperty.cs - - - ActiveScript\ScriptState.cs - - - ActiveScript\ScriptTextFlags.cs - - - ActiveScript\ScriptThreadId.cs - - - ActiveScript\ScriptThreadState.cs - - - ActiveScript\ScriptTypeLibFlags.cs - - - Constants\ClassId.cs - - - Constants\ComErrorCode.cs - - - Constants\DllName.cs - - - Constants\SpecialMemberName.cs - - - Helpers\ComHelpers.cs - - - Helpers\JsEngineModeHelpers.cs - - - Helpers\JsErrorHelpers.cs - - - Helpers\NumericHelpers.cs - - - Helpers\TypeMappingHelpers.cs - - - Helpers\ValidationHelpers.cs - - - HostItemBase.cs - - - HostObject.cs - - - HostType.cs - - - IInnerJsEngine.cs - - - InnerJsEngineBase.cs - - - InterlockedStatedFlag.cs - - - JsEngineLoadException.cs - - - JsEngineMode.cs - - - JsEngineSettings.cs - - - JsException.cs - - - JsRt\ChakraJsRtJsEngineBase.cs - - - JsRt\Edge\ChakraEdgeJsRtJsEngine.cs - - - JsRt\Edge\EdgeJsContext.cs - - - JsRt\Edge\EdgeJsErrorHelpers.cs - - - JsRt\Edge\EdgeJsNativeFunction.cs - - - JsRt\Edge\EdgeJsPropertyId.cs - - - JsRt\Edge\EdgeJsRuntime.cs - - - JsRt\Edge\EdgeJsScope.cs - - - JsRt\Edge\EdgeJsScriptException.cs - - - JsRt\Edge\EdgeJsValue.cs - - - JsRt\Edge\EdgeJsValueExtensions.cs - - - JsRt\Edge\EdgeNativeMethods.cs - - - JsRt\Ie\ChakraIeJsRtJsEngine.cs - - - JsRt\Ie\IeJsContext.cs - - - JsRt\Ie\IeJsErrorHelpers.cs - - - JsRt\Ie\IeJsNativeFunction.cs - - - JsRt\Ie\IeJsPropertyId.cs - - - JsRt\Ie\IeJsRuntime.cs - - - JsRt\Ie\IeJsScope.cs - - - JsRt\Ie\IeJsScriptException.cs - - - JsRt\Ie\IeJsValue.cs - - - JsRt\Ie\IeJsValueExtensions.cs - - - JsRt\Ie\IeNativeMethods.cs - - - JsRt\JsBackgroundWorkItemCallback.cs - - - JsRt\JsBeforeCollectCallback.cs - - - JsRt\JsEngineException.cs - - - JsRt\JsErrorCode.cs - - - JsRt\JsException.cs - - - JsRt\JsFatalException.cs - - - JsRt\JsMemoryAllocationCallback.cs - - - JsRt\JsMemoryEventType.cs - - - JsRt\JsObjectFinalizeCallback.cs - - - JsRt\JsRuntimeAttributes.cs - - - JsRt\JsRuntimeVersion.cs - - - JsRt\JsSourceContext.cs - - - JsRt\JsThreadServiceCallback.cs - - - JsRt\JsUsageException.cs - - - JsRt\JsValueType.cs - - - JsRuntimeException.cs - - - JsScriptInterruptedException.cs - - - MsieJsEngine.cs - - - NotSupportedTypeException.cs - - - AssemblyInfo.cs - - - Resources\CommonStrings.Designer.cs - - - Resources\CommonStrings.ru-ru.Designer.cs - - - Resources\NetFrameworkStrings.Designer.cs - - - Resources\NetFrameworkStrings.ru-ru.Designer.cs - - - ScriptDispatcher.cs - - - StatedFlag.cs - - - Undefined.cs - - - Utilities\CharExtensions.cs - - - Utilities\StringBuilderExtensions.cs - - - Utilities\TypeConverter.cs - - - Utilities\TypeExtensions.cs - - - Utilities\UniqueDocumentNameManager.cs - - - Utilities\Utils.cs - - - - - - - - - - - Key.snk - - - - - - - - - - Resources\CommonStrings.resx - - - Resources\CommonStrings.ru-ru.resx - - - Resources\NetFrameworkStrings.resx - - - Resources\NetFrameworkStrings.ru-ru.resx - - - - - Resources\ES5.js - - - Resources\ES5.min.js - - - Resources\json2.js - - - Resources\json2.min.js - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine.Net4/bundleconfig.json b/src/MsieJavaScriptEngine.Net4/bundleconfig.json deleted file mode 100644 index 7f8d32a..0000000 --- a/src/MsieJavaScriptEngine.Net4/bundleconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "outputFileName": "../MsieJavaScriptEngine/Resources/ES5.min.js", - "inputFiles": [ - "../MsieJavaScriptEngine/Resources/ES5.js" - ] - }, - { - "outputFileName": "../MsieJavaScriptEngine/Resources/json2.min.js", - "inputFiles": [ - "../MsieJavaScriptEngine/Resources/json2.js" - ] - } -] \ No newline at end of file diff --git a/src/MsieJavaScriptEngine.Net4/packages.config b/src/MsieJavaScriptEngine.Net4/packages.config deleted file mode 100644 index 5bae9a5..0000000 --- a/src/MsieJavaScriptEngine.Net4/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 750faa6..3838478 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - netstandard1.3;net45 + net40-client;net45;netstandard1.3 1.6.0 Library true @@ -12,6 +12,7 @@ true $(NoWarn);CS1591 true + true false false @@ -23,19 +24,32 @@ false + + + + + + + + + + + - - - - - - + + + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index ef313a6..574da86 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class CommonStrings + internal class CommonStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class CommonStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-empty string." /// - public static string Common_ArgumentIsEmpty + internal static string Common_ArgumentIsEmpty { get { return GetString("Common_ArgumentIsEmpty"); } } @@ -68,7 +68,7 @@ public static string Common_ArgumentIsEmpty /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-nullable." /// - public static string Common_ArgumentIsNull + internal static string Common_ArgumentIsNull { get { return GetString("Common_ArgumentIsNull"); } } @@ -76,7 +76,7 @@ public static string Common_ArgumentIsNull /// /// Looks up a localized string similar to "Cannot convert object of type `{0}` to type `{1}`." /// - public static string Common_CannotConvertObjectToType + internal static string Common_CannotConvertObjectToType { get { return GetString("Common_CannotConvertObjectToType"); } } @@ -84,7 +84,7 @@ public static string Common_CannotConvertObjectToType /// /// Looks up a localized string similar to "File '{0}' not exist." /// - public static string Common_FileNotExist + internal static string Common_FileNotExist { get { return GetString("Common_FileNotExist"); } } @@ -92,7 +92,7 @@ public static string Common_FileNotExist /// /// Looks up a localized string similar to "Cannot convert null to a value type." /// - public static string Common_ValueTypeCannotBeNull + internal static string Common_ValueTypeCannotBeNull { get { return GetString("Common_ValueTypeCannotBeNull"); } } @@ -100,7 +100,7 @@ public static string Common_ValueTypeCannotBeNull /// /// Looks up a localized string similar to "Category" /// - public static string ErrorDetails_Category + internal static string ErrorDetails_Category { get { return GetString("ErrorDetails_Category"); } } @@ -108,7 +108,7 @@ public static string ErrorDetails_Category /// /// Looks up a localized string similar to "Column number" /// - public static string ErrorDetails_ColumnNumber + internal static string ErrorDetails_ColumnNumber { get { return GetString("ErrorDetails_ColumnNumber"); } } @@ -116,7 +116,7 @@ public static string ErrorDetails_ColumnNumber /// /// Looks up a localized string similar to "Engine mode" /// - public static string ErrorDetails_EngineMode + internal static string ErrorDetails_EngineMode { get { return GetString("ErrorDetails_EngineMode"); } } @@ -124,7 +124,7 @@ public static string ErrorDetails_EngineMode /// /// Looks up a localized string similar to "Error code" /// - public static string ErrorDetails_ErrorCode + internal static string ErrorDetails_ErrorCode { get { return GetString("ErrorDetails_ErrorCode"); } } @@ -132,7 +132,7 @@ public static string ErrorDetails_ErrorCode /// /// Looks up a localized string similar to "Line number" /// - public static string ErrorDetails_LineNumber + internal static string ErrorDetails_LineNumber { get { return GetString("ErrorDetails_LineNumber"); } } @@ -140,7 +140,7 @@ public static string ErrorDetails_LineNumber /// /// Looks up a localized string similar to "Message" /// - public static string ErrorDetails_Message + internal static string ErrorDetails_Message { get { return GetString("ErrorDetails_Message"); } } @@ -148,7 +148,7 @@ public static string ErrorDetails_Message /// /// Looks up a localized string similar to "Source fragment" /// - public static string ErrorDetails_SourceFragment + internal static string ErrorDetails_SourceFragment { get { return GetString("ErrorDetails_SourceFragment"); } } @@ -156,7 +156,7 @@ public static string ErrorDetails_SourceFragment /// /// Looks up a localized string similar to "Resource with name '{0}' is null." /// - public static string Resources_ResourceIsNull + internal static string Resources_ResourceIsNull { get { return GetString("Resources_ResourceIsNull"); } } @@ -164,7 +164,7 @@ public static string Resources_ResourceIsNull /// /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." /// - public static string Runtime_EdgeJsEngineNotLoaded + internal static string Runtime_EdgeJsEngineNotLoaded { get { return GetString("Runtime_EdgeJsEngineNotLoaded"); } } @@ -172,7 +172,7 @@ public static string Runtime_EdgeJsEngineNotLoaded /// /// Looks up a localized string similar to "The embedded host object '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_EmbeddedHostObjectTypeNotSupported + internal static string Runtime_EmbeddedHostObjectTypeNotSupported { get { return GetString("Runtime_EmbeddedHostObjectTypeNotSupported"); } } @@ -180,7 +180,7 @@ public static string Runtime_EmbeddedHostObjectTypeNotSupported /// /// Looks up a localized string similar to "The embedded host type `{0}` is not supported." /// - public static string Runtime_EmbeddedHostTypeNotSupported + internal static string Runtime_EmbeddedHostTypeNotSupported { get { return GetString("Runtime_EmbeddedHostTypeNotSupported"); } } @@ -188,7 +188,7 @@ public static string Runtime_EmbeddedHostTypeNotSupported /// /// Looks up a localized string similar to "The function with the name '{0}' does not exist." /// - public static string Runtime_FunctionNotExist + internal static string Runtime_FunctionNotExist { get { return GetString("Runtime_FunctionNotExist"); } } @@ -196,7 +196,7 @@ public static string Runtime_FunctionNotExist /// /// Looks up a localized string similar to "One of the function parameters '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_FunctionParameterTypeNotSupported + internal static string Runtime_FunctionParameterTypeNotSupported { get { return GetString("Runtime_FunctionParameterTypeNotSupported"); } } @@ -204,7 +204,7 @@ public static string Runtime_FunctionParameterTypeNotSupported /// /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." /// - public static string Runtime_IeJsEngineNotLoaded + internal static string Runtime_IeJsEngineNotLoaded { get { return GetString("Runtime_IeJsEngineNotLoaded"); } } @@ -212,7 +212,7 @@ public static string Runtime_IeJsEngineNotLoaded /// /// Looks up a localized string similar to "The function name '{0}' has incorrect format." /// - public static string Runtime_InvalidFunctionNameFormat + internal static string Runtime_InvalidFunctionNameFormat { get { return GetString("Runtime_InvalidFunctionNameFormat"); } } @@ -220,7 +220,7 @@ public static string Runtime_InvalidFunctionNameFormat /// /// Looks up a localized string similar to "The script item name '{0}' has incorrect format." /// - public static string Runtime_InvalidScriptItemNameFormat + internal static string Runtime_InvalidScriptItemNameFormat { get { return GetString("Runtime_InvalidScriptItemNameFormat"); } } @@ -228,7 +228,7 @@ public static string Runtime_InvalidScriptItemNameFormat /// /// Looks up a localized string similar to "The variable name '{0}' has incorrect format." /// - public static string Runtime_InvalidVariableNameFormat + internal static string Runtime_InvalidVariableNameFormat { get { return GetString("Runtime_InvalidVariableNameFormat"); } } @@ -236,7 +236,7 @@ public static string Runtime_InvalidVariableNameFormat /// /// Looks up a localized string similar to "Selected '{0}' mode of JavaScript engine is not supported." /// - public static string Runtime_JsEngineModeNotSupported + internal static string Runtime_JsEngineModeNotSupported { get { return GetString("Runtime_JsEngineModeNotSupported"); } } @@ -244,7 +244,7 @@ public static string Runtime_JsEngineModeNotSupported /// /// Looks up a localized string similar to "It is prohibited to use the {0} and {1} engines in one process." /// - public static string Runtime_JsEnginesConflictInProcess + internal static string Runtime_JsEnginesConflictInProcess { get { return GetString("Runtime_JsEnginesConflictInProcess"); } } @@ -252,7 +252,7 @@ public static string Runtime_JsEnginesConflictInProcess /// /// Looks up a localized string similar to "It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time." /// - public static string Runtime_JsEnginesConflictOnMachine + internal static string Runtime_JsEnginesConflictOnMachine { get { return GetString("Runtime_JsEnginesConflictOnMachine"); } } @@ -260,7 +260,7 @@ public static string Runtime_JsEnginesConflictOnMachine /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// - public static string Runtime_ReturnValueTypeNotSupported + internal static string Runtime_ReturnValueTypeNotSupported { get { return GetString("Runtime_ReturnValueTypeNotSupported"); } } @@ -268,7 +268,7 @@ public static string Runtime_ReturnValueTypeNotSupported /// /// Looks up a localized string similar to "Script execution was interrupted." /// - public static string Runtime_ScriptInterrupted + internal static string Runtime_ScriptInterrupted { get { return GetString("Runtime_ScriptInterrupted"); } } @@ -276,7 +276,7 @@ public static string Runtime_ScriptInterrupted /// /// Looks up a localized string similar to "The variable '{0}' has a type `{1}`, which is not supported." /// - public static string Runtime_VariableTypeNotSupported + internal static string Runtime_VariableTypeNotSupported { get { return GetString("Runtime_VariableTypeNotSupported"); } } diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index dfa1c69..fe57bd8 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class NetCoreStrings + internal class NetCoreStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class NetCoreStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." /// - public static string Runtime_HostDelegateInvocationFailed + internal static string Runtime_HostDelegateInvocationFailed { get { return GetString("Runtime_HostDelegateInvocationFailed"); } } @@ -68,7 +68,7 @@ public static string Runtime_HostDelegateInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectFieldGettingFailed + internal static string Runtime_HostObjectFieldGettingFailed { get { return GetString("Runtime_HostObjectFieldGettingFailed"); } } @@ -76,7 +76,7 @@ public static string Runtime_HostObjectFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectFieldSettingFailed + internal static string Runtime_HostObjectFieldSettingFailed { get { return GetString("Runtime_HostObjectFieldSettingFailed"); } } @@ -84,7 +84,7 @@ public static string Runtime_HostObjectFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectMethodInvocationFailed + internal static string Runtime_HostObjectMethodInvocationFailed { get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } } @@ -92,7 +92,7 @@ public static string Runtime_HostObjectMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectPropertyGettingFailed + internal static string Runtime_HostObjectPropertyGettingFailed { get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } } @@ -100,7 +100,7 @@ public static string Runtime_HostObjectPropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." /// - public static string Runtime_HostObjectPropertySettingFailed + internal static string Runtime_HostObjectPropertySettingFailed { get { return GetString("Runtime_HostObjectPropertySettingFailed"); } } @@ -108,7 +108,7 @@ public static string Runtime_HostObjectPropertySettingFailed /// /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." /// - public static string Runtime_HostTypeConstructorInvocationFailed + internal static string Runtime_HostTypeConstructorInvocationFailed { get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } } @@ -116,7 +116,7 @@ public static string Runtime_HostTypeConstructorInvocationFailed /// /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." /// - public static string Runtime_HostTypeConstructorNotFound + internal static string Runtime_HostTypeConstructorNotFound { get { return GetString("Runtime_HostTypeConstructorNotFound"); } } @@ -124,7 +124,7 @@ public static string Runtime_HostTypeConstructorNotFound /// /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeFieldGettingFailed + internal static string Runtime_HostTypeFieldGettingFailed { get { return GetString("Runtime_HostTypeFieldGettingFailed"); } } @@ -132,7 +132,7 @@ public static string Runtime_HostTypeFieldGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeFieldSettingFailed + internal static string Runtime_HostTypeFieldSettingFailed { get { return GetString("Runtime_HostTypeFieldSettingFailed"); } } @@ -140,7 +140,7 @@ public static string Runtime_HostTypeFieldSettingFailed /// /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypeMethodInvocationFailed + internal static string Runtime_HostTypeMethodInvocationFailed { get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } } @@ -148,7 +148,7 @@ public static string Runtime_HostTypeMethodInvocationFailed /// /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." /// - public static string Runtime_HostTypePropertyGettingFailed + internal static string Runtime_HostTypePropertyGettingFailed { get { return GetString("Runtime_HostTypePropertyGettingFailed"); } } @@ -156,7 +156,7 @@ public static string Runtime_HostTypePropertyGettingFailed /// /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." /// - public static string Runtime_HostTypePropertySettingFailed + internal static string Runtime_HostTypePropertySettingFailed { get { return GetString("Runtime_HostTypePropertySettingFailed"); } } @@ -164,7 +164,7 @@ public static string Runtime_HostTypePropertySettingFailed /// /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectField + internal static string Runtime_InvalidThisContextForHostObjectField { get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } } @@ -172,7 +172,7 @@ public static string Runtime_InvalidThisContextForHostObjectField /// /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectMethod + internal static string Runtime_InvalidThisContextForHostObjectMethod { get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } } @@ -180,7 +180,7 @@ public static string Runtime_InvalidThisContextForHostObjectMethod /// /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." /// - public static string Runtime_InvalidThisContextForHostObjectProperty + internal static string Runtime_InvalidThisContextForHostObjectProperty { get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } } @@ -188,7 +188,7 @@ public static string Runtime_InvalidThisContextForHostObjectProperty /// /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." /// - public static string Runtime_JsEngineModeNotCompatibleWithNetCore + internal static string Runtime_JsEngineModeNotCompatibleWithNetCore { get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } } @@ -196,7 +196,7 @@ public static string Runtime_JsEngineModeNotCompatibleWithNetCore /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." /// - public static string Runtime_JsEnginesNotFound + internal static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -204,7 +204,7 @@ public static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." /// - public static string Runtime_SuitableConstructorOfHostTypeNotFound + internal static string Runtime_SuitableConstructorOfHostTypeNotFound { get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } } @@ -212,7 +212,7 @@ public static string Runtime_SuitableConstructorOfHostTypeNotFound /// /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." /// - public static string Runtime_SuitableMethodOfHostObjectNotFound + internal static string Runtime_SuitableMethodOfHostObjectNotFound { get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } } diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index a519e7b..81ce790 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -16,7 +16,7 @@ namespace MsieJavaScriptEngine.Resources /// /// A strongly-typed resource class, for looking up localized strings, etc. /// - public class NetFrameworkStrings + internal class NetFrameworkStrings { private static Lazy _resourceManager = new Lazy(() => new ResourceManager( @@ -33,7 +33,7 @@ public class NetFrameworkStrings /// /// Returns a cached ResourceManager instance used by this class /// - public static ResourceManager ResourceManager + internal static ResourceManager ResourceManager { get { @@ -45,7 +45,7 @@ public static ResourceManager ResourceManager /// Overrides a current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class /// - public static CultureInfo Culture + internal static CultureInfo Culture { get { @@ -60,7 +60,7 @@ public static CultureInfo Culture /// /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." /// - public static string Runtime_ActiveScriptDispatcherNotInitialized + internal static string Runtime_ActiveScriptDispatcherNotInitialized { get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } } @@ -68,7 +68,7 @@ public static string Runtime_ActiveScriptDispatcherNotInitialized /// /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." /// - public static string Runtime_ActiveScriptLanguageVersionSelectionFailed + internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed { get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } } @@ -76,7 +76,7 @@ public static string Runtime_ActiveScriptLanguageVersionSelectionFailed /// /// Looks up a localized string similar to "Item with name '{0}' not found." /// - public static string Runtime_ItemNotFound + internal static string Runtime_ItemNotFound { get { return GetString("Runtime_ItemNotFound"); } } @@ -84,7 +84,7 @@ public static string Runtime_ItemNotFound /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." /// - public static string Runtime_JsEnginesNotFound + internal static string Runtime_JsEnginesNotFound { get { return GetString("Runtime_JsEnginesNotFound"); } } @@ -92,7 +92,7 @@ public static string Runtime_JsEnginesNotFound /// /// Looks up a localized string similar to "The variable with the name '{0}' does not exist." /// - public static string Runtime_VariableNotExist + internal static string Runtime_VariableNotExist { get { return GetString("Runtime_VariableNotExist"); } } diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index e64a885..2f1111b 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -#if NETSTANDARD1_3 || NET45 +#if NET45 || NETSTANDARD1_3 using System.Runtime.ExceptionServices; #endif using System.Threading; @@ -157,7 +157,7 @@ private object InnnerInvoke(Func del) Exception exception = task.Exception; if (exception != null) { -#if NETSTANDARD1_3 || NET45 +#if NET45 || NETSTANDARD1_3 ExceptionDispatchInfo.Capture(exception).Throw(); #elif NET40 exception.PreserveStackTrace(); diff --git a/src/MsieJavaScriptEngine.Net4/Utilities/DelegateExtensions.cs b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs similarity index 100% rename from src/MsieJavaScriptEngine.Net4/Utilities/DelegateExtensions.cs rename to src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs diff --git a/src/MsieJavaScriptEngine.Net4/Utilities/ExceptionExtensions.cs b/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs similarity index 98% rename from src/MsieJavaScriptEngine.Net4/Utilities/ExceptionExtensions.cs rename to src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs index 6338955..cb9cf01 100644 --- a/src/MsieJavaScriptEngine.Net4/Utilities/ExceptionExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs @@ -26,4 +26,4 @@ public static void PreserveStackTrace(this Exception source) } } } -#endif +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 93a4d16..fd1e9e5 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Globalization; using System.Linq; -#if NETSTANDARD1_3 || NET45 +#if NET45 || NETSTANDARD1_3 using System.Reflection; #endif using OriginalTypeConverter = System.ComponentModel.TypeConverter; diff --git a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs index cbe3353..dbc9d3a 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs @@ -8,7 +8,7 @@ namespace MsieJavaScriptEngine.Utilities /// /// Type extensions /// - internal static class TypeExtensions + public static class TypeExtensions { /// /// Gets a underlying type code of the specified @@ -17,6 +17,11 @@ internal static class TypeExtensions /// The code of the underlying type public static TypeCode GetTypeCode(this Type source) { + if (source == null) + { + throw new ArgumentNullException("source"); + } + TypeCode typeCode; #if NETSTANDARD1_3 diff --git a/src/MsieJavaScriptEngine.Net4/Utilities/TypeInfo.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs similarity index 98% rename from src/MsieJavaScriptEngine.Net4/Utilities/TypeInfo.cs rename to src/MsieJavaScriptEngine/Utilities/TypeInfo.cs index c6e04d5..7c5737b 100644 --- a/src/MsieJavaScriptEngine.Net4/Utilities/TypeInfo.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs @@ -9,7 +9,7 @@ namespace MsieJavaScriptEngine.Utilities /// enumeration types, type parameters, generic type definitions, and open /// or closed constructed generic types. /// - internal class TypeInfo + public class TypeInfo { /// /// Target type diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs index 74103f1..f490b23 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs @@ -4,7 +4,7 @@ namespace MsieJavaScriptEngine.Utilities { - internal static class TypeInfoExtensions + public static class TypeInfoExtensions { public static bool IsInstanceOfType(this TypeInfo source, object o) { diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj b/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj deleted file mode 100644 index 2e088d1..0000000 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/MsieJavaScriptEngine.Test.Auto.Net40.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Debug - AnyCPU - {A4874C43-2097-4FDB-882A-0D74E5508BBD} - Library - Properties - MsieJavaScriptEngine.Test.Auto - MsieJavaScriptEngine.Test.Auto - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} - MsieJavaScriptEngine.Test.Common.Net40 - - - - - CommonTests.cs - - - Es5Tests.cs - - - InteropTests.cs - - - AssemblyInfo.cs - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.Auto.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 30630d8..ff7ea04 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - netcoreapp1.0;net451 + net40;net451;netcoreapp1.0 1.0.8 Library true @@ -19,15 +19,11 @@ - - - - - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj deleted file mode 100644 index aa57811..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/MsieJavaScriptEngine.Test.ChakraActiveScript.Net40.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Debug - AnyCPU - {21EA96CC-71E2-4CDD-B95A-C75EBD4AF2FA} - Library - Properties - MsieJavaScriptEngine.Test.ChakraActiveScript - MsieJavaScriptEngine.Test.ChakraActiveScript - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} - MsieJavaScriptEngine.Test.Common.Net40 - - - - - CommonTests.cs - - - Es5Tests.cs - - - InteropTests.cs - - - AssemblyInfo.cs - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 93afdc1..2cc6aee 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - net451 + net40;net451 Library true @@ -18,12 +18,11 @@ - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj deleted file mode 100644 index beab245..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net40.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Debug - AnyCPU - {16DBAC89-4FFB-40AC-B437-FE5C8D6B6731} - Library - Properties - MsieJavaScriptEngine.Test.ChakraEdgeJsRt - MsieJavaScriptEngine.Test.ChakraEdgeJsRt - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} - MsieJavaScriptEngine.Test.Common.Net40 - - - - - CommonTests.cs - - - Es5Tests.cs - - - InteropTests.cs - - - AssemblyInfo.cs - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 1089ce2..5ba70f0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -102,9 +102,9 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() var b = 15; foo(a, b);"; - string targetOutputPattern = @"ReferenceError: 'bar' is (un|not )defined\n" + + string targetOutputPattern = @"^ReferenceError: 'bar' is (un|not )defined\n" + @" at foo \(functions.js:4:3\)\n" + - @" at Global code \(functions.js:11:1\)" + @" at Global code \(functions.js:11:1\)$" ; JsException exception = null; diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 30630d8..ff7ea04 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - netcoreapp1.0;net451 + net40;net451;netcoreapp1.0 1.0.8 Library true @@ -19,15 +19,11 @@ - - - - - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj deleted file mode 100644 index a4e6381..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net40.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Debug - AnyCPU - {7064E0DB-0B73-4534-84D0-1C96DA7E5AD1} - Library - Properties - MsieJavaScriptEngine.Test.ChakraIeJsRt - MsieJavaScriptEngine.Test.ChakraIeJsRt - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} - MsieJavaScriptEngine.Test.Common.Net40 - - - - - CommonTests.cs - - - Es5Tests.cs - - - InteropTests.cs - - - AssemblyInfo.cs - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 30630d8..ff7ea04 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - netcoreapp1.0;net451 + net40;net451;netcoreapp1.0 1.0.8 Library true @@ -19,15 +19,11 @@ - - - - - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj b/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj deleted file mode 100644 index 63167da..0000000 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/MsieJavaScriptEngine.Test.Classic.Net40.csproj +++ /dev/null @@ -1,89 +0,0 @@ - - - - - Debug - AnyCPU - {50453B82-ACBF-4E25-9582-1113F274D53E} - Library - Properties - MsieJavaScriptEngine.Test.Classic - MsieJavaScriptEngine.Test.Classic - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - {a4085b9e-a5d3-4749-bd07-6d1eb7c23820} - MsieJavaScriptEngine.Test.Common.Net40 - - - - - CommonTests.cs - - - Es5Tests.cs - - - InteropTests.cs - - - AssemblyInfo.cs - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.Classic.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 93afdc1..2cc6aee 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - net451 + net40;net451 Library true @@ -18,12 +18,11 @@ - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj b/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj deleted file mode 100644 index c833754..0000000 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/MsieJavaScriptEngine.Test.Common.Net40.csproj +++ /dev/null @@ -1,142 +0,0 @@ - - - - - Debug - AnyCPU - {A4085B9E-A5D3-4749-BD07-6D1EB7C23820} - Library - Properties - MsieJavaScriptEngine.Test.Common - MsieJavaScriptEngine.Test.Common - v4.5 - 512 - ..\..\ - true - - - true - full - false - bin\Debug\ - TRACE;DEBUG;NET40 - prompt - 4 - false - - - pdbonly - true - bin\Release\ - TRACE;NET40 - prompt - 4 - false - - - - ..\..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll - True - - - - - - - - {d672bc49-c454-4975-bd25-a555b9bdd793} - MsieJavaScriptEngine.Net40 - - - - - CommonTestsBase.cs - - - Es5TestsBase.cs - - - FileSystemTestsBase.cs - - - InteropTestsBase.cs - - - Animals\AnimalTrainer.cs - - - Animals\Cat.cs - - - Animals\Dog.cs - - - Animals\IAnimal.cs - - - Interop\Base64Encoder.cs - - - Interop\BundleTable.cs - - - Interop\Date.cs - - - Interop\FileManager.cs - - - Interop\Person.cs - - - Interop\Point3D.cs - - - Interop\PredefinedStrings.cs - - - Interop\Product.cs - - - Interop\SimpleSingleton.cs - - - Interop\Temperature.cs - - - AssemblyInfo.cs - - - ValidationTests.cs - - - - - Resources\cube.js - - - Resources\power.js - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config b/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config deleted file mode 100644 index 967e817..0000000 --- a/test/MsieJavaScriptEngine.Test.Common.Net4/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index eb7e711..503a4c6 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -4,6 +4,10 @@ using System.Threading; using NUnit.Framework; +#if NET40 + +using MsieJavaScriptEngine.Utilities; +#endif namespace MsieJavaScriptEngine.Test.Common { diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index 56fbe27..942f22c 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -1,4 +1,4 @@ -#if NETCOREAPP1_0 || NET451 +#if NET451 || NETCOREAPP1_0 using Microsoft.Extensions.PlatformAbstractions; #elif NET40 using System; @@ -24,7 +24,7 @@ public abstract class FileSystemTestsBase protected FileSystemTestsBase() { -#if NETCOREAPP1_0 || NET451 +#if NET451 || NETCOREAPP1_0 var appEnv = PlatformServices.Default.Application; _baseDirectoryPath = Path.Combine(appEnv.ApplicationBasePath, "../../../../"); #elif NET40 diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 85924ce..3fd1c70 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ 3.0.0 alpha2 - netcoreapp1.0;net451 + net40;net451;netcoreapp1.0 1.0.8 Library true @@ -19,23 +19,21 @@ + + - + + + + + - - - - - - - - diff --git a/test/MsieJavaScriptEngine.Test.Net4.nunit b/test/MsieJavaScriptEngine.Test.Net4.nunit index 090eb43..795f9c4 100644 --- a/test/MsieJavaScriptEngine.Test.Net4.nunit +++ b/test/MsieJavaScriptEngine.Test.Net4.nunit @@ -1,18 +1,18 @@  - - - - - - + + + + + + - - - - - - + + + + + + \ No newline at end of file From f4b00e7946b0f48395e5ab99ba2a3ad27bf82410 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 6 Dec 2017 18:05:47 +0300 Subject: [PATCH 110/238] Now a new mechanism is used for build NuGet packages --- NuGet/MsieJavaScriptEngine.nuspec | 36 ---------------- NuGet/build-package.cmd | 39 ------------------ {tools => build}/Key.snk | Bin build/common.props | 5 +++ .../MsieJavaScriptEngine.csproj | 37 +++++++++++++---- .../Properties/AssemblyInfo.cs | 21 ---------- .../MsieJavaScriptEngine}/readme.txt | 0 .../MsieJavaScriptEngine.Test.Auto.csproj | 15 +++---- .../Properties/AssemblyInfo.cs | 21 ---------- ...criptEngine.Test.ChakraActiveScript.csproj | 15 +++---- .../Properties/AssemblyInfo.cs | 17 -------- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 15 +++---- .../Properties/AssemblyInfo.cs | 21 ---------- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 15 +++---- .../Properties/AssemblyInfo.cs | 21 ---------- .../MsieJavaScriptEngine.Test.Classic.csproj | 15 +++---- .../Properties/AssemblyInfo.cs | 17 -------- .../MsieJavaScriptEngine.Test.Common.csproj | 17 +++----- .../Properties/AssemblyInfo.cs | 21 ---------- 19 files changed, 65 insertions(+), 283 deletions(-) delete mode 100644 NuGet/MsieJavaScriptEngine.nuspec delete mode 100644 NuGet/build-package.cmd rename {tools => build}/Key.snk (100%) create mode 100644 build/common.props delete mode 100644 src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs rename {NuGet => src/MsieJavaScriptEngine}/readme.txt (100%) delete mode 100644 test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs delete mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs diff --git a/NuGet/MsieJavaScriptEngine.nuspec b/NuGet/MsieJavaScriptEngine.nuspec deleted file mode 100644 index aa14928..0000000 --- a/NuGet/MsieJavaScriptEngine.nuspec +++ /dev/null @@ -1,36 +0,0 @@ - - - - MsieJavaScriptEngine - 3.0.0-alpha2 - MSIE JavaScript Engine for .NET - Andrey Taritsyn - Andrey Taritsyn - http://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/LICENSE.md - http://github.com/Taritsyn/MsieJavaScriptEngine - http://i.imgur.com/cbiHK.png - false - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). - Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object. - Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru - en-US - JavaScript ECMAScript MSIE IE Edge Chakra - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/NuGet/build-package.cmd b/NuGet/build-package.cmd deleted file mode 100644 index 792f039..0000000 --- a/NuGet/build-package.cmd +++ /dev/null @@ -1,39 +0,0 @@ -set project_name=MsieJavaScriptEngine -set project_source_dir=..\src\%project_name% -set project_bin_dir=%project_source_dir%\bin\Release -set licenses_dir=..\Licenses -set dotnet_cli="%ProgramFiles%\dotnet\dotnet.exe" -set nuget_package_manager=..\.nuget\nuget.exe - -rmdir lib /Q/S - -del sass-and-coffee-license.txt /Q/S -del chakra-host-license.txt /Q/S -del jsrt-dotnet-license.txt /Q/S -del cross-browser-split-license.txt /Q/S -del bundler-and-minifier-license.txt /Q/S - -%dotnet_cli% restore "%project_source_dir%" - -%dotnet_cli% build "%project_source_dir%" --framework net40-client --configuration Release --no-dependencies --no-incremental -xcopy "%project_bin_dir%\net40-client\%project_name%.dll" lib\net40-client\ -xcopy "%project_bin_dir%\net40-client\%project_name%.xml" lib\net40-client\ -xcopy "%project_bin_dir%\net40-client\ru-ru\%project_name%.resources.dll" lib\net40-client\ru-ru\ - -%dotnet_cli% build "%project_source_dir%" --framework net45 --configuration Release --no-dependencies --no-incremental -xcopy "%project_bin_dir%\net45\%project_name%.dll" lib\net45\ -xcopy "%project_bin_dir%\net45\%project_name%.xml" lib\net45\ -xcopy "%project_bin_dir%\net45\ru-ru\%project_name%.resources.dll" lib\net45\ru-ru\ - -%dotnet_cli% build "%project_source_dir%" --framework netstandard1.3 --configuration Release --no-dependencies --no-incremental -xcopy "%project_bin_dir%\netstandard1.3\%project_name%.dll" lib\netstandard1.3\ -xcopy "%project_bin_dir%\netstandard1.3\%project_name%.xml" lib\netstandard1.3\ -xcopy "%project_bin_dir%\netstandard1.3\ru-ru\%project_name%.resources.dll" lib\netstandard1.3\ru-ru\ - -copy "%licenses_dir%\sass-and-coffee-license.txt" sass-and-coffee-license.txt /Y -copy "%licenses_dir%\chakra-host-license.txt" chakra-host-license.txt /Y -copy "%licenses_dir%\jsrt-dotnet-license.txt" jsrt-dotnet-license.txt /Y -copy "%licenses_dir%\cross-browser-split-license.txt" cross-browser-split-license.txt /Y -copy "%licenses_dir%\bundler-and-minifier-license.txt" bundler-and-minifier-license.txt /Y - -%nuget_package_manager% pack "%project_name%.nuspec" \ No newline at end of file diff --git a/tools/Key.snk b/build/Key.snk similarity index 100% rename from tools/Key.snk rename to build/Key.snk diff --git a/build/common.props b/build/common.props new file mode 100644 index 0000000..5ea37fc --- /dev/null +++ b/build/common.props @@ -0,0 +1,5 @@ + + + Copyright © 2012-2017 Andrey Taritsyn + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 3838478..1ee6978 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -1,29 +1,39 @@  + MSIE JavaScript Engine for .NET 3.0.0 alpha2 net40-client;net45;netstandard1.3 1.6.0 Library true - ../../tools/Key.snk + ../../build/Key.snk true true $(NoWarn);CS1591 true true - + $(Product) + Andrey Taritsyn + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). + https://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/LICENSE.md + false + https://github.com/Taritsyn/MsieJavaScriptEngine + http://i.imgur.com/cbiHK.png + https://github.com/Taritsyn/MsieJavaScriptEngine + git + JavaScript;ECMAScript;MSIE;IE;Edge;Chakra + Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object. + en-US + ../../nuget + true false false - false - false - false - false - false - false + + @@ -43,6 +53,17 @@ + + + readme.txt + true + + + / + true + + + + MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 alpha2 net40;net451;netcoreapp1.0 1.0.8 Library true - - false - false - false - false - false - false - false - false + false + + - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs deleted file mode 100644 index 16c370d..0000000 --- a/test/MsieJavaScriptEngine.Test.Auto/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Reflection; -#if !NETCOREAPP1_0 -using System.Runtime.InteropServices; -#endif - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Auto")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Auto Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -#if !NETCOREAPP1_0 -[assembly: ComVisible(false)] -[assembly: Guid("e9baa5d3-59fe-4c0f-82ee-d415ffe53903")] -#endif - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 2cc6aee..bf0530e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -1,24 +1,19 @@  + MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 alpha2 net40;net451 Library true - - false - false - false - false - false - false - false - false + false + + - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs deleted file mode 100644 index d3d47a6..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraActiveScript")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] -[assembly: Guid("34feac4f-a145-465e-aa36-0eceb5242dd4")] - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index ff7ea04..eb934c4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -1,25 +1,20 @@  + MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 alpha2 net40;net451;netcoreapp1.0 1.0.8 Library true - - false - false - false - false - false - false - false - false + false + + - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs deleted file mode 100644 index 369c59a..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Reflection; -#if !NETCOREAPP1_0 -using System.Runtime.InteropServices; -#endif - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraEdgeJsRt")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -#if !NETCOREAPP1_0 -[assembly: ComVisible(false)] -[assembly: Guid("ebd8a69f-5bb3-47ab-9a8d-b8f35035c278")] -#endif - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index ff7ea04..4db95b1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -1,25 +1,20 @@  + MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 alpha2 net40;net451;netcoreapp1.0 1.0.8 Library true - - false - false - false - false - false - false - false - false + false + + - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs deleted file mode 100644 index b448090..0000000 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Reflection; -#if !NETCOREAPP1_0 -using System.Runtime.InteropServices; -#endif - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.ChakraIeJsRt")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -#if !NETCOREAPP1_0 -[assembly: ComVisible(false)] -[assembly: Guid("2c54c249-206c-45f4-bd1b-6e67a07775af")] -#endif - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 2cc6aee..5b7afd2 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -1,24 +1,19 @@  + MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 alpha2 net40;net451 Library true - - false - false - false - false - false - false - false - false + false + + - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs deleted file mode 100644 index a695f69..0000000 --- a/test/MsieJavaScriptEngine.Test.Classic/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Reflection; -using System.Runtime.InteropServices; - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Classic")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Tests for Classic Mode")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -[assembly: ComVisible(false)] -[assembly: Guid("d0f98404-f422-4cab-82a7-6edfce1514d2")] - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 3fd1c70..76826e0 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -1,27 +1,22 @@  + MSIE JavaScript Engine: Common Tests 3.0.0 alpha2 net40;net451;netcoreapp1.0 1.0.8 Library true - - false - false - false - false - false - false - false - false + false + + - + @@ -35,7 +30,7 @@ - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs b/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs deleted file mode 100644 index 9850eb4..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Reflection; -#if !NETCOREAPP1_0 -using System.Runtime.InteropServices; -#endif - -[assembly: AssemblyTitle("MsieJavaScriptEngine.Test.Common")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MSIE JavaScript Engine: Common Tests")] -[assembly: AssemblyCopyright("Copyright © 2012-2017 Andrey Taritsyn")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -#if !NETCOREAPP1_0 -[assembly: ComVisible(false)] -[assembly: Guid("dad7743e-f458-4009-b96d-26ebcf5146f0")] -#endif - -[assembly: AssemblyVersion("3.0.0.0")] -[assembly: AssemblyFileVersion("3.0.0.0")] \ No newline at end of file From 65e2fb6d8c9f6d388ccea5be6ba21c7f2b4b540c Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 7 Dec 2017 19:22:56 +0300 Subject: [PATCH 111/238] Added support of .NET Standard 2.0 --- _exec.shade | 61 ----------------- build.cmd | 17 ----- build.ps1 | 67 ------------------- build.sh | 57 ---------------- build/common.props | 12 ++++ makefile.shade | 58 ---------------- run-dotnet-tests.cmd | 55 +++++++++++++++ run-net4-tests.cmd | 14 ++++ .../ActiveScript/ActiveScriptException.cs | 2 +- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../ActiveScript/ActiveScriptWrapper32.cs | 2 +- .../ActiveScript/ActiveScriptWrapper64.cs | 2 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 2 +- .../ChakraActiveScriptJsEngine.ScriptSite.cs | 2 +- .../ChakraActiveScriptJsEngine.cs | 2 +- .../ClassicActiveScriptJsEngine.ScriptSite.cs | 2 +- .../ClassicActiveScriptJsEngine.cs | 2 +- .../ActiveScript/Debugging/AppBreakFlags.cs | 2 +- .../ActiveScript/Debugging/BreakReason.cs | 2 +- .../Debugging/BreakResumeAction.cs | 2 +- .../ActiveScript/Debugging/BreakpointState.cs | 2 +- .../Debugging/DebugApplicationWrapper.cs | 2 +- .../ActiveScript/Debugging/DebugDocument.cs | 2 +- .../Debugging/DebugDocumentContext.cs | 2 +- .../ActiveScript/Debugging/DebugLineInfo.cs | 2 +- .../Debugging/DebugStackFrameDescriptor.cs | 2 +- .../Debugging/DocumentNameType.cs | 2 +- .../Debugging/ErrorResumeAction.cs | 2 +- .../Debugging/IActiveScriptDebug32.cs | 2 +- .../Debugging/IActiveScriptDebug64.cs | 2 +- .../Debugging/IActiveScriptErrorDebug.cs | 2 +- .../Debugging/IActiveScriptSiteDebug32.cs | 2 +- .../Debugging/IActiveScriptSiteDebug64.cs | 2 +- .../Debugging/IActiveScriptSiteDebugEx.cs | 2 +- .../Debugging/IApplicationDebugger.cs | 2 +- .../Debugging/IDebugApplication32.cs | 2 +- .../Debugging/IDebugApplication64.cs | 2 +- .../Debugging/IDebugApplicationNode.cs | 2 +- .../Debugging/IDebugApplicationThread.cs | 2 +- .../Debugging/IDebugAsyncOperation.cs | 2 +- .../Debugging/IDebugCodeContext.cs | 2 +- .../ActiveScript/Debugging/IDebugDocument.cs | 2 +- .../Debugging/IDebugDocumentContext.cs | 2 +- .../Debugging/IDebugDocumentInfo.cs | 2 +- .../Debugging/IDebugDocumentProvider.cs | 2 +- .../Debugging/IDebugDocumentText.cs | 2 +- .../ActiveScript/Debugging/IDebugProperty.cs | 2 +- .../Debugging/IDebugStackFrame.cs | 2 +- .../Debugging/IDebugStackFrameSniffer.cs | 2 +- .../Debugging/IDebugStackFrameSnifferEx32.cs | 2 +- .../Debugging/IDebugStackFrameSnifferEx64.cs | 2 +- .../Debugging/IDebugSyncOperation.cs | 2 +- .../Debugging/IDebugThreadCall32.cs | 2 +- .../Debugging/IDebugThreadCall64.cs | 2 +- .../Debugging/IEnumDebugApplicationNodes.cs | 2 +- .../Debugging/IEnumDebugCodeContexts.cs | 2 +- .../Debugging/IEnumDebugExpressionContexts.cs | 2 +- .../Debugging/IEnumDebugStackFrames.cs | 2 +- .../IEnumRemoteDebugApplicationThreads.cs | 2 +- .../Debugging/IProvideExpressionContexts.cs | 2 +- .../IRemoteDebugApplicationThread.cs | 2 +- .../Debugging/NullEnumDebugStackFrames.cs | 2 +- .../Debugging/ProcessDebugManagerWrapper.cs | 2 +- .../RawEnumCodeContextsOfPosition32.cs | 2 +- .../RawEnumCodeContextsOfPosition64.cs | 2 +- .../ActiveScript/Debugging/SourceTextAttrs.cs | 2 +- .../ActiveScript/Debugging/TextDocAttrs.cs | 2 +- .../ActiveScript/IActiveScript.cs | 2 +- .../ActiveScript/IActiveScriptError.cs | 2 +- .../IActiveScriptGarbageCollector.cs | 2 +- .../ActiveScript/IActiveScriptParse32.cs | 2 +- .../ActiveScript/IActiveScriptParse64.cs | 2 +- .../ActiveScript/IActiveScriptProperty.cs | 2 +- .../ActiveScript/IActiveScriptSite.cs | 2 +- .../IActiveScriptSiteInterruptPoll.cs | 2 +- .../ActiveScript/IActiveScriptWrapper.cs | 2 +- .../ActiveScript/JsErrorNumber.cs | 2 +- .../ActiveScript/ScriptGCType.cs | 2 +- .../ActiveScript/ScriptInfoFlags.cs | 2 +- .../ActiveScript/ScriptInterruptFlags.cs | 2 +- .../ActiveScript/ScriptItemFlags.cs | 2 +- .../ActiveScript/ScriptLanguageVersion.cs | 2 +- .../ActiveScript/ScriptProperty.cs | 2 +- .../ActiveScript/ScriptState.cs | 2 +- .../ActiveScript/ScriptTextFlags.cs | 2 +- .../ActiveScript/ScriptThreadId.cs | 2 +- .../ActiveScript/ScriptThreadState.cs | 2 +- .../ActiveScript/ScriptTypeLibFlags.cs | 4 +- src/MsieJavaScriptEngine/Constants/ClassId.cs | 2 +- .../Constants/ComErrorCode.cs | 2 +- .../Constants/SpecialMemberName.cs | 2 +- .../Helpers/ComHelpers.cs | 2 +- .../Helpers/ReflectionHelpers.cs | 2 +- .../Helpers/TypeMappingHelpers.cs | 2 +- src/MsieJavaScriptEngine/HostItemBase.cs | 2 +- src/MsieJavaScriptEngine/HostObject.cs | 2 +- src/MsieJavaScriptEngine/HostType.cs | 2 +- .../JsRt/ChakraJsRtJsEngineBase.cs | 10 +-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 16 ++--- .../JsRt/Edge/EdgeJsValue.cs | 4 +- .../JsRt/Edge/EdgeNativeMethods.cs | 2 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 18 ++--- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 4 +- .../JsRt/Ie/IeNativeMethods.cs | 2 +- .../MsieJavaScriptEngine.csproj | 11 +-- src/MsieJavaScriptEngine/MsieJsEngine.cs | 10 +-- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 8 +-- .../Utilities/CharExtensions.cs | 2 +- .../Utilities/StringBuilderExtensions.cs | 2 +- .../Utilities/TypeConverter.cs | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 +- .../FileSystemTestsBase.cs | 4 +- .../MsieJavaScriptEngine.Test.Common.csproj | 13 +++- 117 files changed, 238 insertions(+), 408 deletions(-) delete mode 100644 _exec.shade delete mode 100644 build.cmd delete mode 100644 build.ps1 delete mode 100644 build.sh delete mode 100644 makefile.shade create mode 100644 run-dotnet-tests.cmd create mode 100644 run-net4-tests.cmd diff --git a/_exec.shade b/_exec.shade deleted file mode 100644 index 7020d4e..0000000 --- a/_exec.shade +++ /dev/null @@ -1,61 +0,0 @@ -use namespace="System.Diagnostics" -use namespace="System.IO" - -default workingdir="${Directory.GetCurrentDirectory()}" -default commandline="" - -log info="Exec" -log info=" program: ${program}" -log info=" commandline: ${commandline}" -log info=" workingdir: ${workingdir}" - - -functions - @{ - bool __WriteExecOutputToLogger { get; set; } - } - -@{ - var processStartInfo = new ProcessStartInfo { - UseShellExecute = false, - WorkingDirectory = workingdir, - FileName = program, - Arguments = commandline - }; - - if (__WriteExecOutputToLogger) - { - processStartInfo.RedirectStandardError = true; - processStartInfo.RedirectStandardOutput = true; - } - - using (var process = Process.Start(processStartInfo)) - { - if (__WriteExecOutputToLogger) - { - process.EnableRaisingEvents = true; - process.BeginOutputReadLine(); - process.BeginErrorReadLine(); - - process.ErrorDataReceived += (sender, eventArgs) => - { - if (!string.IsNullOrWhiteSpace(eventArgs.Data)) - { - Log.Error(eventArgs.Data); - } - }; - - process.OutputDataReceived += (sender, eventArgs) => - { - Log.Info(eventArgs.Data); - }; - } - - process.WaitForExit(); - - if (process.ExitCode != 0) - { - throw new Exception(string.Format("Exit code {0} from {1}", process.ExitCode, program)); - } - } -} \ No newline at end of file diff --git a/build.cmd b/build.cmd deleted file mode 100644 index 7214fae..0000000 --- a/build.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@echo off - -setlocal -set ORIGINAL_CURRENT_DIR=%cd% -set KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 -set KOREBUILD_DOTNET_VERSION=1.1.5 - -cd %~dp0 - -set local_nuget_package_manager=.nuget\NuGet.exe -set package_dir=packages - -if not exist %package_dir%\NUnit.Console ( - %local_nuget_package_manager% install NUnit.Console -Version 3.7.0 -O %package_dir% -ExcludeVersion -NoCache -) - -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0build.ps1' %*; exit $LASTEXITCODE" \ No newline at end of file diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index 756a66a..0000000 --- a/build.ps1 +++ /dev/null @@ -1,67 +0,0 @@ -$ErrorActionPreference = "Stop" - -function DownloadWithRetry([string] $url, [string] $downloadLocation, [int] $retries) -{ - while($true) - { - try - { - Invoke-WebRequest $url -OutFile $downloadLocation - break - } - catch - { - $exceptionMessage = $_.Exception.Message - Write-Host "Failed to download '$url': $exceptionMessage" - if ($retries -gt 0) { - $retries-- - Write-Host "Waiting 10 seconds before retrying. Retries left: $retries" - Start-Sleep -Seconds 10 - - } - else - { - $exception = $_.Exception - throw $exception - } - } - } -} - -cd $PSScriptRoot - -$repoFolder = $PSScriptRoot -$env:REPO_FOLDER = $repoFolder - -$koreBuildZip="https://github.com/aspnet/KoreBuild/archive/02bd945d32558d24c1e5c6b74e37d44585ad9691.zip" -if ($env:KOREBUILD_ZIP) -{ - $koreBuildZip=$env:KOREBUILD_ZIP -} - -$buildFolder = ".build" -$buildFile="$buildFolder\KoreBuild.ps1" - -if (!(Test-Path $buildFolder)) { - Write-Host "Downloading KoreBuild from $koreBuildZip" - - $tempFolder=$env:TEMP + "\KoreBuild-" + [guid]::NewGuid() - New-Item -Path "$tempFolder" -Type directory | Out-Null - - $localZipFile="$tempFolder\korebuild.zip" - - DownloadWithRetry -url $koreBuildZip -downloadLocation $localZipFile -retries 6 - - Add-Type -AssemblyName System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::ExtractToDirectory($localZipFile, $tempFolder) - - New-Item -Path "$buildFolder" -Type directory | Out-Null - copy-item "$tempFolder\**\build\*" $buildFolder -Recurse - - # Cleanup - if (Test-Path $tempFolder) { - Remove-Item -Recurse -Force $tempFolder - } -} - -&"$buildFile" $args \ No newline at end of file diff --git a/build.sh b/build.sh deleted file mode 100644 index 724e1da..0000000 --- a/build.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env bash -ORIGINAL_CURRENT_DIR=%cd% -KOREBUILD_DOTNET_CHANNEL=rel-1.0.0 -KOREBUILD_DOTNET_VERSION=1.1.5 - -repoFolder="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -cd $repoFolder - -localNugetPackageManager=.nuget/NuGet.exe -packageDir=packages - -if test ! -d $packageDir/NUnit.Console; then - mono $localNugetPackageManager install NUnit.Console -Version 3.7.0 -O $packageDir% -ExcludeVersion -NoCache -fi - -koreBuildZip="https://github.com/aspnet/KoreBuild/archive/02bd945d32558d24c1e5c6b74e37d44585ad9691.zip" -if [ ! -z $KOREBUILD_ZIP ]; then - koreBuildZip=$KOREBUILD_ZIP -fi - -buildFolder=".build" -buildFile="$buildFolder/KoreBuild.sh" - -if test ! -d $buildFolder; then - echo "Downloading KoreBuild from $koreBuildZip" - - tempFolder="/tmp/KoreBuild-$(uuidgen)" - mkdir $tempFolder - - localZipFile="$tempFolder/korebuild.zip" - - retries=6 - until (wget -O $localZipFile $koreBuildZip 2>/dev/null || curl -o $localZipFile --location $koreBuildZip 2>/dev/null) - do - echo "Failed to download '$koreBuildZip'" - if [ "$retries" -le 0 ]; then - exit 1 - fi - retries=$((retries - 1)) - echo "Waiting 10 seconds before retrying. Retries left: $retries" - sleep 10s - done - - unzip -q -d $tempFolder $localZipFile - - mkdir $buildFolder - cp -r $tempFolder/**/build/** $buildFolder - - chmod +x $buildFile - - # Cleanup - if test ! -d $tempFolder; then - rm -rf $tempFolder - fi -fi - -$buildFile -r $repoFolder "$@" \ No newline at end of file diff --git a/build/common.props b/build/common.props index 5ea37fc..463918d 100644 --- a/build/common.props +++ b/build/common.props @@ -2,4 +2,16 @@ Copyright © 2012-2017 Andrey Taritsyn + + + $(DefineConstants);NETFULL + + + + $(DefineConstants);NETSTANDARD + + + + $(DefineConstants);NETCOREAPP + \ No newline at end of file diff --git a/makefile.shade b/makefile.shade deleted file mode 100644 index 90ce538..0000000 --- a/makefile.shade +++ /dev/null @@ -1,58 +0,0 @@ -use namespace="System" -use namespace="System.Collections" -use namespace="System.IO" -use import="Files" -use import="BuildEnv" -use import="Environment" - -default BASE_DIR="${Directory.GetCurrentDirectory()}" - -var AUTHORS="Andrey Taritsyn" - -use-standard-lifecycle - -#run-dotnet-tests description="Runs a unit tests for DotNet version" - @{ - string testDirPath = Path.Combine(BASE_DIR, "test"); - string[] testProjectNames = { - "MsieJavaScriptEngine.Test.Common", - "MsieJavaScriptEngine.Test.Auto", - "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", - "MsieJavaScriptEngine.Test.ChakraIeJsRt", - "MsieJavaScriptEngine.Test.ChakraActiveScript", - "MsieJavaScriptEngine.Test.Classic" - }; - - Log.Info("Run unit tests for DotNet version:"); - Log.Info(""); - - foreach (string testProjectName in testProjectNames) - { - Log.Info(string.Format('Tests for "{0}" project:', testProjectName)); - Log.Info(""); - - string testProjectDirPath = Path.Combine(testDirPath, testProjectName); - Exec("dotnet", "test", testProjectDirPath); - - Log.Info(""); - } - - Log.Info(""); - } - -#run-net4-tests description="Runs a unit tests for .NET 4.0 version" - @{ - string nunitConsolePath = "packages/NUnit.ConsoleRunner/tools/nunit3-console.exe"; - string testDirPath = Path.Combine(BASE_DIR, "test"); - - Log.Info("Run unit tests for .NET 4.0 version:"); - Log.Info(""); - Exec(nunitConsolePath, "MsieJavaScriptEngine.Test.Net4.nunit --process=Multiple --domain=Single --trace=Verbose", testDirPath); - Log.Info(""); - } - -macro name="Exec" program="string" commandline="string" - exec - -macro name="Exec" program="string" commandline="string" workingdir="string" - exec \ No newline at end of file diff --git a/run-dotnet-tests.cmd b/run-dotnet-tests.cmd new file mode 100644 index 0000000..38521bc --- /dev/null +++ b/run-dotnet-tests.cmd @@ -0,0 +1,55 @@ +@echo off +setlocal + +set common_test_project_name=MsieJavaScriptEngine.Test.Common +set auto_test_project_name=MsieJavaScriptEngine.Test.Auto +set chakra_edge_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraEdgeJsRt +set chakra_ie_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraIeJsRt +set chakra_activescript_test_project_name=MsieJavaScriptEngine.Test.ChakraActiveScript +set classic_test_project_name=MsieJavaScriptEngine.Test.Classic + +set common-args=--configuration Release --no-build --verbosity minimal +set test_dir_path=test +set common_test_project_file_path=%test_dir_path%\%common_test_project_name%\%common_test_project_name%.csproj +set auto_test_project_file_path=%test_dir_path%\%auto_test_project_name%\%auto_test_project_name%.csproj +set chakra_edge_jsrt_test_project_file_path=%test_dir_path%\%chakra_edge_jsrt_test_project_name%\%chakra_edge_jsrt_test_project_name%.csproj +set chakra_ie_jsrt_test_project_file_path=%test_dir_path%\%chakra_ie_jsrt_test_project_name%\%chakra_ie_jsrt_test_project_name%.csproj +set chakra_activescript_test_project_file_path=%test_dir_path%\%chakra_activescript_test_project_name%\%chakra_activescript_test_project_name%.csproj +set classic_test_project_file_path=%test_dir_path%\%classic_test_project_name%\%classic_test_project_name%.csproj + +@echo Run unit tests for DotNet version... +@echo. + +dotnet test --framework net451 %common-args% "%common_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp1.0 %common-args% "%common_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp2.0 %common-args% "%common_test_project_file_path%" +@echo. + +dotnet test --framework net451 %common-args% "%auto_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp1.0 %common-args% "%auto_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp2.0 %common-args% "%auto_test_project_file_path%" +@echo. + +dotnet test --framework net451 %common-args% "%chakra_edge_jsrt_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp1.0 %common-args% "%chakra_edge_jsrt_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp2.0 %common-args% "%chakra_edge_jsrt_test_project_file_path%" +@echo. + +dotnet test --framework net451 %common-args% "%chakra_ie_jsrt_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp1.0 %common-args% "%chakra_ie_jsrt_test_project_file_path%" +@echo. +dotnet test --framework netcoreapp2.0 %common-args% "%chakra_ie_jsrt_test_project_file_path%" +@echo. + +dotnet test --framework net451 %common-args% "%chakra_activescript_test_project_file_path%" +@echo. + +dotnet test --framework net451 %common-args% "%classic_test_project_file_path%" +@echo. \ No newline at end of file diff --git a/run-net4-tests.cmd b/run-net4-tests.cmd new file mode 100644 index 0000000..c770d3c --- /dev/null +++ b/run-net4-tests.cmd @@ -0,0 +1,14 @@ +@echo off +setlocal + +set local_nuget_package_manager=.nuget\NuGet.exe +set package_dir=packages +set nunit_console_path=%package_dir%\NUnit.ConsoleRunner\tools\nunit3-console.exe + +if not exist %package_dir%\NUnit.Console ( + %local_nuget_package_manager% install NUnit.Console -Version 3.7.0 -O %package_dir% -ExcludeVersion -NoCache +) + +@echo Run unit tests for .NET 4.0 version... +@echo. +%nunit_console_path% test\MsieJavaScriptEngine.Test.Net4.nunit --process=Multiple --domain=Single --work=test\ --noheader --trace=Off \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index 9a4e4a0..9595c90 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.Serialization; using System.Security.Permissions; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 2bc080a..1a108ec 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Globalization; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 85f2695..9163cad 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Collections.Generic; using System.Globalization; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 7460236..ce003b6 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index ccb7e0c..94d5bc4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index f26f111..3460313 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs index 70eabeb..5dea9b0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 4f9fe0e..5fea937 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using MsieJavaScriptEngine.Constants; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs index 2e977bd..f5dceb1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; using System.Text; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index b4c7876..0f10fd1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Reflection; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs index a26b060..e30918b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs index a2565e9..013b0e7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs index a255a35..44250fa 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs index 8adf26f..42d4959 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs index 278d1c6..88c499f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs index cafe953..91a8bc8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Collections.Generic; using System.Linq; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs index 56f0b36..074f684 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs index 82c6977..241f1a4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs index 774c1ef..1a7ad39 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs index 87f64b8..f5c8715 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs index d52d312..6931d88 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs index d21b932..04fc692 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs index d52cf58..396b073 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs index afbc4fe..e36b044 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs index 879ee87..2cb9b82 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs index 9266235..c72eff4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs index 4b907bf..4de0efe 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs index cc8d05b..48d0336 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs index 0f01c4e..6f688c4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs @@ -11,7 +11,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IDebugApplication32 // : IRemoteDebugApplication { -#if !NETSTANDARD1_3 +#if !NETSTANDARD #region IRemoteDebugApplication methods /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs index 3e08a75..c99d263 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs @@ -11,7 +11,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IDebugApplication64 // : IRemoteDebugApplication { -#if !NETSTANDARD1_3 +#if !NETSTANDARD #region IRemoteDebugApplication methods /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs index c5ada33..fd6799e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs index ffee788..bf601fe 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs index 388e559..769b129 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs index 715615a..cf56785 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs index b349056..c5a3509 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs index a82f2ac..cf6b76c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs index df89af4..7be288a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs index dc10466..ab663e5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs index 48b76a6..ce96b55 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs index 5ad6e76..9004d41 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs index 8003e0d..b515d8e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs index e26e30c..e0cfc15 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs index fa460c4..71f1db1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs index 7ca79a2..a6c83f7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs index d3089c6..1cc92d7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs index a52a417..ef392d7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs index cac3492..53bbf75 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs index 9bcf405..cc41adf 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs index c7c0b67..d3753f5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs index cac8c66..e698d46 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs index 2302d7a..d426411 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs index 9ed2c99..020c2c6 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs index 6130ec5..258411b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs index 4f1c6b5..33aa2a5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs index 1a2ad0e..2735f83 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs index 45a7fa5..c18cadb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Utilities; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs index 66fd6b2..cbd4391 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs index a8ff2e8..40f61a2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs index 0c5c7db..407bf59 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs index 5e3f82a..0cad8a1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs index 9402be4..ae0eed4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs index bfc347f..3e4d6c4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs index ea9b4e1..b58eeff 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs index 46b3843..2d0360f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs index c4cd4e4..2fa9bc3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs index 31cfa6f..f590a3e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index a0e1e84..d59bddd 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs index d4de39d..c195f10 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs index 8e560a1..d1e01f5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs index 58f54e3..e5afca7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs index 05bb7c2..5928dfc 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs index 303958e..bb97eea 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs index 39c6b5b..c653693 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs index 0d1cbba..5fe126f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs index c2bcccf..95d6cba 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs index 88a58ce..c274650 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs index 0959510..3e1a775 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs index 792841e..7f24c62 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs index c975157..23bb700 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs index bcffcf8..1567e9d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs index 07842af..ef91fcc 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; namespace MsieJavaScriptEngine.ActiveScript @@ -19,7 +19,7 @@ internal enum ScriptTypeLibFlags : uint /// /// Not documented /// - IsPersistent = 0x00000040, + IsPersistent = 0x00000040 } } #endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/ClassId.cs b/src/MsieJavaScriptEngine/Constants/ClassId.cs index 14ed70f..535df64 100644 --- a/src/MsieJavaScriptEngine/Constants/ClassId.cs +++ b/src/MsieJavaScriptEngine/Constants/ClassId.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs index 201ce5a..624c09f 100644 --- a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs +++ b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs index e1b7d78..4834591 100644 --- a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs +++ b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 9249af2..39d7ca1 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; #if NET45 using System.Reflection; diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index b254e74..3ecbcc7 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD1_3 +#if NETSTANDARD using System; using System.Collections.Generic; using System.Linq; diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index d7fc148..9d788fd 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Linq; diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index 87cf759..c457df1 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Globalization; using System.Linq; diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index b8aded1..be18771 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Globalization; using System.Linq; diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs index d634f2d..cca63a9 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System; using System.Globalization; using System.Linq; diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 3fd2a8b..b10ec16 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -1,5 +1,5 @@ using System; -#if NETSTANDARD1_3 +#if NETSTANDARD using System.Collections.Generic; using System.Runtime.InteropServices; #endif @@ -31,7 +31,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// Flag indicating whether debugging started /// private StatedFlag _debuggingStartedFlag; -#if NETSTANDARD1_3 +#if NETSTANDARD /// /// Set of external objects @@ -57,7 +57,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase protected ChakraJsRtJsEngineBase(JsEngineSettings settings) : base(settings) { -#if NETSTANDARD1_3 +#if NETSTANDARD _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback; #endif } @@ -129,7 +129,7 @@ protected void StartDebugging() } protected abstract void InnerStartDebugging(); -#if NETSTANDARD1_3 +#if NETSTANDARD private void ExternalObjectFinalizeCallback(IntPtr data) { @@ -162,7 +162,7 @@ private void ExternalObjectFinalizeCallback(IntPtr data) /// managed objects contained in fields of class protected virtual void Dispose(bool disposing) { -#if NETSTANDARD1_3 +#if NETSTANDARD if (disposing) { if (_externalObjects != null) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 1975289..13da8df 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1,10 +1,10 @@ using System; -#if NETSTANDARD1_3 +#if NETSTANDARD using System.Collections.Generic; #endif using System.Globalization; using System.Linq; -#if NETSTANDARD1_3 +#if NETSTANDARD using System.Reflection; using System.Runtime.InteropServices; #endif @@ -45,7 +45,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// Support synchronizer /// private static readonly object _supportSynchronizer = new object(); -#if NETSTANDARD1_3 +#if NETSTANDARD /// /// List of native function callbacks @@ -265,7 +265,7 @@ private EdgeJsValue MapToScriptType(object value) return EdgeJsValue.FromString((string)value); default: -#if NETSTANDARD1_3 +#if NETSTANDARD return FromObject(value); #else object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? @@ -320,7 +320,7 @@ private object MapToHostType(EdgeJsValue value) case JsValueType.Function: case JsValueType.Error: case JsValueType.Array: -#if NETSTANDARD1_3 +#if NETSTANDARD result = ToObject(value); #else processedValue = value.ConvertToObject(); @@ -353,7 +353,7 @@ private object[] MapToHostType(EdgeJsValue[] args) { return args.Select(MapToHostType).ToArray(); } -#if NETSTANDARD1_3 +#if NETSTANDARD private EdgeJsValue FromObject(object value) { @@ -1169,7 +1169,7 @@ public override void EmbedHostType(string itemName, Type type) { try { -#if NETSTANDARD1_3 +#if NETSTANDARD EdgeJsValue typeValue = CreateObjectFromType(type); #else EdgeJsValue typeValue = EdgeJsValue.FromObject(new HostType(type, _settings.EngineMode)); @@ -1227,7 +1227,7 @@ protected override void Dispose(bool disposing) } base.Dispose(disposing); -#if NETSTANDARD1_3 +#if NETSTANDARD if (disposing) { diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 47e6012..31f0140 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -304,7 +304,7 @@ public static EdgeJsValue FromString(string value) return reference; } -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// Creates a JavaScript value that is a projection of the passed in object @@ -611,7 +611,7 @@ public int ToInt32() return Marshal.PtrToStringUni(buffer, (int)length); } -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// Retrieves a object representation of an Object value diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index dcd83d2..aa8a1fa 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -149,7 +149,7 @@ internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRunti [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); -#if !NETSTANDARD1_3 +#if !NETSTANDARD [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 9d81092..50ac59f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1,10 +1,10 @@ using System; -#if NETSTANDARD1_3 +#if NETSTANDARD using System.Collections.Generic; #endif using System.Globalization; using System.Linq; -#if NETSTANDARD1_3 +#if NETSTANDARD using System.Reflection; using System.Runtime.InteropServices; #endif @@ -51,7 +51,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// Support synchronizer /// private static readonly object _supportSynchronizer = new object(); -#if NETSTANDARD1_3 +#if NETSTANDARD /// /// List of native function callbacks @@ -153,7 +153,7 @@ public static bool IsSupported() _isSupported = null; } } -#if NETSTANDARD1_3 +#if NETSTANDARD catch (TypeLoadException e) #else catch (EntryPointNotFoundException e) @@ -290,7 +290,7 @@ private IeJsValue MapToScriptType(object value) return IeJsValue.FromString((string)value); default: -#if NETSTANDARD1_3 +#if NETSTANDARD return FromObject(value); #else object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? @@ -345,7 +345,7 @@ private object MapToHostType(IeJsValue value) case JsValueType.Function: case JsValueType.Error: case JsValueType.Array: -#if NETSTANDARD1_3 +#if NETSTANDARD result = ToObject(value); #else processedValue = value.ConvertToObject(); @@ -378,7 +378,7 @@ private object[] MapToHostType(IeJsValue[] args) { return args.Select(MapToHostType).ToArray(); } -#if NETSTANDARD1_3 +#if NETSTANDARD private IeJsValue FromObject(object value) { @@ -1208,7 +1208,7 @@ public override void EmbedHostType(string itemName, Type type) { try { -#if NETSTANDARD1_3 +#if NETSTANDARD IeJsValue typeValue = CreateObjectFromType(type); #else IeJsValue typeValue = IeJsValue.FromObject(new HostType(type, _settings.EngineMode)); @@ -1266,7 +1266,7 @@ protected override void Dispose(bool disposing) } base.Dispose(disposing); -#if NETSTANDARD1_3 +#if NETSTANDARD if (disposing) { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index 37d182b..1d653f6 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -304,7 +304,7 @@ public static IeJsValue FromString(string value) return reference; } -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// Creates a JavaScript value that is a projection of the passed in object @@ -589,7 +589,7 @@ public double ToDouble() return Marshal.PtrToStringUni(buffer, (int)length); } -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// Retrieves a object representation of an Object value diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 88404ad..297b6fe 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -155,7 +155,7 @@ internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugAp [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); -#if !NETSTANDARD1_3 +#if !NETSTANDARD [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 1ee6978..8130986 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine for .NET 3.0.0 alpha2 - net40-client;net45;netstandard1.3 + net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library true @@ -24,7 +24,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object. + Added support of .NET Standard 2.0. en-US ../../nuget true @@ -45,12 +45,14 @@ + + + + - - @@ -61,6 +63,7 @@ / true + false diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index a5fcafd..27b6c87 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -2,7 +2,7 @@ using System.Reflection; using System.Text; -#if !NETSTANDARD1_3 +#if !NETSTANDARD using MsieJavaScriptEngine.ActiveScript; #endif using MsieJavaScriptEngine.Helpers; @@ -84,7 +84,7 @@ public MsieJsEngine(JsEngineSettings settings) { processedEngineMode = JsEngineMode.ChakraIeJsRt; } -#if !NETSTANDARD1_3 +#if !NETSTANDARD else if (ChakraActiveScriptJsEngine.IsSupported()) { processedEngineMode = JsEngineMode.ChakraActiveScript; @@ -97,7 +97,7 @@ public MsieJsEngine(JsEngineSettings settings) else { throw new JsEngineLoadException( -#if NETSTANDARD1_3 +#if NETSTANDARD NetCoreStrings.Runtime_JsEnginesNotFound #else NetFrameworkStrings.Runtime_JsEnginesNotFound @@ -164,7 +164,7 @@ public MsieJsEngine(JsEngineSettings settings) break; case JsEngineMode.ChakraActiveScript: -#if !NETSTANDARD1_3 +#if !NETSTANDARD if (previousMode != JsEngineMode.ChakraEdgeJsRt) { @@ -187,7 +187,7 @@ public MsieJsEngine(JsEngineSettings settings) string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif case JsEngineMode.Classic: -#if !NETSTANDARD1_3 +#if !NETSTANDARD _jsEngine = new ClassicActiveScriptJsEngine(processedSettings); break; diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 2f1111b..3c59084 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -#if NET45 || NETSTANDARD1_3 +#if NET45 || NETSTANDARD using System.Runtime.ExceptionServices; #endif using System.Threading; @@ -14,7 +14,7 @@ namespace MsieJavaScriptEngine /// internal sealed class ScriptDispatcher : IDisposable { -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// The stack size is sufficient to run the code of modern JS libraries in 32-bit process /// @@ -57,7 +57,7 @@ internal sealed class ScriptDispatcher : IDisposable /// public ScriptDispatcher() { -#if NETSTANDARD1_3 +#if NETSTANDARD _thread = new Thread(StartThread) #else int sufficientStackSize = Utils.Is64BitProcess() ? STACK_SIZE_64 : STACK_SIZE_32; @@ -157,7 +157,7 @@ private object InnnerInvoke(Func del) Exception exception = task.Exception; if (exception != null) { -#if NET45 || NETSTANDARD1_3 +#if NET45 || NETSTANDARD ExceptionDispatchInfo.Capture(exception).Throw(); #elif NET40 exception.PreserveStackTrace(); diff --git a/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs b/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs index a47458e..d94bf6e 100644 --- a/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD1_3 +#if !NETSTANDARD using System.Runtime.CompilerServices; namespace MsieJavaScriptEngine.Utilities diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs index 5ce4b50..98b9e84 100644 --- a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs @@ -54,7 +54,7 @@ public static StringBuilder AppendFormatLine(this StringBuilder source, string f return source.AppendLine(format.Replace("{{", "{").Replace("}}", "}")); } -#if !NETSTANDARD1_3 +#if !NETSTANDARD /// /// Removes the all trailing white-space characters from the current instance diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index fd1e9e5..f131718 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Globalization; using System.Linq; -#if NET45 || NETSTANDARD1_3 +#if NET45 || NETSTANDARD using System.Reflection; #endif using OriginalTypeConverter = System.ComponentModel.TypeConverter; diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index ffcd31a..683c081 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error, that occurred during finding the suitable method overload, that - receives numeric values and interfaces as parameters, of the host object. + Added support of .NET Standard 2.0. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index a51c0b0..99919b2 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 alpha2 - net40;net451;netcoreapp1.0 + net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library true @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index eb934c4..a4e7a08 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 alpha2 - net40;net451;netcoreapp1.0 + net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library true @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 4db95b1..06465ef 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 alpha2 - net40;net451;netcoreapp1.0 + net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library true @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index 942f22c..671cbe2 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -1,4 +1,4 @@ -#if NET451 || NETCOREAPP1_0 +#if NET451 || NETCOREAPP using Microsoft.Extensions.PlatformAbstractions; #elif NET40 using System; @@ -24,7 +24,7 @@ public abstract class FileSystemTestsBase protected FileSystemTestsBase() { -#if NET451 || NETCOREAPP1_0 +#if NET451 || NETCOREAPP var appEnv = PlatformServices.Default.Application; _baseDirectoryPath = Path.Combine(appEnv.ApplicationBasePath, "../../../../"); #elif NET40 diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 76826e0..25d8da1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 alpha2 - net40;net451;netcoreapp1.0 + net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library true @@ -23,12 +23,19 @@ - - + + + + + + + + + From 8652470b5887abe8dd703265da7292300ab9eb87 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 8 Dec 2017 12:21:53 +0300 Subject: [PATCH 112/238] Was made refactoring --- src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs | 2 +- src/MsieJavaScriptEngine/Utilities/TypeInfo.cs | 2 +- .../Utilities/TypeInfoExtensions.cs | 2 +- .../CommonTestsBase.cs | 11 ++++++----- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs index dbc9d3a..76039c0 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs @@ -8,7 +8,7 @@ namespace MsieJavaScriptEngine.Utilities /// /// Type extensions /// - public static class TypeExtensions + internal static class TypeExtensions { /// /// Gets a underlying type code of the specified diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs index 7c5737b..c6e04d5 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs @@ -9,7 +9,7 @@ namespace MsieJavaScriptEngine.Utilities /// enumeration types, type parameters, generic type definitions, and open /// or closed constructed generic types. /// - public class TypeInfo + internal class TypeInfo { /// /// Target type diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs index f490b23..74103f1 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs @@ -4,7 +4,7 @@ namespace MsieJavaScriptEngine.Utilities { - public static class TypeInfoExtensions + internal static class TypeInfoExtensions { public static bool IsInstanceOfType(this TypeInfo source, object o) { diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 503a4c6..47ba51c 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -4,10 +4,6 @@ using System.Threading; using NUnit.Framework; -#if NET40 - -using MsieJavaScriptEngine.Utilities; -#endif namespace MsieJavaScriptEngine.Test.Common { @@ -244,7 +240,12 @@ public virtual void ExecutionOfResourceByNameAndAssemblyIsCorrect() using (var jsEngine = CreateJsEngine()) { - jsEngine.ExecuteResource(resourceName, typeof(CommonTestsBase).GetTypeInfo().Assembly); + jsEngine.ExecuteResource(resourceName, typeof(CommonTestsBase) +#if !NET40 + .GetTypeInfo() +#endif + .Assembly + ); output = jsEngine.Evaluate(input); } From 4953fe1c60d89009b705e045744ac06b02858754 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 8 Dec 2017 19:44:06 +0300 Subject: [PATCH 113/238] Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 17 ++--- .../ChakraActiveScriptJsEngine.cs | 10 +++ .../ClassicActiveScriptJsEngine.cs | 12 ++++ .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 4 +- .../InteropTestsBase.cs | 62 +++++++++++++++++++ 6 files changed, 98 insertions(+), 10 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 9163cad..2ff8921 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -32,7 +32,7 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// /// List of host items /// - private readonly Dictionary _hostItems = new Dictionary(); + protected readonly Dictionary _hostItems = new Dictionary(); /// /// Last Active Script exception @@ -403,7 +403,7 @@ private object InnerGetVariableValue(string variableName) /// /// Name of variable /// Value of variable - private void InnerSetVariableValue(string variableName, object value) + protected void InnerSetVariableValue(string variableName, object value) { object[] args = { value }; @@ -425,6 +425,12 @@ private void InnerSetVariableValue(string variableName, object value) } } + /// + /// Removes a variable + /// + /// Name of variable + protected abstract void InnerRemoveVariable(string variableName); + private void InnerEmbedHostItem(string itemName, object value) { object oldValue = null; @@ -719,12 +725,7 @@ public override void RemoveVariable(string variableName) try { - InnerSetVariableValue(variableName, null); - - if (_hostItems.ContainsKey(variableName)) - { - _hostItems.Remove(variableName); - } + InnerRemoveVariable(variableName); } catch (ActiveScriptException e) { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 5fea937..7eee663 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -58,6 +58,16 @@ protected override void InitScriptContext() _interruptRequested = false; } + protected override void InnerRemoveVariable(string variableName) + { + InnerSetVariableValue(variableName, null); + + if (_hostItems.ContainsKey(variableName)) + { + _hostItems.Remove(variableName); + } + } + #region IInnerJsEngine implementation public override void Interrupt() diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index 0f10fd1..b13fe0a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -118,6 +118,18 @@ protected override ScriptSiteBase CreateScriptSite() return new ScriptSite(this); } + protected override void InnerRemoveVariable(string variableName) + { + if (_hostItems.ContainsKey(variableName)) + { + _hostItems.Remove(variableName); + } + else + { + InnerSetVariableValue(variableName, null); + } + } + #region IInnerJsEngine implementation public override void Interrupt() diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 8130986..aa5aeb7 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Added support of .NET Standard 2.0. + 1. Added support of .NET Standard 2.0; +2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 683c081..8eaa30e 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,9 @@ ============= RELEASE NOTES ============= - Added support of .NET Standard 2.0. + 1. Added support of .NET Standard 2.0; + 2. Fixed a error, that occurred in the `Classic` mode during removing the + embedded host objects and types. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 8d4a915..19f9377 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -593,6 +593,37 @@ public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCo #endregion + #region Removal + + [Test] + public virtual void RemovingOfEmbeddedInstanceOfCustomReferenceTypeIsCorrect() + { + // Arrange + var person = new Person("Vasya", "Pupkin"); + + // Act + Exception currentException = null; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("person", person); + + try + { + jsEngine.RemoveVariable("person"); + } + catch (Exception e) + { + currentException = e; + } + } + + // Assert + Assert.Null(currentException); + } + + #endregion + #endregion @@ -1080,6 +1111,37 @@ public virtual void EmbeddingOfCustomReferenceTypeWithMethodIsCorrect() #endregion + #region Removal + + [Test] + public virtual void RemovingOfEmbeddedCustomReferenceTypeIsCorrect() + { + // Arrange + Type personType = typeof(Person); + + // Act + Exception currentException = null; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("Person", personType); + + try + { + jsEngine.RemoveVariable("Person"); + } + catch (Exception e) + { + currentException = e; + } + } + + // Assert + Assert.Null(currentException); + } + + #endregion + #endregion } } \ No newline at end of file From da3660d39fcb5d885062acbb0a710a7b630a1790 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 10 Dec 2017 18:35:55 +0300 Subject: [PATCH 114/238] Removed a redundant code --- .../ActiveScript/ActiveScriptWrapper32.cs | 40 ++------- .../ActiveScript/ActiveScriptWrapper64.cs | 40 ++------- .../ActiveScript/ActiveScriptWrapperBase.cs | 11 +-- .../Debugging/IActiveScriptDebug32.cs | 4 +- .../Debugging/IActiveScriptDebug64.cs | 4 +- .../RawEnumCodeContextsOfPosition32.cs | 15 ---- .../RawEnumCodeContextsOfPosition64.cs | 15 ---- .../IActiveScriptProfilerCallback.cs | 82 ------------------- .../IActiveScriptProfilerHeapEnum.cs | 14 ---- .../Profiling/ProfilerEventMask.cs | 34 -------- .../Profiling/ProfilerScriptType.cs | 30 ------- .../JsRt/Edge/EdgeJsContext.cs | 71 ---------------- .../JsRt/Edge/EdgeNativeMethods.cs | 14 ---- .../JsRt/Ie/IeJsContext.cs | 70 ---------------- .../JsRt/Ie/IeNativeMethods.cs | 14 ---- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 3 +- 17 files changed, 29 insertions(+), 435 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerCallback.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerHeapEnum.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerEventMask.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerScriptType.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index ce003b6..d71e2fb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -4,7 +4,6 @@ using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; using MsieJavaScriptEngine.ActiveScript.Debugging; -using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.ActiveScript { @@ -14,24 +13,14 @@ namespace MsieJavaScriptEngine.ActiveScript internal sealed class ActiveScriptWrapper32 : ActiveScriptWrapperBase { /// - /// Pointer to an instance of 32-bit Active Script parser - /// - private IntPtr _pActiveScriptParse32; - - /// - /// Pointer to an instance of 32-bit Active Script debugger - /// - private IntPtr _pActiveScriptDebug32; - - /// - /// Pointer to an instance of 32-bit debug stack frame sniffer + /// Instance of 32-bit Active Script parser /// - private IntPtr _pDebugStackFrameSniffer32; + private IActiveScriptParse32 _activeScriptParse32; /// - /// Instance of 32-bit Active Script parser + /// Instance of 32-bit Active Script debugger /// - private IActiveScriptParse32 _activeScriptParse32; + private IActiveScriptDebug32 _activeScriptDebug32; /// /// Instance of 32-bit debug stack frame sniffer @@ -49,18 +38,11 @@ public ActiveScriptWrapper32(string clsid, ScriptLanguageVersion languageVersion bool enableDebugging) : base(clsid, languageVersion, enableDebugging) { - _pActiveScriptParse32 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptParse32 = (IActiveScriptParse32)_activeScript; - if (_enableDebugging) { - _pActiveScriptDebug32 = ComHelpers.QueryInterface(_pActiveScript); - _pDebugStackFrameSniffer32 = ComHelpers.QueryInterfaceNoThrow( - _pActiveScript); - if (_pDebugStackFrameSniffer32 != IntPtr.Zero) - { - _debugStackFrameSniffer32 = _activeScript as IDebugStackFrameSnifferEx32; - } + _activeScriptDebug32 = (IActiveScriptDebug32)_activeScript; + _debugStackFrameSniffer32 = _activeScript as IDebugStackFrameSnifferEx32; } } @@ -70,9 +52,8 @@ public ActiveScriptWrapper32(string clsid, ScriptLanguageVersion languageVersion protected override uint InnerEnumCodeContextsOfPosition(UIntPtr sourceContext, uint offset, uint length, out IEnumDebugCodeContexts enumContexts) { - var del = ComHelpers.GetMethodDelegate(_pActiveScriptDebug32, 5); - uint result = del(_pActiveScriptDebug32, sourceContext.ToUInt32(), offset, length, - out enumContexts); + uint result = _activeScriptDebug32.EnumCodeContextsOfPosition(sourceContext.ToUInt32(), + offset, length, out enumContexts); return result; } @@ -125,12 +106,9 @@ public override void Dispose() if (_disposedFlag.Set()) { _debugStackFrameSniffer32 = null; + _activeScriptDebug32 = null; _activeScriptParse32 = null; - ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer32); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug32); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse32); - base.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index 94d5bc4..26fdf89 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -4,7 +4,6 @@ using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; using MsieJavaScriptEngine.ActiveScript.Debugging; -using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.ActiveScript { @@ -14,24 +13,14 @@ namespace MsieJavaScriptEngine.ActiveScript internal sealed class ActiveScriptWrapper64 : ActiveScriptWrapperBase { /// - /// Pointer to an instance of 64-bit Active Script parser - /// - private IntPtr _pActiveScriptParse64; - - /// - /// Pointer to an instance of 64-bit Active Script debugger - /// - private IntPtr _pActiveScriptDebug64; - - /// - /// Pointer to an instance of 64-bit debug stack frame sniffer + /// Instance of 64-bit Active Script parser /// - private IntPtr _pDebugStackFrameSniffer64; + private IActiveScriptParse64 _activeScriptParse64; /// - /// Instance of 64-bit Active Script parser + /// Instance of 64-bit Active Script debugger /// - private IActiveScriptParse64 _activeScriptParse64; + private IActiveScriptDebug64 _activeScriptDebug64; /// /// Instance of 64-bit debug stack frame sniffer @@ -49,18 +38,11 @@ public ActiveScriptWrapper64(string clsid, ScriptLanguageVersion languageVersion bool enableDebugging) : base(clsid, languageVersion, enableDebugging) { - _pActiveScriptParse64 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptParse64 = (IActiveScriptParse64)_activeScript; - if (_enableDebugging) { - _pActiveScriptDebug64 = ComHelpers.QueryInterface(_pActiveScript); - _pDebugStackFrameSniffer64 = ComHelpers.QueryInterfaceNoThrow( - _pActiveScript); - if (_pDebugStackFrameSniffer64 != IntPtr.Zero) - { - _debugStackFrameSniffer64 = _activeScript as IDebugStackFrameSnifferEx64; - } + _activeScriptDebug64 = (IActiveScriptDebug64)_activeScript; + _debugStackFrameSniffer64 = _activeScript as IDebugStackFrameSnifferEx64; } } @@ -70,9 +52,8 @@ public ActiveScriptWrapper64(string clsid, ScriptLanguageVersion languageVersion protected override uint InnerEnumCodeContextsOfPosition(UIntPtr sourceContext, uint offset, uint length, out IEnumDebugCodeContexts enumContexts) { - var del = ComHelpers.GetMethodDelegate(_pActiveScriptDebug64,5); - uint result = del(_pActiveScriptDebug64, sourceContext.ToUInt64(), offset, length, - out enumContexts); + uint result = _activeScriptDebug64.EnumCodeContextsOfPosition(sourceContext.ToUInt64(), + offset, length, out enumContexts); return result; } @@ -125,12 +106,9 @@ public override void Dispose() if (_disposedFlag.Set()) { _debugStackFrameSniffer64 = null; + _activeScriptDebug64 = null; _activeScriptParse64 = null; - ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer64); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug64); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse64); - base.Dispose(); } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 3460313..691af2d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -25,12 +25,7 @@ internal abstract class ActiveScriptWrapperBase : IActiveScriptWrapper /// /// Pointer to an instance of Active Script engine /// - protected IntPtr _pActiveScript; - - /// - /// Pointer to an instance of Active Script garbage collector - /// - private IntPtr _pActiveScriptGarbageCollector; + private IntPtr _pActiveScript; /// /// Instance of Active Script engine @@ -60,9 +55,6 @@ protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVe _enableDebugging = enableDebugging; _pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); - _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow( - _pActiveScript); - _activeScript = (IActiveScript)Marshal.GetObjectForIUnknown(_pActiveScript); _activeScriptGarbageCollector = _activeScript as IActiveScriptGarbageCollector; @@ -241,7 +233,6 @@ public virtual void Dispose() { _activeScriptGarbageCollector = null; - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptGarbageCollector); ComHelpers.ReleaseAndEmpty(ref _pActiveScript); if (_activeScript != null) diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs index 04fc692..25bddc8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs @@ -53,7 +53,9 @@ [In] [Out] ref IntPtr pAttrs /// Character offset relative to start of script text /// Number of characters in this context /// An enumerator of the code contexts in the specified range - void EnumCodeContextsOfPosition( + /// The method returns an HRESULT + [PreserveSig] + uint EnumCodeContextsOfPosition( [In] uint sourceContext, [In] uint offset, [In] uint length, diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs index 396b073..39cbcd4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs @@ -53,7 +53,9 @@ [In] [Out] ref IntPtr pAttrs /// Character offset relative to start of script text /// Number of characters in this context /// An enumerator of the code contexts in the specified range - void EnumCodeContextsOfPosition( + /// The method returns an HRESULT + [PreserveSig] + uint EnumCodeContextsOfPosition( [In] ulong sourceContext, [In] uint offset, [In] uint length, diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs deleted file mode 100644 index cbd4391..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition32.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !NETSTANDARD -using System; -using System.Runtime.InteropServices; - -namespace MsieJavaScriptEngine.ActiveScript.Debugging -{ - internal delegate uint RawEnumCodeContextsOfPosition32( - [In] IntPtr pThis, - [In] uint sourceContext, - [In] uint offset, - [In] uint length, - [Out] [MarshalAs(UnmanagedType.Interface)] out IEnumDebugCodeContexts enumContexts - ); -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs deleted file mode 100644 index 40f61a2..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/RawEnumCodeContextsOfPosition64.cs +++ /dev/null @@ -1,15 +0,0 @@ -#if !NETSTANDARD -using System; -using System.Runtime.InteropServices; - -namespace MsieJavaScriptEngine.ActiveScript.Debugging -{ - internal delegate uint RawEnumCodeContextsOfPosition64( - [In] IntPtr pThis, - [In] ulong sourceContext, - [In] uint offset, - [In] uint length, - [Out] [MarshalAs(UnmanagedType.Interface)] out IEnumDebugCodeContexts enumContexts - ); -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerCallback.cs b/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerCallback.cs deleted file mode 100644 index b7ab7c9..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerCallback.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace MsieJavaScriptEngine.ActiveScript.Profiling -{ - /// - /// Provides methods that are used by the scripting engine to notify a profiler object when events occur. - /// This interface is implemented by the profiler object. - /// - [Guid("740eca23-7d9d-42e5-ba9d-f8b24b1c7a9b")] - [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] - internal interface IActiveScriptProfilerCallback - { - /// - /// Called to initialize the profiler object whenever profiling is started on a scripting engine - /// - /// The context provided when profiling was started - void Initialize( - uint context - ); - - /// - /// Called to free and release the profiler object whenever profiling is stopped on a scripting - /// engine - /// The reason for shutting down - void Shutdown( - uint reason - ); - - /// - /// Notifies the profiler object that the scripting engine compiled the script - /// - /// The unique ID of the script that was compiled - /// The type of the script that was compiled - /// The debug document context, if any - void ScriptCompiled( - int scriptId, - ProfilerScriptType type, - IntPtr debugDocumentContext - ); - - /// - /// Notifies the profiler object that the scripting engine encountered a function when compiling a - /// script - /// - /// The unique ID of the function - /// The unique ID of the script that the function is part of - /// The name of the function, or null for an anonymous function - /// The inferred name of the function, or null if the scripting - /// engine does not infer any name - /// The debug document context, if any - void FunctionCompiled( - int functionId, - int scriptId, - [MarshalAs(UnmanagedType.LPWStr)] string functionName, - [MarshalAs(UnmanagedType.LPWStr)] string functionNameHint, - IntPtr debugDocumentContext - ); - - /// - /// Notifies the profiler object that the scripting engine is about to execute a function call - /// that is not a call into the Document Object Model (DOM). - /// - /// The unique ID of the script that the function is part of - /// The unique ID of the function - void OnFunctionEnter( - int scriptId, - int functionId - ); - - /// - /// Notifies the profiler object that the scripting engine finished executing a function call - /// that is not a call into the DOM - /// - /// The unique ID of the script that the function is part of - /// The unique ID of the function - void OnFunctionExit( - int scriptId, - int functionId - ); - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerHeapEnum.cs b/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerHeapEnum.cs deleted file mode 100644 index b6198e4..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Profiling/IActiveScriptProfilerHeapEnum.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using System.Runtime.InteropServices; - -namespace MsieJavaScriptEngine.ActiveScript.Profiling -{ - /// - /// An iterator over the heap objects associated with a script engine, gathered by the - /// IActiveScriptProfilerControl3.EnumHeap method - /// - [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Name defined in COM.")] - [Guid("32E4694E-0D37-419B-B93D-FA20DED6E8EA")] - internal interface IActiveScriptProfilerHeapEnum - { } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerEventMask.cs b/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerEventMask.cs deleted file mode 100644 index 1e7abcf..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerEventMask.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace MsieJavaScriptEngine.ActiveScript.Profiling -{ - /// - /// Indicates the types of events that should be profiled - /// - internal enum ProfilerEventMask : uint - { - /// - /// Profiles functions that are defined in user-written script and dynamic code - /// - TraceScriptFunctionCall = 0x00000001, - - /// - /// Profiles native functions that are defined by the scripting engine - /// - TraceNativeFunctionCall = 0x00000002, - - /// - /// Profiles functions that call into the DOM - /// - TraceDomFunctionCall = 0x00000004, - - /// - /// Profiles all user-defined and scripting engine functions, excluding calls into - /// the Document Object Model (DOM) - /// - TraceAll = TraceScriptFunctionCall | TraceNativeFunctionCall, - - /// - /// Profiles all functions, including calls into the DOM - /// - TraceAllWithDom = TraceAll | TraceDomFunctionCall - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerScriptType.cs b/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerScriptType.cs deleted file mode 100644 index 0e2b469..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/Profiling/ProfilerScriptType.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace MsieJavaScriptEngine.ActiveScript.Profiling -{ - /// - /// Specifies the type of script - /// - internal enum ProfilerScriptType : uint - { - /// - /// Specifies user-written script code - /// - User, - - /// - /// Specifies script code that is generated dynamically during execution - /// - Dynamic, - - /// - /// Specifies the script type for native functions and objects that are defined by - /// the scripting engine - /// - Native, - - /// - /// Specifies a call into the Document Object Model (DOM) of Internet Explorer - /// (for example, a call to the document.getElementById method) - /// - Dom - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index 0205468..eed4ca3 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -1,7 +1,5 @@ using System; -using MsieJavaScriptEngine.ActiveScript.Profiling; - namespace MsieJavaScriptEngine.JsRt.Edge { /// @@ -81,23 +79,6 @@ public static bool HasException } } - /// - /// Gets a value indicating whether the heap of the current context is being enumerated - /// - /// - /// Requires an active script context. - /// - public static bool IsEnumeratingHeap - { - get - { - bool isEnumerating; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsIsEnumeratingHeap(out isEnumerating)); - - return isEnumerating; - } - } - /// /// Gets a runtime that the context belongs to /// @@ -368,58 +349,6 @@ public static void StartDebugging() EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStartDebugging()); } - /// - /// Starts profiling in the current context - /// - /// - /// Requires an active script context. - /// - /// The profiling callback to use - /// The profiling events to callback with - /// A context to pass to the profiling callback - public static void StartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context) - { - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStartProfiling(callback, eventMask, context)); - } - - /// - /// Stops profiling in the current context - /// - /// - /// - /// Will not return an error if profiling has not started. - /// - /// - /// Requires an active script context. - /// - /// - /// The reason for stopping profiling to pass to the profiler callback - public static void StopProfiling(int reason) - { - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsStopProfiling(reason)); - } - - /// - /// Enumerates a heap of the current context. - /// - /// - /// - /// While the heap is being enumerated, the current context cannot be removed, and all calls to - /// modify the state of the context will fail until the heap enumerator is released. - /// - /// - /// Requires an active script context. - /// - /// - /// A heap enumerator - public static IActiveScriptProfilerHeapEnum EnumerateHeap() - { - IActiveScriptProfilerHeapEnum enumerator; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsEnumerateHeap(out enumerator)); - - return enumerator; - } - /// /// Adds a reference to a script context /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index aa8a1fa..275909e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -1,7 +1,6 @@ using System; using System.Runtime.InteropServices; -using MsieJavaScriptEngine.ActiveScript.Profiling; using MsieJavaScriptEngine.Constants; namespace MsieJavaScriptEngine.JsRt.Edge @@ -291,18 +290,5 @@ internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeF [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, - ProfilerEventMask eventMask, int context); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStopProfiling(int reason); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 2d08718..3544d14 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -1,7 +1,6 @@ using System; using MsieJavaScriptEngine.ActiveScript.Debugging; -using MsieJavaScriptEngine.ActiveScript.Profiling; using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.JsRt.Ie @@ -83,23 +82,6 @@ public static bool HasException } } - /// - /// Gets a value indicating whether the heap of the current context is being enumerated - /// - /// - /// Requires an active script context. - /// - public static bool IsEnumeratingHeap - { - get - { - bool isEnumerating; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsIsEnumeratingHeap(out isEnumerating)); - - return isEnumerating; - } - } - /// /// Gets a runtime that the context belongs to /// @@ -386,58 +368,6 @@ public static void StartDebugging(IDebugApplication32 debugApplication) IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication)); } - /// - /// Starts profiling in the current context - /// - /// - /// Requires an active script context. - /// - /// The profiling callback to use - /// The profiling events to callback with - /// The context to pass to the profiling callback - public static void StartProfiling(IActiveScriptProfilerCallback callback, ProfilerEventMask eventMask, int context) - { - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartProfiling(callback, eventMask, context)); - } - - /// - /// Stops profiling in the current context - /// - /// - /// - /// Will not return an error if profiling has not started. - /// - /// - /// Requires an active script context. - /// - /// - /// The reason for stopping profiling to pass to the profiler callback - public static void StopProfiling(int reason) - { - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStopProfiling(reason)); - } - - /// - /// Enumerates a heap of the current context - /// - /// - /// - /// While the heap is being enumerated, the current context cannot be removed, and all calls to - /// modify the state of the context will fail until the heap enumerator is released. - /// - /// - /// Requires an active script context. - /// - /// - /// The heap enumerator - public static IActiveScriptProfilerHeapEnum EnumerateHeap() - { - IActiveScriptProfilerHeapEnum enumerator; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsEnumerateHeap(out enumerator)); - - return enumerator; - } - /// /// Adds a reference to a script context /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 297b6fe..a21cf0d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -2,7 +2,6 @@ using System.Runtime.InteropServices; using MsieJavaScriptEngine.ActiveScript.Debugging; -using MsieJavaScriptEngine.ActiveScript.Profiling; using MsieJavaScriptEngine.Constants; namespace MsieJavaScriptEngine.JsRt.Ie @@ -296,18 +295,5 @@ internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFun [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStartProfiling(IActiveScriptProfilerCallback callback, - ProfilerEventMask eventMask, int context); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsStopProfiling(int reason); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsEnumerateHeap(out IActiveScriptProfilerHeapEnum enumerator); - - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsIsEnumeratingHeap(out bool isEnumeratingHeap); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index aa5aeb7..d07a902 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,8 @@ git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Added support of .NET Standard 2.0; -2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types. +2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types; +3. Removed a redundant code. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8eaa30e..88bd7bb 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -23,7 +23,8 @@ ============= 1. Added support of .NET Standard 2.0; 2. Fixed a error, that occurred in the `Classic` mode during removing the - embedded host objects and types. + embedded host objects and types; + 3. Removed a redundant code. ============ PROJECT SITE From e720b6ee72efd1955b00cab87540e03f4040aa65 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 10 Dec 2017 20:30:16 +0300 Subject: [PATCH 115/238] In JsRT modes during calling of the `CollectGarbage` method is no longer performed blocking --- src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 3 ++- src/MsieJavaScriptEngine/readme.txt | 4 +++- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 13da8df..fcaeb05 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1191,7 +1191,7 @@ public override void Interrupt() public override void CollectGarbage() { - _dispatcher.Invoke(() => _jsRuntime.CollectGarbage()); + _jsRuntime.CollectGarbage(); } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 50ac59f..87a9896 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1230,7 +1230,7 @@ public override void Interrupt() public override void CollectGarbage() { - _dispatcher.Invoke(() => _jsRuntime.CollectGarbage()); + _jsRuntime.CollectGarbage(); } #endregion diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index d07a902..edf1bf6 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -26,7 +26,8 @@ JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Added support of .NET Standard 2.0; 2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types; -3. Removed a redundant code. +3. Removed a redundant code; +4. In JsRT modes during calling of the `CollectGarbage` method is no longer performed blocking. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 88bd7bb..dd7941a 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -24,7 +24,9 @@ 1. Added support of .NET Standard 2.0; 2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types; - 3. Removed a redundant code. + 3. Removed a redundant code; + 4. In JsRT modes during calling of the `CollectGarbage` method is no longer + performed blocking. ============ PROJECT SITE From ac9f76bc323ebc813e9dba5460daedc68a3ce68c Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 10 Dec 2017 21:07:48 +0300 Subject: [PATCH 116/238] Version 3.0.0 Alpha 3 --- CHANGELOG.md | 6 ++++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 7 ++----- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 9 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f3b605..2abfa37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Change log ========== +## v3.0.0 Alpha 3 - December 10, 2017 + * Added support of .NET Standard 2.0 + * Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types + * Removed a redundant code + * In JsRT modes during calling of the `CollectGarbage` method is no longer performed blocking + ## v3.0.0 Alpha 2 - November 17, 2017 * Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index edf1bf6..eaeefb2 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - alpha2 + alpha3 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library @@ -71,10 +71,7 @@ - + diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index dd7941a..b897510 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Alpha 2 + README file for MSIE JavaScript Engine for .NET v3.0.0 Alpha 3 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 99919b2..a06bff3 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - alpha2 + alpha3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index bf0530e..36eb1db 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - alpha2 + alpha3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index a4e7a08..93f97d3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - alpha2 + alpha3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 06465ef..5f40dec 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - alpha2 + alpha3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 5b7afd2..dcf418b 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - alpha2 + alpha3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 25d8da1..e1b6eca 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - alpha2 + alpha3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.8 Library From acb9f71e1dbd30fe544546d9c42036c242932afa Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 6 Mar 2018 16:36:20 +0300 Subject: [PATCH 117/238] 1. Format of the error messages was unified; 2. Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class; 3. In the `JsException` class was added two new properties: `Category` and `Description`; 4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; 5. In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack`; 6. `JsScriptInterruptedException` class was renamed to the `JsInterruptedException` class and now is inherited from the `JsRuntimeException` class; 7. `JsEngineLoadException` class now is inherited from the `JsEngineException` class; 8. `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails`. --- LICENSE.md | 2 +- build/common.props | 2 +- global.json | 2 +- .../ActiveScript/ActiveScriptException.cs | 52 +- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 212 ++---- .../ActiveScript/ActiveScriptJsEngineBase.cs | 184 +++-- .../ActiveScriptJsErrorHelpers.cs | 115 +++ .../ActiveScript/ActiveScriptWrapper32.cs | 5 +- .../ActiveScript/ActiveScriptWrapper64.cs | 5 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 9 +- .../ChakraActiveScriptJsEngine.ScriptSite.cs | 10 +- .../ChakraActiveScriptJsEngine.cs | 51 ++ .../ClassicActiveScriptJsEngine.ScriptSite.cs | 57 +- .../ClassicActiveScriptJsEngine.cs | 62 +- .../ActiveScript/JScriptRuntimeErrorNumber.cs | 183 +++++ .../ActiveScript/JScriptSyntaxErrorNumber.cs | 168 +++++ .../ActiveScript/JsErrorNumber.cs | 338 --------- src/MsieJavaScriptEngine/CommonRegExps.cs | 19 + .../Constants/JsErrorCategory.cs | 14 + .../Constants/JsErrorType.cs | 15 + .../Helpers/CallStackItem.cs | 66 ++ .../Helpers/JsErrorHelpers.cs | 480 +++++++++++-- .../Helpers/ValidationHelpers.cs | 18 +- src/MsieJavaScriptEngine/HostObject.cs | 2 +- .../JsCompilationException.cs | 77 ++ src/MsieJavaScriptEngine/JsEngineException.cs | 76 ++ .../JsEngineLoadException.cs | 20 +- src/MsieJavaScriptEngine/JsException.cs | 63 +- ...ruptedException.cs => JsFatalException.cs} | 42 +- .../JsInterruptedException.cs | 76 ++ .../JsRt/ChakraJsRtJsEngineBase.cs | 65 -- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 257 ++++--- .../JsRt/Edge/EdgeJsErrorHelpers.cs | 17 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 293 +++++--- .../JsRt/Ie/IeJsErrorHelpers.cs | 17 +- .../JsRt/JsEngineException.cs | 2 +- src/MsieJavaScriptEngine/JsRt/JsException.cs | 2 +- .../JsRuntimeException.cs | 106 +-- src/MsieJavaScriptEngine/JsScriptException.cs | 173 +++++ src/MsieJavaScriptEngine/JsUsageException.cs | 76 ++ .../MsieJavaScriptEngine.csproj | 12 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 662 +++++++++++++----- .../NotSupportedTypeException.cs | 47 -- .../Resources/CommonStrings.Designer.cs | 166 +++-- .../Resources/CommonStrings.resx | 88 ++- .../Resources/CommonStrings.ru-ru.resx | 88 ++- .../Resources/NetCoreStrings.Designer.cs | 32 +- .../Resources/NetCoreStrings.resx | 12 +- .../Resources/NetCoreStrings.ru-ru.resx | 12 +- .../Resources/NetFrameworkStrings.Designer.cs | 20 +- .../Resources/NetFrameworkStrings.resx | 10 +- .../Resources/NetFrameworkStrings.ru-ru.resx | 10 +- .../Utilities/DelegateExtensions.cs | 2 +- .../Utilities/ExceptionExtensions.cs | 2 +- .../Utilities/StringBuilderExtensions.cs | 6 +- .../Utilities/StringBuilderPool.cs | 142 ++++ .../Utilities/StringExtensions.cs | 98 +++ .../Utilities/TypeExtensions.cs | 4 +- .../Utilities/TypeInfoExtensions.cs | 2 +- .../Utilities/UniqueDocumentNameManager.cs | 8 +- src/MsieJavaScriptEngine/Utilities/Utils.cs | 30 +- src/MsieJavaScriptEngine/readme.txt | 25 +- .../CommonTests.cs | 5 +- .../CommonTests.cs | 303 ++++++-- .../CommonTests.cs | 279 +++++++- .../CommonTests.cs | 281 +++++++- .../CommonTests.cs | 305 ++++++-- .../CommonTestsBase.cs | 76 +- .../ValidationTests.cs | 67 +- 69 files changed, 4546 insertions(+), 1681 deletions(-) create mode 100644 src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs create mode 100644 src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs create mode 100644 src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs delete mode 100644 src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs create mode 100644 src/MsieJavaScriptEngine/CommonRegExps.cs create mode 100644 src/MsieJavaScriptEngine/Constants/JsErrorCategory.cs create mode 100644 src/MsieJavaScriptEngine/Constants/JsErrorType.cs create mode 100644 src/MsieJavaScriptEngine/Helpers/CallStackItem.cs create mode 100644 src/MsieJavaScriptEngine/JsCompilationException.cs create mode 100644 src/MsieJavaScriptEngine/JsEngineException.cs rename src/MsieJavaScriptEngine/{JsScriptInterruptedException.cs => JsFatalException.cs} (59%) create mode 100644 src/MsieJavaScriptEngine/JsInterruptedException.cs create mode 100644 src/MsieJavaScriptEngine/JsScriptException.cs create mode 100644 src/MsieJavaScriptEngine/JsUsageException.cs delete mode 100644 src/MsieJavaScriptEngine/NotSupportedTypeException.cs create mode 100644 src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs create mode 100644 src/MsieJavaScriptEngine/Utilities/StringExtensions.cs diff --git a/LICENSE.md b/LICENSE.md index 13fa65f..884ed24 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,4 +1,4 @@ - Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index 463918d..39fe967 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - Copyright © 2012-2017 Andrey Taritsyn + Copyright © 2012-2018 Andrey Taritsyn diff --git a/global.json b/global.json index 031f339..31017f2 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.0.3" + "version": "2.1.4" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index 9595c90..88faecf 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -13,6 +13,11 @@ public sealed class ActiveScriptException : Exception /// private int _errorCode; + /// + /// Type of the script error + /// + private string _type = string.Empty; + /// /// Category of error /// @@ -24,9 +29,9 @@ public sealed class ActiveScriptException : Exception private string _description = string.Empty; /// - /// Application specific source context + /// Document name /// - private uint _sourceContext; + private string _documentName = string.Empty; /// /// Line number on which the error occurred @@ -39,7 +44,12 @@ public sealed class ActiveScriptException : Exception private int _columnNumber; /// - /// Content of the line on which the error occurred + /// String representation of the script call stack + /// + private string _callStack = string.Empty; + + /// + /// Source fragment /// private string _sourceFragment = string.Empty; @@ -52,6 +62,15 @@ public int ErrorCode set { _errorCode = value; } } + /// + /// Gets or sets a type of the script error + /// + public string Type + { + get { return _type; } + set { _type = value; } + } + /// /// Gets or sets a category of error /// @@ -71,12 +90,12 @@ public string Description } /// - /// Gets or sets a application specific source context + /// Gets or sets a document name /// - public uint SourceContext + public string DocumentName { - get { return _sourceContext; } - set { _sourceContext = value; } + get { return _documentName; } + set { _documentName = value; } } /// @@ -98,7 +117,16 @@ public int ColumnNumber } /// - /// Gets or sets a content of the line on which the error occurred + /// Gets or sets a string representation of the script call stack + /// + public string CallStack + { + get { return _callStack; } + set { _callStack = value; } + } + + /// + /// Gets or sets a source fragment /// public string SourceFragment { @@ -138,11 +166,13 @@ private ActiveScriptException(SerializationInfo info, StreamingContext context) if (info != null) { _errorCode = info.GetInt32("ErrorCode"); + _type = info.GetString("Type"); _category = info.GetString("Category"); _description = info.GetString("Description"); - _sourceContext = info.GetUInt32("SourceContext"); + _documentName = info.GetString("DocumentName"); _lineNumber = info.GetUInt32("LineNumber"); _columnNumber = info.GetInt32("ColumnNumber"); + _callStack = info.GetString("CallStack"); _sourceFragment = info.GetString("SourceFragment"); } } @@ -164,11 +194,13 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont base.GetObjectData(info, context); info.AddValue("ErrorCode", _errorCode); + info.AddValue("Type", _type); info.AddValue("Category", _category); info.AddValue("Description", _description); - info.AddValue("SourceContext", _sourceContext); + info.AddValue("DocumentName", _documentName); info.AddValue("LineNumber", _lineNumber); info.AddValue("ColumnNumber", _columnNumber); + info.AddValue("CallStack", _callStack); info.AddValue("SourceFragment", _sourceFragment); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 1a108ec..8c2a6d0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD using System; +using System.Collections.Generic; using System.Globalization; using System.Runtime.InteropServices; -using System.Text; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -10,7 +10,6 @@ using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; -using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.ActiveScript { @@ -85,54 +84,74 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e error.GetExceptionInfo(out exceptionInfo); int hResult = exceptionInfo.scode; - bool isSyntaxError = IsSyntaxError(hResult); - string category; - string description; + string message = string.Empty; + string category = string.Empty; + string description = string.Empty; + string type = string.Empty; + string helpLink = string.Empty; + string documentName = string.Empty; + uint lineNumber = 0; + int columnNumber = 0; + string callStack = string.Empty; + string sourceFragment = string.Empty; + if (hResult == ComErrorCode.E_ABORT) { - category = string.Empty; + category = JsErrorCategory.Interrupted; description = CommonStrings.Runtime_ScriptInterrupted; + message = description; } else { - category = _jsEngine.ShortenErrorCategoryName(exceptionInfo.bstrSource); + int errorNumber = ComHelpers.HResult.GetFacility(hResult) == ComErrorCode.FACILITY_CONTROL ? + ComHelpers.HResult.GetCode(hResult) : 0; + category = ActiveScriptJsErrorHelpers.IsEngineError(errorNumber) ? + JsErrorCategory.Engine : _jsEngine.ShortenErrorCategoryName(exceptionInfo.bstrSource); description = exceptionInfo.bstrDescription; - } - string helpLink = string.Empty; - if (!string.IsNullOrWhiteSpace(exceptionInfo.bstrHelpFile)) - { - helpLink = exceptionInfo.dwHelpContext != 0 ? - string.Format("{0}: {1}", exceptionInfo.bstrHelpFile, exceptionInfo.dwHelpContext) - : - exceptionInfo.bstrHelpFile - ; - } + type = _jsEngine.GetErrorTypeByNumber(errorNumber); - uint sourceContext; - uint lineNumber; - int columnNumber; + if (!string.IsNullOrWhiteSpace(exceptionInfo.bstrHelpFile)) + { + helpLink = exceptionInfo.dwHelpContext != 0 ? + string.Format("{0}: {1}", exceptionInfo.bstrHelpFile, exceptionInfo.dwHelpContext) + : + exceptionInfo.bstrHelpFile + ; + } - error.GetSourcePosition(out sourceContext, out lineNumber, out columnNumber); - ++lineNumber; - ++columnNumber; + uint sourceContext = 0; + error.GetSourcePosition(out sourceContext, out lineNumber, out columnNumber); + ++lineNumber; + ++columnNumber; - string sourceFragment = string.Empty; - if (isSyntaxError) - { - error.GetSourceLineText(out sourceFragment); - } + documentName = GetDocumentName(sourceContext); + + if (ActiveScriptJsErrorHelpers.IsCompilationError(errorNumber)) + { + string sourceLine; + error.GetSourceLineText(out sourceLine); - string message = GetErrorDetails(category, description, isSyntaxError, sourceContext, - lineNumber, columnNumber); + sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + } + else + { + callStack = JsErrorHelpers.StringifyCallStackItems(GetCallStackItems()); + } + + message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + (int)lineNumber, columnNumber, sourceFragment, callStack); + } var activeScriptException = new ActiveScriptException(message) { ErrorCode = hResult, + Type = type, Category = category, Description = description, - SourceContext = sourceContext, + DocumentName = documentName, LineNumber = lineNumber, ColumnNumber = columnNumber, + CallStack = callStack, SourceFragment = sourceFragment, HelpLink = helpLink }; @@ -141,132 +160,35 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e } /// - /// Checks whether the specified HRESULT value is syntax error - /// - /// The HRESULT value - /// Result of check (true - is syntax error; false - is not syntax error) - private static bool IsSyntaxError(int hResult) - { - bool isSyntaxError = false; - - if (ComHelpers.HResult.GetFacility(hResult) == ComErrorCode.FACILITY_CONTROL) - { - int errorNumber = ComHelpers.HResult.GetCode(hResult); - isSyntaxError = errorNumber >= (int)JsErrorNumber.SyntaxError - && errorNumber <= (int)JsErrorNumber.ThrowMustBeFollowedByExpressionOnSameSourceLine; - } - - return isSyntaxError; - } - - /// - /// Gets a error details + /// Gets a document name /// - /// Category of error - /// Description of error - /// Value indicating whether this exception is syntax error /// Application specific source context - /// Line number - /// Column number - /// Error details - private string GetErrorDetails(string category, string description, bool isSyntaxError, - uint sourceContext, uint lineNumber, int columnNumber) + /// Document name + private string GetDocumentName(uint sourceContext) { - var errorBuilder = new StringBuilder(); - if (!string.IsNullOrWhiteSpace(category)) - { - errorBuilder.AppendFormat("{0}: ", category); - } - errorBuilder.AppendLine(description); - - if (_jsEngine._processDebugManagerWrapper != null) - { - bool stackTraceNotEmpty = false; - if (!isSyntaxError) - { - stackTraceNotEmpty = TryWriteStackTrace(errorBuilder); - } - - bool fullErrorLocationNotEmpty = false; - if (!stackTraceNotEmpty) - { - fullErrorLocationNotEmpty = TryWriteFullErrorLocation(errorBuilder, sourceContext, - lineNumber, columnNumber); - } - - if (!stackTraceNotEmpty && !fullErrorLocationNotEmpty) - { - TryWriteErrorLocation(errorBuilder, lineNumber, columnNumber); - } - } - else - { - TryWriteErrorLocation(errorBuilder, lineNumber, columnNumber); - } - - string errorDetails = errorBuilder.TrimEnd().ToString(); - errorBuilder.Clear(); - - return errorDetails; - } - - /// - /// Writes a information about error location to the buffer. - /// A return value indicates whether the writing succeeded. - /// - /// Instance of - /// Line number - /// Column number - /// true if the writing was successful; otherwise, false - private bool TryWriteErrorLocation(StringBuilder buffer, uint lineNumber, int columnNumber) - { - bool result = false; - - if (lineNumber > 0) - { - JsErrorHelpers.WriteErrorLocation(buffer, (int)lineNumber, columnNumber); - result = true; - } - - return result; - } - - /// - /// Writes a information about full error location to the buffer. - /// A return value indicates whether the writing succeeded. - /// - /// Instance of - /// Application specific source context - /// Line number - /// Column number - /// true if the writing was successful; otherwise, false - private bool TryWriteFullErrorLocation(StringBuilder buffer, uint sourceContext, uint lineNumber, - int columnNumber) - { - bool result = false; + string documentName = string.Empty; + var documentKey = new UIntPtr(sourceContext); DebugDocument document; - if (_jsEngine._debugDocuments.TryGetValue(new UIntPtr(sourceContext), out document)) + if (_jsEngine._debugDocuments.TryGetValue(documentKey, out document)) { - string documentName; document.GetName(DocumentNameType.Title, out documentName); - - JsErrorHelpers.WriteErrorLocation(buffer, documentName, (int)lineNumber, columnNumber); - result = true; + } + else if (!_jsEngine._documentNames.TryGetValue(documentKey, out documentName)) + { + documentName = string.Empty; } - return result; + return documentName; } /// - /// Writes a string representation of the script call stack to the buffer. - /// A return value indicates whether the writing succeeded. + /// Gets a array of instances /// - /// Instance of - /// true if the writing was successful; otherwise, false - protected virtual bool TryWriteStackTrace(StringBuilder buffer) + /// An array of instances + protected virtual CallStackItem[] GetCallStackItems() { - return false; + return new CallStackItem[0]; } #region IActiveScriptSite implementation @@ -282,7 +204,9 @@ public void GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr pUnkItem, if (item == null) { throw new COMException( - string.Format(NetFrameworkStrings.Runtime_ItemNotFound, name), ComErrorCode.E_ELEMENT_NOT_FOUND); + string.Format(NetFrameworkStrings.Runtime_ItemNotFound, name), + ComErrorCode.E_ELEMENT_NOT_FOUND + ); } if (mask.HasFlag(ScriptInfoFlags.IUnknown)) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 2ff8921..11cda2c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -64,6 +64,12 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// private bool _debuggingStarted; + /// + /// List of document names + /// + private readonly Dictionary _documentNames = + new Dictionary(); + /// /// List of debug documents /// @@ -106,11 +112,18 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, { _activeScriptWrapper = CreateActiveScriptWrapper(clsid, languageVersion); } - catch (Exception e) + catch (COMException e) { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, lowerIeVersion, e.Message), _engineModeName); + if (e.ErrorCode == ComErrorCode.E_CLASS_NOT_REGISTERED) + { + throw new JsEngineLoadException( + string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, + _engineModeName, lowerIeVersion, e.Message), + _engineModeName + ); + } + + throw; } if (_settings.EnableDebugging) @@ -199,11 +212,13 @@ private IActiveScriptWrapper CreateActiveScriptWrapper(string clsid, ScriptLangu if (Utils.Is64BitProcess()) { - activeScriptWrapper = new ActiveScriptWrapper64(clsid, languageVersion, _settings.EnableDebugging); + activeScriptWrapper = new ActiveScriptWrapper64(_engineModeName, clsid, languageVersion, + _settings.EnableDebugging); } else { - activeScriptWrapper = new ActiveScriptWrapper32(clsid, languageVersion, _settings.EnableDebugging); + activeScriptWrapper = new ActiveScriptWrapper32(_engineModeName, clsid, languageVersion, + _settings.EnableDebugging); } return activeScriptWrapper; @@ -255,7 +270,10 @@ private void InitScriptDispatch() if (dispatch == null) { - throw new InvalidOperationException(NetFrameworkStrings.Runtime_ActiveScriptDispatcherNotInitialized); + throw new JsEngineLoadException( + NetFrameworkStrings.Engine_ActiveScriptDispatcherNotInitialized, + _engineModeName + ); } _dispatch = dispatch; @@ -289,6 +307,13 @@ private void ThrowError() } } + /// + /// Gets a error type by number + /// + /// Error number + /// Error type + protected abstract string GetErrorTypeByNumber(int errorNumber); + /// /// Executes a script text /// @@ -300,9 +325,10 @@ private object InnerExecute(string code, string documentName, bool isExpression) { object result; DebugDocument debugDocument; - UIntPtr sourceContext = CreateDebugDocument(documentName, code, out debugDocument); + UIntPtr sourceContext; ScriptTextFlags flags = isExpression ? ScriptTextFlags.IsExpression : ScriptTextFlags.IsVisible; - if (sourceContext != UIntPtr.Zero) + + if (TryCreateDebugDocument(documentName, code, out sourceContext, out debugDocument)) { flags |= ScriptTextFlags.HostManagesSource; } @@ -324,30 +350,36 @@ private object InnerExecute(string code, string documentName, bool isExpression) } /// - /// Creates a debug document + /// Try create a debug document /// /// Document name /// Script text + /// Application specific source context /// Debug document - /// Source context - private UIntPtr CreateDebugDocument(string name, string code, out DebugDocument document) + /// Result of creating a debug document (true - is created; false - is not created) + private bool TryCreateDebugDocument(string name, string code, out UIntPtr sourceContext, + out DebugDocument document) { - UIntPtr sourceContext; - if (!_debuggingStarted) - { - sourceContext = UIntPtr.Zero; - document = null; - } - else + bool result; + sourceContext = new UIntPtr(_nextSourceContext++); + document = null; + + if (_debuggingStarted) { - sourceContext = new UIntPtr(_nextSourceContext++); document = new DebugDocument(_activeScriptWrapper, _debugApplicationWrapper, sourceContext, name, code); - _debugDocuments[sourceContext] = document; + + result = true; + } + else + { + result = false; } - return sourceContext; + _documentNames[sourceContext] = name; + + return result; } /// @@ -511,32 +543,52 @@ private object[] MapToHostType(object[] args) return TypeMappingHelpers.MapToHostType(args); } - private JsException ConvertScriptExceptionToHostException( - ActiveScriptException scriptException) + private JsException ConvertOriginalExceptionToWrapperException( + ActiveScriptException originalException) { - JsException hostException; - int hResult = scriptException.ErrorCode; + JsException wrapperException; + string message = originalException.Message; + string category = originalException.Category; - if (hResult == ComErrorCode.E_ABORT) + switch (category) { - hostException = new JsScriptInterruptedException(CommonStrings.Runtime_ScriptInterrupted, - _engineModeName, scriptException); + case JsErrorCategory.Compilation: + wrapperException = new JsCompilationException(message, _engineModeName, originalException); + break; + + case JsErrorCategory.Runtime: + wrapperException = new JsRuntimeException(message, _engineModeName, originalException) + { + CallStack = originalException.CallStack + }; + break; + + case JsErrorCategory.Interrupted: + wrapperException = new JsInterruptedException(message, _engineModeName, originalException); + break; + + case JsErrorCategory.Engine: + wrapperException = new JsEngineException(message, _engineModeName, originalException); + break; + + default: + wrapperException = new JsException(message, _engineModeName, originalException); + break; } - else + + wrapperException.Description = originalException.Description; + + var wrapperScriptException = wrapperException as JsScriptException; + if (wrapperScriptException != null) { - hostException = new JsRuntimeException(scriptException.Message, _engineModeName, - scriptException) - { - ErrorCode = hResult.ToString(CultureInfo.InvariantCulture), - Category = scriptException.Category, - LineNumber = (int)scriptException.LineNumber, - ColumnNumber = scriptException.ColumnNumber, - SourceFragment = scriptException.SourceFragment, - HelpLink = scriptException.HelpLink - }; + wrapperScriptException.Type = originalException.Type; + wrapperScriptException.DocumentName = originalException.DocumentName; + wrapperScriptException.LineNumber = (int)originalException.LineNumber; + wrapperScriptException.ColumnNumber = originalException.ColumnNumber; + wrapperScriptException.SourceFragment = originalException.SourceFragment; } - return hostException; + return wrapperException; } /// @@ -546,24 +598,7 @@ private JsException ConvertScriptExceptionToHostException( /// Short name of error category private string ShortenErrorCategoryName(string categoryName) { - if (categoryName == null) - { - throw new ArgumentNullException("categoryName"); - } - - string shortCategoryName = categoryName; - if (categoryName.StartsWith(_errorCategoryNamePrefix, StringComparison.Ordinal)) - { - shortCategoryName = categoryName.Substring(_errorCategoryNamePrefix.Length); - if (shortCategoryName.Length > 0) - { - char[] chars = shortCategoryName.ToCharArray(); - chars[0] = char.ToUpperInvariant(chars[0]); - shortCategoryName = new string(chars); - } - } - - return shortCategoryName; + return ActiveScriptJsErrorHelpers.ShortenErrorItemName(categoryName, _errorCategoryNamePrefix); } #endregion @@ -590,7 +625,7 @@ public override object Evaluate(string expression, string documentName) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); @@ -611,7 +646,7 @@ public override void Execute(string code, string documentName) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); } @@ -630,12 +665,14 @@ public override object CallFunction(string functionName, params object[] args) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } catch (MissingMemberException) { throw new JsRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); } }); @@ -659,7 +696,7 @@ public override bool HasVariable(string variableName) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } catch (MissingMemberException) { @@ -684,12 +721,14 @@ public override object GetVariableValue(string variableName) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } catch (MissingMemberException) { throw new JsRuntimeException( - string.Format(NetFrameworkStrings.Runtime_VariableNotExist, variableName)); + string.Format(NetFrameworkStrings.Runtime_VariableNotExist, variableName), + _engineModeName + ); } }); @@ -712,7 +751,7 @@ public override void SetVariableValue(string variableName, object value) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); } @@ -729,7 +768,7 @@ public override void RemoveVariable(string variableName) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); } @@ -748,7 +787,7 @@ public override void EmbedHostObject(string itemName, object value) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); } @@ -767,7 +806,7 @@ public override void EmbedHostType(string itemName, Type type) } catch (ActiveScriptException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } }); } @@ -827,6 +866,11 @@ private void Dispose(bool disposing) _debugDocuments.Clear(); } + if (_documentNames != null) + { + _documentNames.Clear(); + } + if (_processDebugManagerWrapper != null) { _processDebugManagerWrapper.RemoveApplication(_debugApplicationCookie); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs new file mode 100644 index 0000000..7872496 --- /dev/null +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -0,0 +1,115 @@ +#if !NETSTANDARD +using System; +using System.Collections.Generic; + +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine.ActiveScript +{ + /// + /// Active Script error helpers + /// + internal static class ActiveScriptJsErrorHelpers + { + /// + /// Checks whether the specified error number is engine error + /// + /// Error number + /// Result of check (true - is engine error; false - is not engine error) + public static bool IsEngineError(int errorNumber) + { + bool result = errorNumber == JScriptSyntaxErrorNumber.OutOfMemory + || errorNumber == JScriptRuntimeErrorNumber.OutOfMemory; + + return result; + } + + /// + /// Checks whether the specified error number is compilation error + /// + /// Error number + /// Result of check (true - is compilation error; false - is not compilation error) + public static bool IsCompilationError(int errorNumber) + { + bool result = errorNumber >= JScriptSyntaxErrorNumber.SyntaxError + && errorNumber <= JScriptSyntaxErrorNumber.ThrowMustBeFollowedByExpressionOnSameSourceLine; + + return result; + } + + /// + /// Checks whether the specified error number is runtime error + /// + /// Error number + /// Result of check (true - is runtime error; false - is not runtime error) + public static bool IsRuntimeError(int errorNumber) + { bool result = errorNumber == JScriptRuntimeErrorNumber.OutOfStackSpace + || (errorNumber >= JScriptRuntimeErrorNumber.CannotAssignToThisKeyword + && errorNumber <= JScriptRuntimeErrorNumber.InvalidReplacerArgument); + + return result; + } + + /// + /// Gets a error type by number + /// + /// Error number + /// Mapping of error numbers and types + /// Error type + public static string GetErrorTypeByNumber(int errorNumber, Dictionary runtimeErrorTypeMap) + { + string errorType = string.Empty; + + if (IsCompilationError(errorNumber)) + { + errorType = JsErrorType.Syntax; + } + else if (IsRuntimeError(errorNumber)) + { + if (!runtimeErrorTypeMap.TryGetValue(errorNumber, out errorType)) + { + errorType = string.Empty; + } + } + + return errorType; + } + + /// + /// Shortens a name of error item + /// + /// Name of error item + /// Prefix + /// Short name of error item + public static string ShortenErrorItemName(string itemName, string prefix) + { + if (itemName == null) + { + throw new ArgumentNullException(nameof(itemName)); + } + + if (prefix == null) + { + throw new ArgumentNullException(nameof(prefix)); + } + + int itemNameLength = itemName.Length; + if (itemNameLength == 0 || prefix.Length == 0) + { + return itemName; + } + + string shortItemName = itemName.TrimStart(prefix); + int shortItemNameLength = shortItemName.Length; + + if (shortItemNameLength > 0 && shortItemNameLength < itemNameLength) + { + shortItemName = shortItemName.CapitalizeFirstLetter(); + } + + return shortItemName; + } + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index d71e2fb..255f7b5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -31,12 +31,13 @@ internal sealed class ActiveScriptWrapper32 : ActiveScriptWrapperBase /// /// Constructs an instance of the 32-bit Active Script wrapper /// + /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - public ActiveScriptWrapper32(string clsid, ScriptLanguageVersion languageVersion, + public ActiveScriptWrapper32(string engineModeName, string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) - : base(clsid, languageVersion, enableDebugging) + : base(engineModeName, clsid, languageVersion, enableDebugging) { _activeScriptParse32 = (IActiveScriptParse32)_activeScript; if (_enableDebugging) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index 26fdf89..0e2c248 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -31,12 +31,13 @@ internal sealed class ActiveScriptWrapper64 : ActiveScriptWrapperBase /// /// Constructs an instance of the 64-bit Active Script wrapper /// + /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - public ActiveScriptWrapper64(string clsid, ScriptLanguageVersion languageVersion, + public ActiveScriptWrapper64(string engineModeName, string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) - : base(clsid, languageVersion, enableDebugging) + : base(engineModeName, clsid, languageVersion, enableDebugging) { _activeScriptParse64 = (IActiveScriptParse64)_activeScript; if (_enableDebugging) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 691af2d..115f722 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -46,11 +46,12 @@ internal abstract class ActiveScriptWrapperBase : IActiveScriptWrapper /// /// Constructs an instance of the Active Script wrapper /// + /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVersion, - bool enableDebugging) + protected ActiveScriptWrapperBase(string engineModeName, string clsid, + ScriptLanguageVersion languageVersion, bool enableDebugging) { _enableDebugging = enableDebugging; @@ -69,7 +70,9 @@ protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVe if (result != ComErrorCode.S_OK) { throw new JsEngineLoadException( - string.Format(NetFrameworkStrings.Runtime_ActiveScriptLanguageVersionSelectionFailed, languageVersion)); + string.Format(NetFrameworkStrings.Engine_ActiveScriptLanguageVersionSelectionFailed, languageVersion), + engineModeName + ); } } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs index 5dea9b0..bcb8fb3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs @@ -30,11 +30,15 @@ public uint QueryContinue() if (InterruptRequested) { hResult = ComErrorCode.E_ABORT; - var activeScriptException = new ActiveScriptException( - CommonStrings.Runtime_ScriptInterrupted) + string category = JsErrorCategory.Interrupted; + string description = CommonStrings.Runtime_ScriptInterrupted; + string message = description; + + var activeScriptException = new ActiveScriptException(message) { ErrorCode = hResult, - Description = CommonStrings.Runtime_ScriptInterrupted + Category = category, + Description = description }; LastException = activeScriptException; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 7eee663..5b46969 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -1,4 +1,6 @@ #if !NETSTANDARD +using System.Collections.Generic; + using MsieJavaScriptEngine.Constants; namespace MsieJavaScriptEngine.ActiveScript @@ -18,6 +20,45 @@ internal sealed partial class ChakraActiveScriptJsEngine : ActiveScriptJsEngineB /// private static object _supportSynchronizer = new object(); + /// + /// Mapping of error numbers and types + /// + private static readonly Dictionary _runtimeErrorTypeMap = new Dictionary + { + { JScriptRuntimeErrorNumber.OutOfStackSpace, JsErrorType.Common }, + { JScriptRuntimeErrorNumber.CannotAssignToThisKeyword, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.NumberExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.FunctionExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.CannotAssignToFunctionResult, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.StringExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.DateObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.IllegalAssignment, string.Empty }, + { JScriptRuntimeErrorNumber.UndefinedIdentifier, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.BooleanExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ObjectMemberExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.VbArrayExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.JavaScriptObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.EnumeratorObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.RegularExpressionObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.SyntaxErrorInRegularExpression, JsErrorType.Syntax }, + { JScriptRuntimeErrorNumber.UnexpectedQuantifier, JsErrorType.Syntax }, + { JScriptRuntimeErrorNumber.ExpectedRightSquareBracketInRegularExpression, JsErrorType.Syntax }, + { JScriptRuntimeErrorNumber.ExpectedRightParenthesisInRegularExpression, JsErrorType.Syntax }, + { JScriptRuntimeErrorNumber.InvalidRangeInCharacterSet, JsErrorType.Syntax }, + { JScriptRuntimeErrorNumber.ExceptionThrownAndNotCaught, string.Empty }, + { JScriptRuntimeErrorNumber.FunctionDoesNotHaveValidPrototypeObject, string.Empty }, + { JScriptRuntimeErrorNumber.UriToBeEncodedContainsInvalidCharacter, JsErrorType.URI }, + { JScriptRuntimeErrorNumber.UriToBeDecodedIsNotValidEncoding, JsErrorType.URI }, + { JScriptRuntimeErrorNumber.NumberOfFractionalDigitsIsOutOfRange, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.PrecisionOutOfRange, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.ArrayOrArgumentsObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ArrayLengthMustBeFinitePositiveInteger, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.ArrayLengthMustBeAssignedFinitePositiveNumber, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.CircularReferenceInValueArgumentNotSupported, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.InvalidReplacerArgument, string.Empty } + }; + /// /// Constructs an instance of the Chakra Active Script engine @@ -58,6 +99,16 @@ protected override void InitScriptContext() _interruptRequested = false; } + /// + /// Gets a error type by number + /// + /// Error number + /// Error type + protected override string GetErrorTypeByNumber(int errorNumber) + { + return ActiveScriptJsErrorHelpers.GetErrorTypeByNumber(errorNumber, _runtimeErrorTypeMap); + } + protected override void InnerRemoveVariable(string variableName) { InnerSetVariableValue(variableName, null); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs index f5dceb1..acf5ef4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs @@ -1,7 +1,7 @@ #if !NETSTANDARD using System; +using System.Collections.Generic; using System.Runtime.InteropServices; -using System.Text; using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; @@ -56,15 +56,12 @@ protected override void ProcessActiveScriptError(IActiveScriptError error) } /// - /// Writes a string representation of the script call stack to the buffer. - /// A return value indicates whether the writing succeeded. + /// Gets a array of instances /// - /// Instance of - /// true if the writing was successful; otherwise, false - protected override bool TryWriteStackTrace(StringBuilder buffer) + /// An array of instances + protected override CallStackItem[] GetCallStackItems() { - bool result = false; - + var callStackItems = new List(); IEnumDebugStackFrames enumFrames; ActiveScriptWrapper.EnumStackFrames(out enumFrames); @@ -82,13 +79,11 @@ protected override bool TryWriteStackTrace(StringBuilder buffer) { IDebugStackFrame stackFrame = descriptor.Frame; - string description; - stackFrame.GetDescriptionString(true, out description); + string functionName; + stackFrame.GetDescriptionString(true, out functionName); - if (string.Equals(description, "JScript global code", StringComparison.Ordinal)) - { - description = "Global code"; - } + string shortFunctionName = ActiveScriptJsErrorHelpers.ShortenErrorItemName( + functionName, "JScript "); IDebugCodeContext codeContext; stackFrame.GetCodeContext(out codeContext); @@ -96,17 +91,15 @@ protected override bool TryWriteStackTrace(StringBuilder buffer) IDebugDocumentContext documentContext; codeContext.GetDocumentContext(out documentContext); - if (documentContext == null) - { - JsErrorHelpers.WriteErrorLocation(buffer, description); - buffer.AppendLine(); - } - else + string documentName = string.Empty; + uint lineNumber = 0; + uint columnNumber = 0; + + if (documentContext != null) { IDebugDocument document; documentContext.GetDocument(out document); - string documentName; document.GetName(DocumentNameType.Title, out documentName); var documentText = (IDebugDocumentText)document; @@ -115,16 +108,19 @@ protected override bool TryWriteStackTrace(StringBuilder buffer) uint length; documentText.GetPositionOfContext(documentContext, out position, out length); - uint lineNumber; uint offsetInLine; documentText.GetLineOfPosition(position, out lineNumber, out offsetInLine); - uint columnNumber = offsetInLine + 1; - - buffer.AppendFormatLine(" at {0} ({1}:{2}:{3})", description, documentName, - lineNumber, columnNumber); + columnNumber = offsetInLine + 1; } - result = true; + CallStackItem callStackItem = new CallStackItem + { + FunctionName = shortFunctionName, + DocumentName = documentName, + LineNumber = (int)lineNumber, + ColumnNumber = (int)columnNumber + }; + callStackItems.Add(callStackItem); } finally { @@ -135,12 +131,7 @@ protected override bool TryWriteStackTrace(StringBuilder buffer) } } - if (result) - { - buffer.TrimEnd(); - } - - return result; + return callStackItems.ToArray(); } #endregion diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index b13fe0a..dcdef6b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,5 +1,6 @@ #if !NETSTANDARD using System; +using System.Collections.Generic; using System.Reflection; using MsieJavaScriptEngine.Constants; @@ -35,6 +36,45 @@ internal sealed partial class ClassicActiveScriptJsEngine : ActiveScriptJsEngine /// private static object _supportSynchronizer = new object(); + /// + /// Mapping of error numbers and types + /// + private static readonly Dictionary _runtimeErrorTypeMap = new Dictionary + { + { JScriptRuntimeErrorNumber.OutOfStackSpace, JsErrorType.Common }, + { JScriptRuntimeErrorNumber.CannotAssignToThisKeyword, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.NumberExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.FunctionExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.CannotAssignToFunctionResult, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.StringExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.DateObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.IllegalAssignment, JsErrorType.Reference }, + { JScriptRuntimeErrorNumber.UndefinedIdentifier, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.BooleanExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ObjectMemberExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.VbArrayExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.JavaScriptObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.EnumeratorObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.RegularExpressionObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.SyntaxErrorInRegularExpression, JsErrorType.RegExp }, + { JScriptRuntimeErrorNumber.UnexpectedQuantifier, JsErrorType.RegExp }, + { JScriptRuntimeErrorNumber.ExpectedRightSquareBracketInRegularExpression, JsErrorType.RegExp }, + { JScriptRuntimeErrorNumber.ExpectedRightParenthesisInRegularExpression, JsErrorType.RegExp }, + { JScriptRuntimeErrorNumber.InvalidRangeInCharacterSet, JsErrorType.RegExp }, + { JScriptRuntimeErrorNumber.ExceptionThrownAndNotCaught, string.Empty }, + { JScriptRuntimeErrorNumber.FunctionDoesNotHaveValidPrototypeObject, string.Empty }, + { JScriptRuntimeErrorNumber.UriToBeEncodedContainsInvalidCharacter, JsErrorType.URI }, + { JScriptRuntimeErrorNumber.UriToBeDecodedIsNotValidEncoding, JsErrorType.URI }, + { JScriptRuntimeErrorNumber.NumberOfFractionalDigitsIsOutOfRange, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.PrecisionOutOfRange, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.ArrayOrArgumentsObjectExpected, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.ArrayLengthMustBeFinitePositiveInteger, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.ArrayLengthMustBeAssignedFinitePositiveNumber, JsErrorType.Range }, + { JScriptRuntimeErrorNumber.CircularReferenceInValueArgumentNotSupported, JsErrorType.Type }, + { JScriptRuntimeErrorNumber.InvalidReplacerArgument, string.Empty } + }; + /// /// Constructs an instance of the Classic Active Script engine @@ -58,6 +98,16 @@ public static bool IsSupported() return isSupported; } + /// + /// Gets a error type by number + /// + /// Error number + /// Error type + protected override string GetErrorTypeByNumber(int errorNumber) + { + return ActiveScriptJsErrorHelpers.GetErrorTypeByNumber(errorNumber, _runtimeErrorTypeMap); + } + /// /// Loads a resources /// @@ -88,19 +138,25 @@ private void ExecuteResource(string resourceName, Assembly assembly) if (resourceName == null) { throw new ArgumentNullException( - "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); } if (assembly == null) { throw new ArgumentNullException( - "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); + nameof(assembly), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(assembly)) + ); } if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); } string code = Utils.GetResourceAsString(resourceName, assembly); diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs new file mode 100644 index 0000000..d65a18f --- /dev/null +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs @@ -0,0 +1,183 @@ +#if !NETSTANDARD +namespace MsieJavaScriptEngine.ActiveScript +{ + /// + /// JScript runtime error numbers + /// + internal static class JScriptRuntimeErrorNumber + { + #region Engine + + /// + /// Out of memory + /// + public const int OutOfMemory = 7; + + #endregion + + #region Runtime + + /// + /// Out of stack space + /// + public const int OutOfStackSpace = 28; + + /// + /// Cannot assign to 'this' + /// + public const int CannotAssignToThisKeyword = 5000; + + /// + /// Number expected + /// + public const int NumberExpected = 5001; + + /// + /// Function expected + /// + public const int FunctionExpected = 5002; + + /// + /// Cannot assign to a function result + /// + public const int CannotAssignToFunctionResult = 5003; + + /// + /// String expected + /// + public const int StringExpected = 5005; + + /// + /// Date object expected + /// + public const int DateObjectExpected = 5006; + + /// + /// Object expected + /// + public const int ObjectExpected = 5007; + + /// + /// Illegal assignment + /// + public const int IllegalAssignment = 5008; + + /// + /// Undefined identifier + /// + public const int UndefinedIdentifier = 5009; + + /// + /// Boolean expected + /// + public const int BooleanExpected = 5010; + + /// + /// Object member expected + /// + public const int ObjectMemberExpected = 5012; + + /// + /// VBArray expected + /// + public const int VbArrayExpected = 5013; + + /// + /// JavaScript object expected + /// + public const int JavaScriptObjectExpected = 5014; + + /// + /// Enumerator object expected + /// + public const int EnumeratorObjectExpected = 5015; + + /// + /// Regular Expression object expected + /// + public const int RegularExpressionObjectExpected = 5016; + + /// + /// Syntax error in regular expression + /// + public const int SyntaxErrorInRegularExpression = 5017; + + /// + /// Unexpected quantifier + /// + public const int UnexpectedQuantifier = 5018; + + /// + /// Expected ']' in regular expression + /// + public const int ExpectedRightSquareBracketInRegularExpression = 5019; + + /// + /// Expected ')' in regular expression + /// + public const int ExpectedRightParenthesisInRegularExpression = 5020; + + /// + /// Invalid range in character set + /// + public const int InvalidRangeInCharacterSet = 5021; + + /// + /// Exception thrown and not caught + /// + public const int ExceptionThrownAndNotCaught = 5022; + + /// + /// Function does not have a valid prototype object + /// + public const int FunctionDoesNotHaveValidPrototypeObject = 5023; + + /// + /// The URI to be encoded contains an invalid character + /// + public const int UriToBeEncodedContainsInvalidCharacter = 5024; + + /// + /// The URI to be decoded is not a valid encoding + /// + public const int UriToBeDecodedIsNotValidEncoding = 5025; + + /// + /// The number of fractional digits is out of range + /// + public const int NumberOfFractionalDigitsIsOutOfRange = 5026; + + /// + /// The precision is out of range + /// + public const int PrecisionOutOfRange = 5027; + + /// + /// Array or arguments object expected + /// + public const int ArrayOrArgumentsObjectExpected = 5028; + + /// + /// Array length must be a finite positive integer + /// + public const int ArrayLengthMustBeFinitePositiveInteger = 5029; + + /// + /// Array length must be assigned a finite positive number + /// + public const int ArrayLengthMustBeAssignedFinitePositiveNumber = 5030; + + /// + /// Circular reference in value argument not supported + /// + public const int CircularReferenceInValueArgumentNotSupported = 5034; + + /// + /// Invalid replacer argument + /// + public const int InvalidReplacerArgument = 5035; + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs new file mode 100644 index 0000000..7cf568d --- /dev/null +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs @@ -0,0 +1,168 @@ +#if !NETSTANDARD +namespace MsieJavaScriptEngine.ActiveScript +{ + /// + /// JScript syntax error numbers + /// + internal static class JScriptSyntaxErrorNumber + { + #region Engine + + /// + /// Out of memory + /// + public const int OutOfMemory = 1001; + + #endregion + + #region Compilation + + /// + /// Syntax error + /// + public const int SyntaxError = 1002; + + /// + /// Expected ':' + /// + public const int ExpectedColon = 1003; + + /// + /// Expected ';' + /// + public const int ExpectedSemicolon = 1004; + + /// + /// Expected '(' + /// + public const int ExpectedLeftParenthesis = 1005; + + /// + /// Expected ')' + /// + public const int ExpectedRightParenthesis = 1006; + + /// + /// Expected ']' + /// + public const int ExpectedRightSquareBracket = 1007; + + /// + /// Expected '{' + /// + public const int ExpectedLeftCurlyBrace = 1008; + + /// + /// Expected '}' + /// + public const int ExpectedRightCurlyBrace = 1009; + + /// + /// Expected identifier + /// + public const int ExpectedIdentifier = 1010; + + /// + /// Expected '=' + /// + public const int ExpectedEqualSign = 1011; + + /// + /// Expected '/' + /// + public const int ExpectedForwardSlash = 1012; + + /// + /// Invalid character + /// + public const int InvalidCharacter = 1014; + + /// + /// Unterminated string constant + /// + public const int UnterminatedStringConstant = 1015; + + /// + /// Unterminated comment + /// + public const int UnterminatedComment = 1016; + + /// + /// 'return' statement outside of function + /// + public const int ReturnStatementOutsideOfFunction = 1018; + + /// + /// Can't have 'break' outside of loop + /// + public const int CannotHaveBreakStatementOutsideOfLoop = 1019; + + /// + /// Can't have 'continue' outside of loop + /// + public const int CannotHaveContinueStatementOutsideOfLoop = 1020; + + /// + /// Expected hexadecimal digit + /// + public const int ExpectedHexadecimalDigit = 1023; + + /// + /// Expected 'while' + /// + public const int ExpectedWhileStatement = 1024; + + /// + /// Label redefined + /// + public const int LabelRedefined = 1025; + + /// + /// Label not found + /// + public const int LabelNotFound = 1026; + + /// + /// 'default' can only appear once in a 'switch' statement + /// + public const int DefaultStatementCanOnlyAppearOnceInSwitchStatement = 1027; + + /// + /// Expected identifier, string or number + /// + public const int ExpectedIdentifierStringOrNumber = 1028; + + /// + /// Expected '@end' + /// + public const int ExpectedConditionalCompilationEndStatement = 1029; + + /// + /// Conditional compilation is turned off + /// + public const int ConditionalCompilationTurnedOff = 1030; + + /// + /// Expected constant + /// + public const int ExpectedConstant = 1031; + + /// + /// Expected '@' + /// + public const int ExpectedAtSign = 1032; + + /// + /// Expected 'catch' + /// + public const int ExpectedCatchStatement = 1033; + + /// + /// Throw must be followed by an expression on the same source line + /// + public const int ThrowMustBeFollowedByExpressionOnSameSourceLine = 1035; + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs deleted file mode 100644 index e5afca7..0000000 --- a/src/MsieJavaScriptEngine/ActiveScript/JsErrorNumber.cs +++ /dev/null @@ -1,338 +0,0 @@ -#if !NETSTANDARD -namespace MsieJavaScriptEngine.ActiveScript -{ - /// - /// JS error numbers - /// - internal enum JsErrorNumber : uint - { - /// - /// Success error number - /// - NoError = 0, - - #region Syntax - - /// - /// Syntax error - /// - SyntaxError = 1002, - - /// - /// Expected ':' - /// - ExpectedColon = 1003, - - /// - /// Expected ';' - /// - ExpectedSemicolon = 1004, - - /// - /// Expected '(' - /// - ExpectedLeftParenthesis = 1005, - - /// - /// Expected ')' - /// - ExpectedRightParenthesis = 1006, - - /// - /// Expected ']' - /// - ExpectedRightSquareBracket = 1007, - - /// - /// Expected '{' - /// - ExpectedLeftCurlyBrace = 1008, - - /// - /// Expected '}' - /// - ExpectedRightCurlyBrace = 1009, - - /// - /// Expected identifier - /// - ExpectedIdentifier = 1010, - - /// - /// Expected '=' - /// - ExpectedEqualSign = 1011, - - /// - /// Expected '/' - /// - ExpectedForwardSlash = 1012, - - /// - /// Invalid character - /// - InvalidCharacter = 1014, - - /// - /// Unterminated string constant - /// - UnterminatedStringConstant = 1015, - - /// - /// Unterminated comment - /// - UnterminatedComment = 1016, - - /// - /// 'return' statement outside of function - /// - ReturnStatementOutsideOfFunction = 1018, - - /// - /// Can't have 'break' outside of loop - /// - CannotHaveBreakStatementOutsideOfLoop = 1019, - - /// - /// Can't have 'continue' outside of loop - /// - CannotHaveContinueStatementOutsideOfLoop = 1020, - - /// - /// Expected hexadecimal digit - /// - ExpectedHexadecimalDigit = 1023, - - /// - /// Expected 'while' - /// - ExpectedWhileStatement = 1024, - - /// - /// Label redefined - /// - LabelRedefined = 1025, - - /// - /// Label not found - /// - LabelNotFound = 1026, - - /// - /// 'default' can only appear once in a 'switch' statement - /// - DefaultStatementCanOnlyAppearOnceInSwitchStatement = 1027, - - /// - /// Expected identifier, string or number - /// - ExpectedIdentifierStringOrNumber = 1028, - - /// - /// Expected '@end' - /// - ExpectedConditionalCompilationEndStatement = 1029, - - /// - /// Conditional compilation is turned off - /// - ConditionalCompilationTurnedOff = 1030, - - /// - /// Expected constant - /// - ExpectedConstant = 1031, - - /// - /// Expected '@' - /// - ExpectedAtSign = 1032, - - /// - /// Expected 'catch' - /// - ExpectedCatchStatement = 1033, - - /// - /// Throw must be followed by an expression on the same source line - /// - ThrowMustBeFollowedByExpressionOnSameSourceLine = 1035, - - #endregion - - #region Runtime - - /// - /// Access is denied - /// - AccessDenied = 5, - - /// - /// Object doesn't support this property or method - /// - ObjectDoesNotSupportThisPropertyOrMethod = 438, - - /// - /// Out of memory - /// - OutOfMemory = 1001, - - /// - /// Cannot assign to 'this' - /// - CannotAssignToThisKeyword = 5000, - - /// - /// Number expected - /// - NumberExpected = 5001, - - /// - /// Function expected - /// - FunctionExpected = 5002, - - /// - /// Cannot assign to a function result - /// - CannotAssignToFunctionResult = 5003, - - /// - /// String expected - /// - StringExpected = 5005, - - /// - /// Date object expected - /// - DateObjectExpected = 5006, - - /// - /// Object expected - /// - ObjectExpected = 5007, - - /// - /// Illegal assignment - /// - IllegalAssignment = 5008, - - /// - /// Undefined identifier - /// - UndefinedIdentifier = 5009, - - /// - /// Boolean expected - /// - BooleanExpected = 5010, - - /// - /// Object member expected - /// - ObjectMemberExpected = 5012, - - /// - /// VBArray expected - /// - VbArrayExpected = 5013, - - /// - /// JavaScript object expected - /// - JavaScriptObjectExpected = 5014, - - /// - /// Enumerator object expected - /// - EnumeratorObjectExpected = 5015, - - /// - /// Regular Expression object expected - /// - RegularExpressionObjectExpected = 5016, - - /// - /// Syntax error in regular expression - /// - SyntaxErrorInRegularExpression = 5017, - - /// - /// Unexpected quantifier - /// - UnexpectedQuantifier = 5018, - - /// - /// Expected ']' in regular expression - /// - ExpectedRightSquareBracketInRegularExpression = 5019, - - /// - /// Expected ')' in regular expression - /// - ExpectedRightParenthesisInRegularExpression = 5020, - - /// - /// Invalid range in character set - /// - InvalidRangeInCharacterSet = 5021, - - /// - /// Exception thrown and not caught - /// - ExceptionThrownAndNotCaught = 5022, - - /// - /// Function does not have a valid prototype object - /// - FunctionDoesNotHaveValidPrototypeObject = 5023, - - /// - /// The URI to be encoded contains an invalid character - /// - UriToBeEncodedContainsInvalidCharacter = 5024, - - /// - /// The URI to be decoded is not a valid encoding - /// - UriToBeDecodedIsNotValidEncoding = 5025, - - /// - /// The number of fractional digits is out of range - /// - NumberOfFractionalDigitsIsOutOfRange = 5026, - - /// - /// The precision is out of range - /// - PrecisionOutOfRange = 5027, - - /// - /// Array or arguments object expected - /// - ArrayOrArgumentsObjectExpected = 5028, - - /// - /// Array length must be a finite positive integer - /// - ArrayLengthMustBeFinitePositiveInteger = 5029, - - /// - /// Array length must be assigned a finite positive number - /// - ArrayLengthMustBeAssignedFinitePositiveNumber = 5030, - - /// - /// Circular reference in value argument not supported - /// - CircularReferenceInValueArgumentNotSupported = 5034, - - /// - /// Invalid replacer argument - /// - InvalidReplacerArgument = 5035 - - #endregion - } -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/CommonRegExps.cs b/src/MsieJavaScriptEngine/CommonRegExps.cs new file mode 100644 index 0000000..70a39eb --- /dev/null +++ b/src/MsieJavaScriptEngine/CommonRegExps.cs @@ -0,0 +1,19 @@ +namespace MsieJavaScriptEngine +{ + /// + /// Common regular expressions + /// + internal static class CommonRegExps + { + /// + /// Pattern for working with JS names + /// + public const string JsNamePattern = @"[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]" + + @"[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\u200C\u200D\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*"; + + /// + /// Pattern for working with document names + /// + public const string DocumentNamePattern = @"[^\s*?""<>|][^\t\n\r*?""<>|]*?"; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/JsErrorCategory.cs b/src/MsieJavaScriptEngine/Constants/JsErrorCategory.cs new file mode 100644 index 0000000..58f6208 --- /dev/null +++ b/src/MsieJavaScriptEngine/Constants/JsErrorCategory.cs @@ -0,0 +1,14 @@ +namespace MsieJavaScriptEngine.Constants +{ + internal static class JsErrorCategory + { + public const string Unknown = "Unknown error"; + public const string Compilation = "Compilation error"; + public const string Runtime = "Runtime error"; + public const string Interrupted = "Interrupted error"; + public const string Usage = "Usage error"; + public const string Engine = "Engine error"; + public const string EngineLoad = "Engine load error"; + public const string Fatal = "Fatal error"; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Constants/JsErrorType.cs b/src/MsieJavaScriptEngine/Constants/JsErrorType.cs new file mode 100644 index 0000000..7c90417 --- /dev/null +++ b/src/MsieJavaScriptEngine/Constants/JsErrorType.cs @@ -0,0 +1,15 @@ +namespace MsieJavaScriptEngine.Constants +{ + internal static class JsErrorType + { + public const string Common = "Error"; + public const string Eval = "EvalError"; + public const string Internal = "InternalError"; + public const string Range = "RangeError"; + public const string Reference = "ReferenceError"; + public const string RegExp = "RegExpError"; + public const string Syntax = "SyntaxError"; + public const string Type = "TypeError"; + public const string URI = "URIError"; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs b/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs new file mode 100644 index 0000000..f07c0d5 --- /dev/null +++ b/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs @@ -0,0 +1,66 @@ +namespace MsieJavaScriptEngine.Helpers +{ + /// + /// Script call stack item + /// + internal sealed class CallStackItem + { + /// + /// Gets or sets a function name + /// + public string FunctionName + { + get; + set; + } + + /// + /// Gets or sets a document name + /// + public string DocumentName + { + get; + set; + } + + /// + /// Gets or sets a line number + /// + public int LineNumber + { + get; + set; + } + + /// + /// Gets or sets a column number + /// + public int ColumnNumber + { + get; + set; + } + + /// + /// Gets or sets a source fragment + /// + public string SourceFragment + { + get; + set; + } + + + /// + /// Constructs an instance of the script call stack item + /// + public CallStackItem() + { + FunctionName = string.Empty; + DocumentName = string.Empty; + LineNumber = 0; + ColumnNumber = 0; + SourceFragment = string.Empty; + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index fee815b..fe6dcb8 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; +using System.Diagnostics; using System.Globalization; using System.Text; +using System.Text.RegularExpressions; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -8,127 +11,496 @@ namespace MsieJavaScriptEngine.Helpers { /// - /// JavaScript engine error helpers + /// JS engine error helpers /// public static class JsErrorHelpers { + #region Call stack + + /// + /// Regular expression for working with line of the script call stack + /// + private static readonly Regex _callStackLineRegex = + new Regex(@"^[ ]{3}at " + + @"(?[A-Za-z][A-Za-z ]*|" + CommonRegExps.JsNamePattern + @") " + + @"\((?" + CommonRegExps.DocumentNamePattern + @"):" + + @"(?\d+):(?\d+)\)$"); + + /// + /// Parses a string representation of the script call stack to produce an array of + /// instances + /// + /// String representation of the script call stack + /// An array of instances + internal static CallStackItem[] ParseCallStack(string callStack) + { + if (string.IsNullOrWhiteSpace(callStack)) + { + return new CallStackItem[0]; + } + + var callStackItems = new List(); + string[] lines = callStack.SplitToLines(); + int lineCount = lines.Length; + + for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) + { + string line = lines[lineIndex]; + Match lineMatch = _callStackLineRegex.Match(line); + + if (lineMatch.Success) + { + GroupCollection lineGroups = lineMatch.Groups; + + var callStackItem = new CallStackItem + { + FunctionName = lineGroups["functionName"].Value, + DocumentName = lineGroups["documentName"].Value, + LineNumber = int.Parse(lineGroups["lineNumber"].Value), + ColumnNumber = int.Parse(lineGroups["columnNumber"].Value) + }; + callStackItems.Add(callStackItem); + } + else + { + Debug.WriteLine(string.Format(CommonStrings.Runtime_InvalidCallStackLineFormat, line)); + return new CallStackItem[0]; + } + } + + return callStackItems.ToArray(); + } + + /// + /// Produces a string representation of the script call stack from array of + /// instances + /// + /// An array of instances + /// Flag for whether to omit source fragment + /// String representation of the script call stack + internal static string StringifyCallStackItems(CallStackItem[] callStackItems, + bool omitSourceFragment = false) + { + if (callStackItems == null) + { + throw new ArgumentException(nameof(callStackItems)); + } + + int stackItemCount = callStackItems.Length; + if (stackItemCount == 0) + { + return string.Empty; + } + + StringBuilder stackBuilder = StringBuilderPool.GetBuilder(); + + for (int stackItemIndex = 0; stackItemIndex < stackItemCount; stackItemIndex++) + { + CallStackItem stackItem = callStackItems[stackItemIndex]; + + if (stackItemIndex > 0) + { + stackBuilder.AppendLine(); + } + WriteErrorLocation(stackBuilder, stackItem.FunctionName, stackItem.DocumentName, + stackItem.LineNumber, stackItem.ColumnNumber, + !omitSourceFragment ? stackItem.SourceFragment : string.Empty); + } + + string callStack = stackBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(stackBuilder); + + return callStack; + } + + #endregion + + #region Generation of error messages + + /// + /// Generates a error message + /// + /// Type of the script error + /// Description of error + /// Document name + /// Line number + /// Column number + /// Source fragment + /// Error message + internal static string GenerateErrorMessage(string type, string description, + string documentName, int lineNumber, int columnNumber, string sourceFragment) + { + return GenerateErrorMessage(type, description, documentName, lineNumber, columnNumber, + sourceFragment, string.Empty); + } + + /// + /// Generates a error message + /// + /// Type of the script error + /// Description of error + /// String representation of the script call stack + /// Error message + internal static string GenerateErrorMessage(string type, string description, string callStack) + { + return GenerateErrorMessage(type, description, string.Empty, 0, 0, string.Empty, callStack); + } + + /// + /// Generates a error message + /// + /// Type of the script error + /// Description of error + /// Document name + /// Line number + /// Column number + /// Source fragment + /// String representation of the script call stack + /// Error message + internal static string GenerateErrorMessage(string type, string description, string documentName, + int lineNumber, int columnNumber, string sourceFragment, string callStack) + { + if (description == null) + { + throw new ArgumentNullException(nameof(description)); + } + + if (string.IsNullOrWhiteSpace(description)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(description)), + nameof(description) + ); + } + + StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); + if (!string.IsNullOrWhiteSpace(type)) + { + messageBuilder.AppendFormat("{0}: ", type); + } + messageBuilder.Append(description); + + if (!string.IsNullOrWhiteSpace(callStack)) + { + messageBuilder.AppendLine(); + messageBuilder.Append(callStack); + } + else + { + if (!string.IsNullOrWhiteSpace(documentName) || lineNumber > 0) + { + messageBuilder.AppendLine(); + WriteErrorLocation(messageBuilder, string.Empty, documentName, lineNumber, columnNumber, + sourceFragment); + } + } + + string errorMessage = messageBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(messageBuilder); + + return errorMessage; + } + + #endregion + + #region Generation of error details + /// /// Generates a detailed error message /// - /// JavaScript engine load exception + /// JS exception + /// Flag for whether to omit message /// Detailed error message - public static string Format(JsEngineLoadException jsEngineLoadException) + public static string GenerateErrorDetails(JsException jsException, bool omitMessage = false) { - var errorMessage = new StringBuilder(); - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Message, - jsEngineLoadException.Message); - if (!string.IsNullOrWhiteSpace(jsEngineLoadException.EngineMode)) + if (jsException == null) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_EngineMode, - jsEngineLoadException.EngineMode); + throw new ArgumentNullException(nameof(jsException)); } - return errorMessage.ToString(); + StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + WriteCommonErrorDetails(detailsBuilder, jsException, omitMessage); + + var jsScriptException = jsException as JsScriptException; + if (jsScriptException != null) + { + WriteScriptErrorDetails(detailsBuilder, jsScriptException); + + var jsRuntimeException = jsScriptException as JsRuntimeException; + if (jsRuntimeException != null) + { + WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); + } + } + + string errorDetails = detailsBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(detailsBuilder); + + return errorDetails; } /// /// Generates a detailed error message /// - /// JavaScript runtime exception + /// JS script exception + /// Flag for whether to omit message /// Detailed error message - public static string Format(JsRuntimeException jsRuntimeException) + public static string GenerateErrorDetails(JsScriptException jsScriptException, + bool omitMessage = false) { - var errorMessage = new StringBuilder(); - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Message, - jsRuntimeException.Message); - if (!string.IsNullOrWhiteSpace(jsRuntimeException.EngineMode)) + if (jsScriptException == null) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_EngineMode, - jsRuntimeException.EngineMode); + throw new ArgumentNullException(nameof(jsScriptException)); } - if (!string.IsNullOrWhiteSpace(jsRuntimeException.ErrorCode)) + + StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + WriteCommonErrorDetails(detailsBuilder, jsScriptException, omitMessage); + WriteScriptErrorDetails(detailsBuilder, jsScriptException); + + var jsRuntimeException = jsScriptException as JsRuntimeException; + if (jsRuntimeException != null) + { + WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); + } + + string errorDetails = detailsBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(detailsBuilder); + + return errorDetails; + } + + /// + /// Generates a detailed error message + /// + /// JS runtime exception + /// Flag for whether to omit message + /// Detailed error message + public static string GenerateErrorDetails(JsRuntimeException jsRuntimeException, + bool omitMessage = false) + { + if (jsRuntimeException == null) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_ErrorCode, - jsRuntimeException.ErrorCode); + throw new ArgumentNullException(nameof(jsRuntimeException)); } - if (!string.IsNullOrWhiteSpace(jsRuntimeException.Category)) + + StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + WriteCommonErrorDetails(detailsBuilder, jsRuntimeException, omitMessage); + WriteScriptErrorDetails(detailsBuilder, jsRuntimeException); + WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); + + string errorDetails = detailsBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(detailsBuilder); + + return errorDetails; + } + + /// + /// Writes a detailed error message to the buffer + /// + /// Instance of + /// JS exception + /// Flag for whether to omit message + private static void WriteCommonErrorDetails(StringBuilder buffer, JsException jsException, + bool omitMessage = false) + { + if (!omitMessage) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Category, - jsRuntimeException.Category); + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Message, + jsException.Message); } - if (jsRuntimeException.LineNumber > 0) + if (!string.IsNullOrWhiteSpace(jsException.EngineMode)) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_LineNumber, - jsRuntimeException.LineNumber.ToString(CultureInfo.InvariantCulture)); + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_EngineMode, + jsException.EngineMode); } - if (jsRuntimeException.ColumnNumber > 0) + if (!string.IsNullOrWhiteSpace(jsException.Category)) { - errorMessage.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_ColumnNumber, - jsRuntimeException.ColumnNumber.ToString(CultureInfo.InvariantCulture)); + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Category, + jsException.Category); } - if (!string.IsNullOrWhiteSpace(jsRuntimeException.SourceFragment)) + if (!string.IsNullOrWhiteSpace(jsException.Description)) { - errorMessage.AppendFormatLine("{1}:{0}{0}{2}", Environment.NewLine, - CommonStrings.ErrorDetails_SourceFragment, - jsRuntimeException.SourceFragment); + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Description, + jsException.Description); } - - return errorMessage.ToString(); } /// - /// Writes a information about error location to the buffer + /// Writes a detailed error message to the buffer /// /// Instance of - /// Document name - internal static void WriteErrorLocation(StringBuilder buffer, string documentName) + /// JS script exception + private static void WriteScriptErrorDetails(StringBuilder buffer, + JsScriptException jsScriptException) { - WriteErrorLocation(buffer, documentName, 0, 0); + if (!string.IsNullOrWhiteSpace(jsScriptException.Type)) + { + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_Type, + jsScriptException.Type); + } + if (!string.IsNullOrWhiteSpace(jsScriptException.DocumentName)) + { + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_DocumentName, + jsScriptException.DocumentName); + } + if (jsScriptException.LineNumber > 0) + { + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_LineNumber, + jsScriptException.LineNumber.ToString(CultureInfo.InvariantCulture)); + } + if (jsScriptException.ColumnNumber > 0) + { + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_ColumnNumber, + jsScriptException.ColumnNumber.ToString(CultureInfo.InvariantCulture)); + } + if (!string.IsNullOrWhiteSpace(jsScriptException.SourceFragment)) + { + buffer.AppendFormatLine("{0}: {1}", CommonStrings.ErrorDetails_SourceFragment, + jsScriptException.SourceFragment); + } } /// - /// Writes a information about error location to the buffer + /// Writes a detailed error message to the buffer /// /// Instance of - /// Line number + /// JS runtime exception + private static void WriteRuntimeErrorDetails(StringBuilder buffer, + JsRuntimeException jsRuntimeException) + { + if (!string.IsNullOrWhiteSpace(jsRuntimeException.CallStack)) + { + buffer.AppendFormatLine("{1}:{0}{0}{2}", Environment.NewLine, + CommonStrings.ErrorDetails_CallStack, + jsRuntimeException.CallStack); + } + } + + #endregion + + #region Misc + + /// + /// Gets a fragment from the source line + /// + /// Content of the source line /// Column number - internal static void WriteErrorLocation(StringBuilder buffer, int lineNumber, int columnNumber) + /// Maximum length of the source fragment + internal static string GetSourceFragment(string sourceLine, int columnNumber, + int maxFragmentLength = 100) { - WriteErrorLocation(buffer, string.Empty, lineNumber, columnNumber); + if (string.IsNullOrWhiteSpace(sourceLine)) + { + return string.Empty; + } + + string fragment; + int lineLength = sourceLine.Length; + + if (lineLength > maxFragmentLength) + { + const string ellipsisSymbol = "…"; + string startPart = string.Empty; + string endPart = string.Empty; + + var leftOffset = (int)Math.Floor((double)maxFragmentLength / 2); + int fragmentStartPosition = columnNumber - leftOffset - 1; + if (fragmentStartPosition < 0) + { + fragmentStartPosition = 0; + } + int fragmentLength = maxFragmentLength; + + if (fragmentStartPosition > 0) + { + startPart = ellipsisSymbol; + fragmentLength--; + } + if (fragmentStartPosition + maxFragmentLength < lineLength) + { + endPart = ellipsisSymbol; + fragmentLength--; + } + + StringBuilder fragmentBuilder = StringBuilderPool.GetBuilder(); + if (startPart.Length > 0) + { + fragmentBuilder.Append(startPart); + } + fragmentBuilder.Append(sourceLine.Substring(fragmentStartPosition, fragmentLength)); + if (endPart.Length > 0) + { + fragmentBuilder.Append(endPart); + } + + fragment = fragmentBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(fragmentBuilder); + } + else + { + fragment = sourceLine; + } + + return fragment; } /// /// Writes a information about error location to the buffer /// /// Instance of + /// Function name /// Document name /// Line number /// Column number - internal static void WriteErrorLocation(StringBuilder buffer, string documentName, - int lineNumber, int columnNumber) + /// Source fragment + internal static void WriteErrorLocation(StringBuilder buffer, string functionName, + string documentName, int lineNumber, int columnNumber, string sourceFragment = "") { + bool functionNameNotEmpty = !string.IsNullOrWhiteSpace(functionName); bool documentNameNotEmpty = !string.IsNullOrWhiteSpace(documentName); - if (documentNameNotEmpty || lineNumber > 0) + if (functionNameNotEmpty || documentNameNotEmpty || lineNumber > 0) { buffer.Append(" at "); - if (documentNameNotEmpty) + if (functionNameNotEmpty) { - buffer.Append(documentName); + buffer.Append(functionName); } - if (lineNumber > 0) + if (documentNameNotEmpty || lineNumber > 0) { + if (functionNameNotEmpty) + { + buffer.Append(" ("); + } if (documentNameNotEmpty) { - buffer.Append(":"); + buffer.Append(documentName); } - buffer.Append(lineNumber); - if (columnNumber > 0) + if (lineNumber > 0) { - buffer.AppendFormat(":{0}", columnNumber); + if (documentNameNotEmpty) + { + buffer.Append(":"); + } + buffer.Append(lineNumber); + if (columnNumber > 0) + { + buffer.AppendFormat(":{0}", columnNumber); + } + } + if (functionNameNotEmpty) + { + buffer.Append(")"); + } + if (!string.IsNullOrWhiteSpace(sourceFragment)) + { + buffer.Append(" -> "); + buffer.Append(sourceFragment); } } } } + + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs index 866daf5..b1f7511 100644 --- a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs @@ -22,8 +22,12 @@ public static class ValidationHelpers /// /// Regular expression for working with JS names /// - private static readonly Regex _jsNameRegex = new Regex(@"^[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]" + - @"[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\u200C\u200D\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$"); + private static readonly Regex _jsNameRegex = new Regex("^" + CommonRegExps.JsNamePattern + "$"); + + /// + /// Regular expression for working with document names + /// + private static readonly Regex _documentNameRegex = new Regex("^" + CommonRegExps.DocumentNamePattern + "$"); /// @@ -57,5 +61,15 @@ public static bool CheckNameFormat(string name) { return _jsNameRegex.IsMatch(name); } + + /// + /// Checks a format of the document name + /// + /// The document name + /// Result of check (true - correct format; false - wrong format) + public static bool CheckDocumentNameFormat(string name) + { + return _documentNameRegex.IsMatch(name); + } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index be18771..195f47d 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -28,7 +28,7 @@ private object InvokeDelegate(Delegate del, object[] args) { if (del == null) { - throw new ArgumentNullException("del"); + throw new ArgumentNullException(nameof(del)); } object[] processedArgs = args; diff --git a/src/MsieJavaScriptEngine/JsCompilationException.cs b/src/MsieJavaScriptEngine/JsCompilationException.cs new file mode 100644 index 0000000..fa47b06 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsCompilationException.cs @@ -0,0 +1,77 @@ +using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif + +using MsieJavaScriptEngine.Constants; + +namespace MsieJavaScriptEngine +{ + /// + /// The exception that is thrown during the script compilation stage, before the script + /// has begun to be executed + /// +#if !NETSTANDARD1_3 + [Serializable] +#endif + public sealed class JsCompilationException : JsScriptException + { + /// + /// Initializes a new instance of the class + /// with a specified error message + /// + /// The message that describes the error + public JsCompilationException(string message) + : base(message) + { + Category = JsErrorCategory.Compilation; + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception + /// + /// The error message that explains the reason for the exception + /// The exception that is the cause of the current exception + public JsCompilationException(string message, Exception innerException) + : base(message, innerException) + { + Category = JsErrorCategory.Compilation; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + public JsCompilationException(string message, string engineMode) + : base(message, engineMode) + { + Category = JsErrorCategory.Compilation; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + /// The exception that is the cause of the current exception + public JsCompilationException(string message, string engineMode, Exception innerException) + : base(message, engineMode, innerException) + { + Category = JsErrorCategory.Compilation; + } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private JsCompilationException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsEngineException.cs b/src/MsieJavaScriptEngine/JsEngineException.cs new file mode 100644 index 0000000..ee99952 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsEngineException.cs @@ -0,0 +1,76 @@ +using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif + +using MsieJavaScriptEngine.Constants; + +namespace MsieJavaScriptEngine +{ + /// + /// The exception that occurred in the workings of the JS engine itself + /// +#if !NETSTANDARD1_3 + [Serializable] +#endif + public class JsEngineException : JsException + { + /// + /// Initializes a new instance of the class + /// with a specified error message + /// + /// The message that describes the error + public JsEngineException(string message) + : base(message) + { + Category = JsErrorCategory.Engine; + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception + /// + /// The error message that explains the reason for the exception + /// The exception that is the cause of the current exception + public JsEngineException(string message, Exception innerException) + : base(message, innerException) + { + Category = JsErrorCategory.Engine; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + public JsEngineException(string message, string engineMode) + : base(message, engineMode) + { + Category = JsErrorCategory.Engine; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + /// The exception that is the cause of the current exception + public JsEngineException(string message, string engineMode, Exception innerException) + : base(message, engineMode, innerException) + { + Category = JsErrorCategory.Engine; + } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + protected JsEngineException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsEngineLoadException.cs b/src/MsieJavaScriptEngine/JsEngineLoadException.cs index a77a749..f3501c9 100644 --- a/src/MsieJavaScriptEngine/JsEngineLoadException.cs +++ b/src/MsieJavaScriptEngine/JsEngineLoadException.cs @@ -3,6 +3,8 @@ using System.Runtime.Serialization; #endif +using MsieJavaScriptEngine.Constants; + namespace MsieJavaScriptEngine { /// @@ -11,7 +13,7 @@ namespace MsieJavaScriptEngine #if !NETSTANDARD1_3 [Serializable] #endif - public sealed class JsEngineLoadException : JsException + public sealed class JsEngineLoadException : JsEngineException { /// /// Initializes a new instance of the class @@ -20,7 +22,9 @@ public sealed class JsEngineLoadException : JsException /// The message that describes the error public JsEngineLoadException(string message) : base(message) - { } + { + Category = JsErrorCategory.EngineLoad; + } /// /// Initializes a new instance of the class @@ -31,7 +35,9 @@ public JsEngineLoadException(string message) /// The exception that is the cause of the current exception public JsEngineLoadException(string message, Exception innerException) : base(message, innerException) - { } + { + Category = JsErrorCategory.EngineLoad; + } /// /// Initializes a new instance of the class @@ -40,7 +46,9 @@ public JsEngineLoadException(string message, Exception innerException) /// Name of JS engine mode public JsEngineLoadException(string message, string engineMode) : base(message, engineMode) - { } + { + Category = JsErrorCategory.EngineLoad; + } /// /// Initializes a new instance of the class @@ -50,7 +58,9 @@ public JsEngineLoadException(string message, string engineMode) /// The exception that is the cause of the current exception public JsEngineLoadException(string message, string engineMode, Exception innerException) : base(message, engineMode, innerException) - { } + { + Category = JsErrorCategory.EngineLoad; + } #if !NETSTANDARD1_3 /// diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index c789fa9..1f93d08 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -1,9 +1,14 @@ using System; +using System.Text; #if !NETSTANDARD1_3 using System.Runtime.Serialization; using System.Security.Permissions; #endif +using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine { /// @@ -19,6 +24,16 @@ public class JsException : Exception /// private readonly string _engineMode = string.Empty; + /// + /// Error category + /// + private string _category = JsErrorCategory.Unknown; + + /// + /// Description of error + /// + private string _description = string.Empty; + /// /// Gets a name of JS engine mode /// @@ -27,6 +42,24 @@ public string EngineMode get { return _engineMode; } } + /// + /// Gets or sets a error category + /// + public string Category + { + get { return _category; } + set { _category = value; } + } + + /// + /// Gets or sets a description of error + /// + public string Description + { + get { return _description; } + set { _description = value; } + } + /// /// Initializes a new instance of the class @@ -81,6 +114,8 @@ protected JsException(SerializationInfo info, StreamingContext context) if (info != null) { _engineMode = info.GetString("EngineMode"); + _category = info.GetString("Category"); + _description = info.GetString("Description"); } } @@ -97,14 +132,40 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont { if (info == null) { - throw new ArgumentNullException("info"); + throw new ArgumentNullException(nameof(info)); } base.GetObjectData(info, context); info.AddValue("EngineMode", _engineMode); + info.AddValue("Category", _category); + info.AddValue("Description", _description); } #endregion #endif + + #region Object overrides + + /// + /// Returns a string that represents the current exception + /// + /// A string that represents the current exception + public override string ToString() + { + string baseResult = base.ToString(); + string errorDetails = JsErrorHelpers.GenerateErrorDetails(this, true); + + StringBuilder resultBuilder = StringBuilderPool.GetBuilder(); + resultBuilder.AppendLine(baseResult); + resultBuilder.AppendLine("--- Script error details follow ---"); + resultBuilder.Append(errorDetails); + + string result = resultBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(resultBuilder); + + return result; + } + + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsScriptInterruptedException.cs b/src/MsieJavaScriptEngine/JsFatalException.cs similarity index 59% rename from src/MsieJavaScriptEngine/JsScriptInterruptedException.cs rename to src/MsieJavaScriptEngine/JsFatalException.cs index f85e09f..7bc55bf 100644 --- a/src/MsieJavaScriptEngine/JsScriptInterruptedException.cs +++ b/src/MsieJavaScriptEngine/JsFatalException.cs @@ -3,62 +3,72 @@ using System.Runtime.Serialization; #endif +using MsieJavaScriptEngine.Constants; + namespace MsieJavaScriptEngine { /// - /// The exception that is thrown when script execution is interrupted by the host + /// The fatal exception occurred /// #if !NETSTANDARD1_3 [Serializable] #endif - public sealed class JsScriptInterruptedException : JsException + public sealed class JsFatalException : JsException { /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class /// with a specified error message /// /// The message that describes the error - public JsScriptInterruptedException(string message) + public JsFatalException(string message) : base(message) - { } + { + Category = JsErrorCategory.Fatal; + } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class /// with a specified error message and a reference to the inner exception /// that is the cause of this exception /// /// The error message that explains the reason for the exception /// The exception that is the cause of the current exception - public JsScriptInterruptedException(string message, Exception innerException) + public JsFatalException(string message, Exception innerException) : base(message, innerException) - { } + { + Category = JsErrorCategory.Fatal; + } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class /// /// The error message that explains the reason for the exception /// Name of JS engine mode - public JsScriptInterruptedException(string message, string engineMode) + public JsFatalException(string message, string engineMode) : base(message, engineMode) - { } + { + Category = JsErrorCategory.Fatal; + } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class /// /// The error message that explains the reason for the exception /// Name of JS engine mode /// The exception that is the cause of the current exception - public JsScriptInterruptedException(string message, string engineMode, Exception innerException) + public JsFatalException(string message, string engineMode, Exception innerException) : base(message, engineMode, innerException) - { } + { + Category = JsErrorCategory.Fatal; + } #if !NETSTANDARD1_3 /// - /// Initializes a new instance of the class with serialized data + /// Initializes a new instance of the class with serialized data /// /// The object that holds the serialized data /// The contextual information about the source or destination - private JsScriptInterruptedException(SerializationInfo info, StreamingContext context) + private JsFatalException(SerializationInfo info, StreamingContext context) : base(info, context) { } #endif diff --git a/src/MsieJavaScriptEngine/JsInterruptedException.cs b/src/MsieJavaScriptEngine/JsInterruptedException.cs new file mode 100644 index 0000000..944d45a --- /dev/null +++ b/src/MsieJavaScriptEngine/JsInterruptedException.cs @@ -0,0 +1,76 @@ +using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif + +using MsieJavaScriptEngine.Constants; + +namespace MsieJavaScriptEngine +{ + /// + /// The exception that is thrown when script execution is interrupted by the host + /// +#if !NETSTANDARD1_3 + [Serializable] +#endif + public sealed class JsInterruptedException : JsRuntimeException + { + /// + /// Initializes a new instance of the class + /// with a specified error message + /// + /// The message that describes the error + public JsInterruptedException(string message) + : base(message) + { + Category = JsErrorCategory.Interrupted; + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception + /// + /// The error message that explains the reason for the exception + /// The exception that is the cause of the current exception + public JsInterruptedException(string message, Exception innerException) + : base(message, innerException) + { + Category = JsErrorCategory.Interrupted; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + public JsInterruptedException(string message, string engineMode) + : base(message, engineMode) + { + Category = JsErrorCategory.Interrupted; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + /// The exception that is the cause of the current exception + public JsInterruptedException(string message, string engineMode, Exception innerException) + : base(message, engineMode, innerException) + { + Category = JsErrorCategory.Interrupted; + } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private JsInterruptedException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index b10ec16..e40107f 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -3,10 +3,6 @@ using System.Collections.Generic; using System.Runtime.InteropServices; #endif -using System.Text; -using System.Text.RegularExpressions; - -using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.JsRt { @@ -15,13 +11,6 @@ namespace MsieJavaScriptEngine.JsRt /// internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase { - /// - /// Regular expression for working with the string representation of error - /// - private static readonly Regex _errorStringRegex = - new Regex(@"[ ]{3,5}at (?:[A-Za-z_\$][0-9A-Za-z_\$ ]* )?" + - @"\([^\s*?""<>|][^\t\n\r*?""<>|]*?:(?\d+):(?\d+)\)"); - /// /// JS source context /// @@ -63,60 +52,6 @@ protected ChakraJsRtJsEngineBase(JsEngineSettings settings) } - /// - /// Generates a error message with location - /// - /// Error category - /// Error message - /// Line number - /// Column number - /// Error message with location - protected static string GenerateErrorMessageWithLocation(string category, string message, - int lineNumber, int columnNumber) - { - var messageBuilder = new StringBuilder(); - if (!string.IsNullOrWhiteSpace(category)) - { - messageBuilder.AppendFormat("{0}: ", category); - } - messageBuilder.Append(message); - if (lineNumber > 0) - { - messageBuilder.AppendLine(); - JsErrorHelpers.WriteErrorLocation(messageBuilder, lineNumber, columnNumber); - } - - string errorMessage = messageBuilder.ToString(); - messageBuilder.Clear(); - - return errorMessage; - } - - /// - /// Gets a error coordinates from message - /// - /// Error message - /// Line number - /// Column number - protected static void GetErrorCoordinatesFromMessage(string message, out int lineNumber, - out int columnNumber) - { - lineNumber = 0; - columnNumber = 0; - - if (!string.IsNullOrWhiteSpace(message)) - { - Match errorStringMatch = _errorStringRegex.Match(message); - if (errorStringMatch.Success) - { - GroupCollection errorStringGroups = errorStringMatch.Groups; - - lineNumber = int.Parse(errorStringGroups["lineNumber"].Value); - columnNumber = int.Parse(errorStringGroups["columnNumber"].Value); - } - } - } - /// /// Starts debugging /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index fcaeb05..84e83ea 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -2,7 +2,6 @@ #if NETSTANDARD using System.Collections.Generic; #endif -using System.Globalization; using System.Linq; #if NETSTANDARD using System.Reflection; @@ -13,11 +12,22 @@ using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; -using HostException = MsieJavaScriptEngine.JsException; -using HostExtendedException = MsieJavaScriptEngine.JsRuntimeException; -using HostInterruptedException = MsieJavaScriptEngine.JsScriptInterruptedException; -using ScriptException = MsieJavaScriptEngine.JsRt.JsException; -using ScriptExtendedException = MsieJavaScriptEngine.JsRt.Edge.EdgeJsScriptException; + +using WrapperCompilationException = MsieJavaScriptEngine.JsCompilationException; +using WrapperEngineException = MsieJavaScriptEngine.JsEngineException; +using WrapperEngineLoadException = MsieJavaScriptEngine.JsEngineLoadException; +using WrapperException = MsieJavaScriptEngine.JsException; +using WrapperFatalException = MsieJavaScriptEngine.JsFatalException; +using WrapperInterruptedException = MsieJavaScriptEngine.JsInterruptedException; +using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; +using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; +using WrapperUsageException = MsieJavaScriptEngine.JsUsageException; + +using OriginalEngineException = MsieJavaScriptEngine.JsRt.JsEngineException; +using OriginalException = MsieJavaScriptEngine.JsRt.JsException; +using OriginalFatalException = MsieJavaScriptEngine.JsRt.JsFatalException; +using OriginalScriptException = MsieJavaScriptEngine.JsRt.Edge.EdgeJsScriptException; +using OriginalUsageException = MsieJavaScriptEngine.JsRt.JsUsageException; namespace MsieJavaScriptEngine.JsRt.Edge { @@ -69,24 +79,31 @@ public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) _jsContext = _jsRuntime.CreateContext(); _jsContext.AddRef(); } - catch (JsUsageException e) + catch (DllNotFoundException e) + { + if (e.Message.IndexOf("'" + DllName.Chakra + "'", StringComparison.OrdinalIgnoreCase) != -1) + { + throw new WrapperEngineLoadException( + string.Format(CommonStrings.Engine_EdgeJsEngineNotLoaded, e.Message), + _engineModeName + ); + } + + throw; + } + catch (OriginalException e) { - string errorMessage; if (e.ErrorCode == JsErrorCode.WrongThread) { - errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + throw new WrapperUsageException( + CommonStrings.Usage_JsEnginesConflictOnMachine, + _engineModeName + ); } else { - errorMessage = string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message); + throw ConvertOriginalExceptionToWrapperException(e); } - - throw new JsEngineLoadException(errorMessage, _engineModeName); - } - catch (Exception e) - { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_EdgeJsEngineNotLoaded, e.Message), _engineModeName); } }); } @@ -838,97 +855,150 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) } #endif - private HostException ConvertScriptExceptionToHostException(ScriptException scriptException) + private WrapperException ConvertOriginalExceptionToWrapperException( + OriginalException originalException) { - HostException hostException; - string message = scriptException.Message; - string category = string.Empty; - JsErrorCode errorCode = scriptException.ErrorCode; - - if (errorCode == JsErrorCode.ScriptTerminated) + WrapperException wrapperException; + JsErrorCode errorCode = originalException.ErrorCode; + string description = originalException.Message; + string message = description; + string type = string.Empty; + string documentName = string.Empty; + int lineNumber = 0; + int columnNumber = 0; + string callStack = string.Empty; + string sourceFragment = string.Empty; + + var originalScriptException = originalException as OriginalScriptException; + if (originalScriptException != null) { - hostException = new HostInterruptedException(CommonStrings.Runtime_ScriptInterrupted, - _engineModeName, scriptException); - } - else - { - int lineNumber = 0; - int columnNumber = 0; - string sourceFragment = string.Empty; + EdgeJsValue errorValue = originalScriptException.Error; - var scriptExtendedException = scriptException as ScriptExtendedException; - if (scriptExtendedException != null) + if (errorValue.IsValid) { - category = "Script error"; - EdgeJsValue errorValue = scriptExtendedException.Error; + EdgeJsValue messagePropertyValue = errorValue.GetProperty("message"); + description = messagePropertyValue.ConvertToString().ToString(); + + EdgeJsValue namePropertyValue = errorValue.GetProperty("name"); + type = namePropertyValue.ConvertToString().ToString(); - if (errorValue.IsValid) + EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) { - EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); - if (errorValue.HasProperty(linePropertyId)) + EdgeJsPropertyId descriptionPropertyId = EdgeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) { - EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; + EdgeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + description = descriptionPropertyValue.ConvertToString().ToString(); } - EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); - if (errorValue.HasProperty(columnPropertyId)) + EdgeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); + string messageWithTypeAndCallStack = stackPropertyValue.ConvertToString().ToString(); + string messageWithType = errorValue.ConvertToString().ToString(); + string rawCallStack = messageWithTypeAndCallStack + .TrimStart(messageWithType) + .TrimStart(new char[] { '\n', '\r' }) + ; + + CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + if (callStackItems.Length > 0) { - EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; + CallStackItem firstCallStackItem = callStackItems[0]; + documentName = firstCallStackItem.DocumentName; + lineNumber = firstCallStackItem.LineNumber; + columnNumber = firstCallStackItem.ColumnNumber; + callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); } - EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); + } + else + { + EdgeJsPropertyId urlPropertyId = EdgeJsPropertyId.FromString("url"); + if (errorValue.HasProperty(urlPropertyId)) { - EdgeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); - message = stackPropertyValue.ConvertToString().ToString(); + EdgeJsValue urlPropertyValue = errorValue.GetProperty(urlPropertyId); + documentName = urlPropertyValue.ConvertToString().ToString(); } - else + + EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); + if (errorValue.HasProperty(linePropertyId)) { - EdgeJsValue messagePropertyValue = errorValue.GetProperty("message"); - string scriptMessage = messagePropertyValue.ConvertToString().ToString(); - message = GenerateErrorMessageWithLocation(message.TrimEnd('.'), scriptMessage, - lineNumber, columnNumber); + EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); + lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; } - if (lineNumber <= 0 && columnNumber <= 0) + EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); + if (errorValue.HasProperty(columnPropertyId)) { - GetErrorCoordinatesFromMessage(message, out lineNumber, out columnNumber); + EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; } + string sourceLine = string.Empty; EdgeJsPropertyId sourcePropertyId = EdgeJsPropertyId.FromString("source"); if (errorValue.HasProperty(sourcePropertyId)) { EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceFragment = sourcePropertyValue.ConvertToString().ToString(); + sourceLine = sourcePropertyValue.ConvertToString().ToString(); } + + sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + lineNumber, columnNumber, sourceFragment); } } - else if (scriptException is JsUsageException) + + WrapperScriptException wrapperScriptException; + if (errorCode == JsErrorCode.ScriptCompile) { - category = "Usage error"; + wrapperScriptException = new WrapperCompilationException(message, _engineModeName, + originalScriptException); } - else if (scriptException is JsEngineException) + else if (errorCode == JsErrorCode.ScriptTerminated) { - category = "Engine error"; + wrapperScriptException = new WrapperInterruptedException(CommonStrings.Runtime_ScriptInterrupted, + _engineModeName, originalScriptException); } - else if (scriptException is JsFatalException) + else { - category = "Fatal error"; + wrapperScriptException = new WrapperRuntimeException(message, _engineModeName, + originalScriptException) + { + CallStack = callStack + }; } + wrapperScriptException.Type = type; + wrapperScriptException.DocumentName = documentName; + wrapperScriptException.LineNumber = lineNumber; + wrapperScriptException.ColumnNumber = columnNumber; + wrapperScriptException.SourceFragment = sourceFragment; - hostException = new HostExtendedException(message, _engineModeName, scriptException) + wrapperException = wrapperScriptException; + } + else + { + if (originalException is OriginalUsageException) { - ErrorCode = ((uint)errorCode).ToString(CultureInfo.InvariantCulture), - Category = category, - LineNumber = lineNumber, - ColumnNumber = columnNumber, - SourceFragment = sourceFragment - }; + wrapperException = new WrapperUsageException(message, _engineModeName, originalException); + } + else if (originalException is OriginalEngineException) + { + wrapperException = new WrapperEngineException(message, _engineModeName, originalException); + } + else if (originalException is OriginalFatalException) + { + wrapperException = new WrapperFatalException(message, _engineModeName, originalException); + } + else + { + wrapperException = new WrapperException(message, _engineModeName, originalException); + } } - return hostException; + wrapperException.Description = description; + + return wrapperException; } #endregion @@ -961,9 +1031,9 @@ public override object Evaluate(string expression, string documentName) return MapToHostType(resultValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -981,9 +1051,9 @@ public override void Execute(string code, string documentName) { EdgeJsContext.RunScript(code, _jsSourceContext++, documentName); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1003,8 +1073,10 @@ public override object CallFunction(string functionName, params object[] args) bool functionExist = globalObj.HasProperty(functionId); if (!functionExist) { - throw new JsRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); } EdgeJsValue resultValue; @@ -1037,9 +1109,9 @@ public override object CallFunction(string functionName, params object[] args) return MapToHostType(resultValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1067,9 +1139,9 @@ public override bool HasVariable(string variableName) return variableExist; } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1089,9 +1161,9 @@ public override object GetVariableValue(string variableName) return MapToHostType(variableValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1108,11 +1180,14 @@ public override void SetVariableValue(string variableName, object value) try { EdgeJsValue inputValue = MapToScriptType(value); + + AddReferenceToValue(inputValue); EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + RemoveReferenceToValue(inputValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1134,9 +1209,9 @@ public override void RemoveVariable(string variableName) globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); } } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1153,9 +1228,9 @@ public override void EmbedHostObject(string itemName, object value) EdgeJsValue processedValue = MapToScriptType(value); EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1176,9 +1251,9 @@ public override void EmbedHostType(string itemName, Type type) #endif EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs index bb92be3..c9150df 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs @@ -83,18 +83,6 @@ public static void ThrowIfError(JsErrorCode error) #region Script case JsErrorCode.ScriptException: - { - EdgeJsValue errorObject; - JsErrorCode innerError = EdgeNativeMethods.JsGetAndClearException(out errorObject); - - if (innerError != JsErrorCode.NoError) - { - throw new JsFatalException(innerError); - } - - throw new EdgeJsScriptException(error, errorObject, "Script threw an exception."); - } - case JsErrorCode.ScriptCompile: { EdgeJsValue errorObject; @@ -105,7 +93,10 @@ public static void ThrowIfError(JsErrorCode error) throw new JsFatalException(innerError); } - throw new EdgeJsScriptException(error, errorObject, "Compile error."); + string message = error == JsErrorCode.ScriptCompile ? + "Compile error." : "Script threw an exception."; + + throw new EdgeJsScriptException(error, errorObject, message); } case JsErrorCode.ScriptTerminated: diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 87a9896..61bf336 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -2,7 +2,6 @@ #if NETSTANDARD using System.Collections.Generic; #endif -using System.Globalization; using System.Linq; #if NETSTANDARD using System.Reflection; @@ -14,11 +13,22 @@ using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; -using HostException = MsieJavaScriptEngine.JsException; -using HostExtendedException = MsieJavaScriptEngine.JsRuntimeException; -using HostInterruptedException = MsieJavaScriptEngine.JsScriptInterruptedException; -using ScriptException = MsieJavaScriptEngine.JsRt.JsException; -using ScriptExtendedException = MsieJavaScriptEngine.JsRt.Ie.IeJsScriptException; + +using WrapperCompilationException = MsieJavaScriptEngine.JsCompilationException; +using WrapperEngineException = MsieJavaScriptEngine.JsEngineException; +using WrapperEngineLoadException = MsieJavaScriptEngine.JsEngineLoadException; +using WrapperException = MsieJavaScriptEngine.JsException; +using WrapperFatalException = MsieJavaScriptEngine.JsFatalException; +using WrapperInterruptedException = MsieJavaScriptEngine.JsInterruptedException; +using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; +using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; +using WrapperUsageException = MsieJavaScriptEngine.JsUsageException; + +using OriginalEngineException = MsieJavaScriptEngine.JsRt.JsEngineException; +using OriginalException = MsieJavaScriptEngine.JsRt.JsException; +using OriginalFatalException = MsieJavaScriptEngine.JsRt.JsFatalException; +using OriginalScriptException = MsieJavaScriptEngine.JsRt.Ie.IeJsScriptException; +using OriginalUsageException = MsieJavaScriptEngine.JsRt.JsUsageException; namespace MsieJavaScriptEngine.JsRt.Ie { @@ -75,26 +85,51 @@ public ChakraIeJsRtJsEngine(JsEngineSettings settings) _jsContext = _jsRuntime.CreateContext(); _jsContext.AddRef(); } - catch (JsUsageException e) + catch (DllNotFoundException e) { - string errorMessage; - if (e.ErrorCode == JsErrorCode.WrongThread) + if (e.Message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1) { - errorMessage = CommonStrings.Runtime_JsEnginesConflictOnMachine; + throw new WrapperEngineLoadException( + string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, + _engineModeName, LOWER_IE_VERSION, e.Message), + _engineModeName + ); } - else + + throw; + } +#if NETSTANDARD + catch (TypeLoadException e) +#else + catch (EntryPointNotFoundException e) +#endif + { + string message = e.Message; + if (message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1 + && message.IndexOf("'JsCreateRuntime'", StringComparison.OrdinalIgnoreCase) != -1) { - errorMessage = string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message); + throw new WrapperEngineLoadException( + string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, + _engineModeName, LOWER_IE_VERSION, e.Message), + _engineModeName + ); } - throw new JsEngineLoadException(errorMessage, _engineModeName); + throw; } - catch (Exception e) + catch (OriginalException e) { - throw new JsEngineLoadException( - string.Format(CommonStrings.Runtime_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message), _engineModeName); + if (e.ErrorCode == JsErrorCode.WrongThread) + { + throw new WrapperUsageException( + CommonStrings.Usage_JsEnginesConflictOnMachine, + _engineModeName + ); + } + else + { + throw ConvertOriginalExceptionToWrapperException(e); + } } }); } @@ -862,97 +897,162 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) } #endif - private HostException ConvertScriptExceptionToHostException(ScriptException scriptException) + private WrapperException ConvertOriginalExceptionToWrapperException( + OriginalException originalException) { - HostException hostException; - string message = scriptException.Message; - string category = string.Empty; - JsErrorCode errorCode = scriptException.ErrorCode; - - if (errorCode == JsErrorCode.ScriptTerminated) + WrapperException wrapperException; + JsErrorCode errorCode = originalException.ErrorCode; + string description = originalException.Message; + string message = description; + string type = string.Empty; + string documentName = string.Empty; + int lineNumber = 0; + int columnNumber = 0; + string callStack = string.Empty; + string sourceFragment = string.Empty; + + var originalScriptException = originalException as OriginalScriptException; + if (originalScriptException != null) { - hostException = new HostInterruptedException(CommonStrings.Runtime_ScriptInterrupted, - _engineModeName, scriptException); - } - else - { - int lineNumber = 0; - int columnNumber = 0; - string sourceFragment = string.Empty; + IeJsValue errorValue = originalScriptException.Error; - var scriptExtendedException = scriptException as ScriptExtendedException; - if (scriptExtendedException != null) + if (errorValue.IsValid) { - category = "Script error"; - IeJsValue errorValue = scriptExtendedException.Error; + IeJsValue messagePropertyValue = errorValue.GetProperty("message"); + description = messagePropertyValue.ConvertToString().ToString(); - if (errorValue.IsValid) + IeJsValue namePropertyValue = errorValue.GetProperty("name"); + type = namePropertyValue.ConvertToString().ToString(); + + IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) { - IeJsPropertyId linePropertyId = IeJsPropertyId.FromString("line"); - if (errorValue.HasProperty(linePropertyId)) + IeJsPropertyId descriptionPropertyId = IeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) { - IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = (int) linePropertyValue.ConvertToNumber().ToDouble() + 1; + IeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + description = descriptionPropertyValue.ConvertToString().ToString(); } - IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); - if (errorValue.HasProperty(columnPropertyId)) - { - IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = (int) columnPropertyValue.ConvertToNumber().ToDouble() + 1; - } + IeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); + string messageWithTypeAndCallStack = stackPropertyValue.ConvertToString().ToString(); + string messageWithType = errorValue.ConvertToString().ToString(); + string rawCallStack = messageWithTypeAndCallStack + .TrimStart(messageWithType) + .TrimStart(new char[] { '\n', '\r' }) + ; + + CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + FixCallStackItems(callStackItems); - IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + if (callStackItems.Length > 0) { - IeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); - message = stackPropertyValue.ConvertToString().ToString(); + CallStackItem firstCallStackItem = callStackItems[0]; + documentName = firstCallStackItem.DocumentName; + lineNumber = firstCallStackItem.LineNumber; + columnNumber = firstCallStackItem.ColumnNumber; + callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); } - else + + message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); + } + else + { + type = errorCode == JsErrorCode.ScriptCompile ? JsErrorType.Syntax : type; + + IeJsPropertyId linePropertyId = IeJsPropertyId.FromString("line"); + if (errorValue.HasProperty(linePropertyId)) { - IeJsValue messagePropertyValue = errorValue.GetProperty("message"); - string scriptMessage = messagePropertyValue.ConvertToString().ToString(); - message = GenerateErrorMessageWithLocation(message.TrimEnd('.'), scriptMessage, - lineNumber, columnNumber); + IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); + lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; } - if (lineNumber <= 0 && columnNumber <= 0) + IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); + if (errorValue.HasProperty(columnPropertyId)) { - GetErrorCoordinatesFromMessage(message, out lineNumber, out columnNumber); + IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; } + string sourceLine = string.Empty; IeJsPropertyId sourcePropertyId = IeJsPropertyId.FromString("source"); if (errorValue.HasProperty(sourcePropertyId)) { IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceFragment = sourcePropertyValue.ConvertToString().ToString(); + sourceLine = sourcePropertyValue.ConvertToString().ToString(); } + + sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + lineNumber, columnNumber, sourceFragment); } } - else if (scriptException is JsUsageException) + + WrapperScriptException wrapperScriptException; + if (errorCode == JsErrorCode.ScriptCompile) { - category = "Usage error"; + wrapperScriptException = new WrapperCompilationException(message, _engineModeName, + originalScriptException); } - else if (scriptException is JsEngineException) + else if (errorCode == JsErrorCode.ScriptTerminated) { - category = "Engine error"; + wrapperScriptException = new WrapperInterruptedException(CommonStrings.Runtime_ScriptInterrupted, + _engineModeName, originalScriptException); } - else if (scriptException is JsFatalException) + else { - category = "Fatal error"; + wrapperScriptException = new WrapperRuntimeException(message, _engineModeName, + originalScriptException) + { + CallStack = callStack + }; } + wrapperScriptException.Type = type; + wrapperScriptException.DocumentName = documentName; + wrapperScriptException.LineNumber = lineNumber; + wrapperScriptException.ColumnNumber = columnNumber; + wrapperScriptException.SourceFragment = sourceFragment; - hostException = new HostExtendedException(message, _engineModeName, scriptException) + wrapperException = wrapperScriptException; + } + else + { + if (originalException is OriginalUsageException) { - ErrorCode = ((uint)errorCode).ToString(CultureInfo.InvariantCulture), - Category = category, - LineNumber = lineNumber, - ColumnNumber = columnNumber, - SourceFragment = sourceFragment - }; + wrapperException = new WrapperUsageException(message, _engineModeName, originalException); + } + else if (originalException is OriginalEngineException) + { + wrapperException = new WrapperEngineException(message, _engineModeName, originalException); + } + else if (originalException is OriginalFatalException) + { + wrapperException = new WrapperFatalException(message, _engineModeName, originalException); + } + else + { + wrapperException = new WrapperException(message, _engineModeName, originalException); + } } - return hostException; + wrapperException.Description = description; + + return wrapperException; + } + + /// + /// Fixes a function name in call stack items + /// + /// An array of instances + private static void FixCallStackItems(CallStackItem[] callStackItems) + { + foreach (CallStackItem callStackItem in callStackItems) + { + if (callStackItem.FunctionName.Equals("Unknown script code", StringComparison.OrdinalIgnoreCase)) + { + callStackItem.FunctionName = "Global code"; + } + } } #endregion @@ -1000,9 +1100,9 @@ public override object Evaluate(string expression, string documentName) return MapToHostType(resultValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1020,9 +1120,9 @@ public override void Execute(string code, string documentName) { IeJsContext.RunScript(code, _jsSourceContext++, documentName); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1042,8 +1142,10 @@ public override object CallFunction(string functionName, params object[] args) bool functionExist = globalObj.HasProperty(functionId); if (!functionExist) { - throw new JsRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName)); + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); } IeJsValue resultValue; @@ -1076,9 +1178,9 @@ public override object CallFunction(string functionName, params object[] args) return MapToHostType(resultValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1106,9 +1208,9 @@ public override bool HasVariable(string variableName) return variableExist; } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1128,9 +1230,9 @@ public override object GetVariableValue(string variableName) return MapToHostType(variableValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1147,11 +1249,14 @@ public override void SetVariableValue(string variableName, object value) try { IeJsValue inputValue = MapToScriptType(value); + + AddReferenceToValue(inputValue); IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + RemoveReferenceToValue(inputValue); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1173,9 +1278,9 @@ public override void RemoveVariable(string variableName) globalObj.SetProperty(variableId, IeJsValue.Undefined, true); } } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1192,9 +1297,9 @@ public override void EmbedHostObject(string itemName, object value) IeJsValue processedValue = MapToScriptType(value); IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); @@ -1215,9 +1320,9 @@ public override void EmbedHostType(string itemName, Type type) #endif IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); } - catch (JsException e) + catch (OriginalException e) { - throw ConvertScriptExceptionToHostException(e); + throw ConvertOriginalExceptionToWrapperException(e); } } }); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs index d221437..e3e3f31 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs @@ -83,18 +83,6 @@ public static void ThrowIfError(JsErrorCode error) #region Script case JsErrorCode.ScriptException: - { - IeJsValue errorObject; - JsErrorCode innerError = IeNativeMethods.JsGetAndClearException(out errorObject); - - if (innerError != JsErrorCode.NoError) - { - throw new JsFatalException(innerError); - } - - throw new IeJsScriptException(error, errorObject, "Script threw an exception."); - } - case JsErrorCode.ScriptCompile: { IeJsValue errorObject; @@ -105,7 +93,10 @@ public static void ThrowIfError(JsErrorCode error) throw new JsFatalException(innerError); } - throw new IeJsScriptException(error, errorObject, "Compile error."); + string message = error == JsErrorCode.ScriptCompile ? + "Compile error." : "Script threw an exception."; + + throw new IeJsScriptException(error, errorObject, message); } case JsErrorCode.ScriptTerminated: diff --git a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs index e09e0bb..86a290a 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -6,7 +6,7 @@ namespace MsieJavaScriptEngine.JsRt { /// - /// The exception that occurred in the workings of the JavaScript engine itself + /// The exception that occurred in the workings of the JS engine itself /// #if !NETSTANDARD1_3 [Serializable] diff --git a/src/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs index 1d5c690..f548c14 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsException.cs @@ -76,7 +76,7 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont { if (info == null) { - throw new ArgumentNullException("info"); + throw new ArgumentNullException(nameof(info)); } base.GetObjectData(info, context); diff --git a/src/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs index 75b6198..20e9c19 100644 --- a/src/MsieJavaScriptEngine/JsRuntimeException.cs +++ b/src/MsieJavaScriptEngine/JsRuntimeException.cs @@ -4,84 +4,30 @@ using System.Security.Permissions; #endif +using MsieJavaScriptEngine.Constants; + namespace MsieJavaScriptEngine { /// - /// The exception that is thrown during a execution of code by JS engine + /// The exception that is thrown during the script execution /// #if !NETSTANDARD1_3 [Serializable] #endif - public sealed class JsRuntimeException : JsException + public class JsRuntimeException : JsScriptException { /// - /// Error code - /// - private string _errorCode = string.Empty; - - /// - /// Error category + /// String representation of the script call stack /// - private string _category = string.Empty; + private string _callStack = string.Empty; /// - /// Line number + /// Gets or sets a string representation of the script call stack /// - private int _lineNumber; - - /// - /// Column number - /// - private int _columnNumber; - - /// - /// Source fragment - /// - private string _sourceFragment = string.Empty; - - /// - /// Gets or sets a error code - /// - public string ErrorCode + public string CallStack { - get { return _errorCode; } - set { _errorCode = value; } - } - - /// - /// Gets or sets a error category - /// - public string Category - { - get { return _category; } - set { _category = value; } - } - - /// - /// Gets or sets a line number - /// - public int LineNumber - { - get { return _lineNumber; } - set { _lineNumber = value; } - } - - /// - /// Gets or sets a column number - /// - public int ColumnNumber - { - get { return _columnNumber; } - set { _columnNumber = value; } - } - - /// - /// Gets or sets a source fragment - /// - public string SourceFragment - { - get { return _sourceFragment; } - set { _sourceFragment = value; } + get { return _callStack; } + set { _callStack = value; } } @@ -92,7 +38,9 @@ public string SourceFragment /// The message that describes the error public JsRuntimeException(string message) : base(message) - { } + { + Category = JsErrorCategory.Runtime; + } /// /// Initializes a new instance of the class @@ -103,7 +51,9 @@ public JsRuntimeException(string message) /// The exception that is the cause of the current exception public JsRuntimeException(string message, Exception innerException) : base(message, innerException) - { } + { + Category = JsErrorCategory.Runtime; + } /// /// Initializes a new instance of the class @@ -112,7 +62,9 @@ public JsRuntimeException(string message, Exception innerException) /// Name of JS engine mode public JsRuntimeException(string message, string engineMode) : base(message, engineMode) - { } + { + Category = JsErrorCategory.Runtime; + } /// /// Initializes a new instance of the class @@ -122,7 +74,9 @@ public JsRuntimeException(string message, string engineMode) /// The exception that is the cause of the current exception public JsRuntimeException(string message, string engineMode, Exception innerException) : base(message, engineMode, innerException) - { } + { + Category = JsErrorCategory.Runtime; + } #if !NETSTANDARD1_3 /// @@ -130,16 +84,12 @@ public JsRuntimeException(string message, string engineMode, Exception innerExce /// /// The object that holds the serialized data /// The contextual information about the source or destination - private JsRuntimeException(SerializationInfo info, StreamingContext context) + protected JsRuntimeException(SerializationInfo info, StreamingContext context) : base(info, context) { if (info != null) { - _errorCode = info.GetString("ErrorCode"); - _category = info.GetString("Category"); - _lineNumber = info.GetInt32("LineNumber"); - _columnNumber = info.GetInt32("ColumnNumber"); - _sourceFragment = info.GetString("SourceFragment"); + _callStack = info.GetString("CallStack"); } } @@ -156,15 +106,11 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont { if (info == null) { - throw new ArgumentNullException("info"); + throw new ArgumentNullException(nameof(info)); } base.GetObjectData(info, context); - info.AddValue("ErrorCode", _errorCode); - info.AddValue("Category", _category); - info.AddValue("LineNumber", _lineNumber); - info.AddValue("ColumnNumber", _columnNumber); - info.AddValue("SourceFragment", _sourceFragment); + info.AddValue("CallStack", _callStack); } #endregion diff --git a/src/MsieJavaScriptEngine/JsScriptException.cs b/src/MsieJavaScriptEngine/JsScriptException.cs new file mode 100644 index 0000000..d82951c --- /dev/null +++ b/src/MsieJavaScriptEngine/JsScriptException.cs @@ -0,0 +1,173 @@ +using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +using System.Security.Permissions; +#endif + +namespace MsieJavaScriptEngine +{ + /// + /// The exception that is thrown during the script processing + /// +#if !NETSTANDARD1_3 + [Serializable] +#endif + public class JsScriptException : JsException + { + /// + /// Type of the script error + /// + private string _type = string.Empty; + + /// + /// Document name + /// + private string _documentName = string.Empty; + + /// + /// Line number + /// + private int _lineNumber; + + /// + /// Column number + /// + private int _columnNumber; + + /// + /// Source fragment + /// + private string _sourceFragment = string.Empty; + + /// + /// Gets or sets a type of the script error + /// + public string Type + { + get; + set; + } + + /// + /// Gets or sets a document name + /// + public string DocumentName + { + get { return _documentName; } + set { _documentName = value; } + } + + /// + /// Gets or sets a line number + /// + public int LineNumber + { + get { return _lineNumber; } + set { _lineNumber = value; } + } + + /// + /// Gets or sets a column number + /// + public int ColumnNumber + { + get { return _columnNumber; } + set { _columnNumber = value; } + } + + /// + /// Gets or sets a source fragment + /// + public string SourceFragment + { + get { return _sourceFragment; } + set { _sourceFragment = value; } + } + + + /// + /// Initializes a new instance of the class + /// with a specified error message + /// + /// The message that describes the error + public JsScriptException(string message) + : base(message) + { } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception + /// + /// The error message that explains the reason for the exception + /// The exception that is the cause of the current exception + public JsScriptException(string message, Exception innerException) + : base(message, innerException) + { } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + public JsScriptException(string message, string engineMode) + : base(message, engineMode) + { } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + /// The exception that is the cause of the current exception + public JsScriptException(string message, string engineMode, Exception innerException) + : base(message, engineMode, innerException) + { } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + protected JsScriptException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info != null) + { + _type = info.GetString("Type"); + _documentName = info.GetString("DocumentName"); + _lineNumber = info.GetInt32("LineNumber"); + _columnNumber = info.GetInt32("ColumnNumber"); + _sourceFragment = info.GetString("SourceFragment"); + } + } + + + #region JsException overrides + + /// + /// Populates a with the data needed to serialize the target object + /// + /// The to populate with data + /// The destination (see ) for this serialization + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException(nameof(info)); + } + + base.GetObjectData(info, context); + info.AddValue("Type", _type); + info.AddValue("DocumentName", _documentName); + info.AddValue("LineNumber", _lineNumber); + info.AddValue("ColumnNumber", _columnNumber); + info.AddValue("SourceFragment", _sourceFragment); + } + + #endregion +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsUsageException.cs b/src/MsieJavaScriptEngine/JsUsageException.cs new file mode 100644 index 0000000..9296c36 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsUsageException.cs @@ -0,0 +1,76 @@ +using System; +#if !NETSTANDARD1_3 +using System.Runtime.Serialization; +#endif + +using MsieJavaScriptEngine.Constants; + +namespace MsieJavaScriptEngine +{ + /// + /// The API usage exception occurred + /// +#if !NETSTANDARD1_3 + [Serializable] +#endif + public sealed class JsUsageException : JsException + { + /// + /// Initializes a new instance of the class + /// with a specified error message + /// + /// The message that describes the error + public JsUsageException(string message) + : base(message) + { + Category = JsErrorCategory.Usage; + } + + /// + /// Initializes a new instance of the class + /// with a specified error message and a reference to the inner exception + /// that is the cause of this exception + /// + /// The error message that explains the reason for the exception + /// The exception that is the cause of the current exception + public JsUsageException(string message, Exception innerException) + : base(message, innerException) + { + Category = JsErrorCategory.Usage; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + public JsUsageException(string message, string engineMode) + : base(message, engineMode) + { + Category = JsErrorCategory.Usage; + } + + /// + /// Initializes a new instance of the class + /// + /// The error message that explains the reason for the exception + /// Name of JS engine mode + /// The exception that is the cause of the current exception + public JsUsageException(string message, string engineMode, Exception innerException) + : base(message, engineMode, innerException) + { + Category = JsErrorCategory.Usage; + } +#if !NETSTANDARD1_3 + + /// + /// Initializes a new instance of the class with serialized data + /// + /// The object that holds the serialized data + /// The contextual information about the source or destination + private JsUsageException(SerializationInfo info, StreamingContext context) + : base(info, context) + { } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index eaeefb2..6461487 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,10 +24,14 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Added support of .NET Standard 2.0; -2. Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types; -3. Removed a redundant code; -4. In JsRT modes during calling of the `CollectGarbage` method is no longer performed blocking. + 1. Format of the error messages was unified; +2. Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class; +3. In the `JsException` class was added two new properties: `Category` and `Description`; +4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; +5. In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack`; +6. `JsScriptInterruptedException` class was renamed to the `JsInterruptedException` class and now is inherited from the `JsRuntimeException` class; +7. `JsEngineLoadException` class now is inherited from the `JsEngineException` class; +8. `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails`. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 27b6c87..929006a 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -1,5 +1,7 @@ using System; +using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using System.Text; #if !NETSTANDARD @@ -56,8 +58,8 @@ public string Mode /// /// Constructs an instance of MSIE JS engine /// - /// Failed to load a JS engine. - /// Selected mode of JS engine is not supported. + /// + /// public MsieJsEngine() : this(new JsEngineSettings()) { } @@ -66,8 +68,8 @@ public MsieJsEngine() /// Constructs an instance of MSIE JS engine /// /// JS engine settings - /// Failed to load a JS engine. - /// Selected mode of JS engine is not supported. + /// + /// public MsieJsEngine(JsEngineSettings settings) { JsEngineMode engineMode = settings.EngineMode; @@ -98,9 +100,9 @@ public MsieJsEngine(JsEngineSettings settings) { throw new JsEngineLoadException( #if NETSTANDARD - NetCoreStrings.Runtime_JsEnginesNotFound + NetCoreStrings.Engine_JsEnginesNotFound #else - NetFrameworkStrings.Runtime_JsEnginesNotFound + NetFrameworkStrings.Engine_JsEnginesNotFound #endif ); } @@ -126,9 +128,9 @@ public MsieJsEngine(JsEngineSettings settings) } else if (previousMode == JsEngineMode.ChakraIeJsRt) { - throw new JsEngineLoadException( + throw new JsUsageException( string.Format( - CommonStrings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Usage_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -136,9 +138,9 @@ public MsieJsEngine(JsEngineSettings settings) } else if (previousMode == JsEngineMode.ChakraActiveScript) { - throw new JsEngineLoadException( + throw new JsUsageException( string.Format( - CommonStrings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Usage_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -153,9 +155,9 @@ public MsieJsEngine(JsEngineSettings settings) } else { - throw new JsEngineLoadException( + throw new JsUsageException( string.Format( - CommonStrings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Usage_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -172,9 +174,9 @@ public MsieJsEngine(JsEngineSettings settings) } else { - throw new JsEngineLoadException( + throw new JsUsageException( string.Format( - CommonStrings.Runtime_JsEnginesConflictInProcess, + CommonStrings.Usage_JsEnginesConflictInProcess, JsEngineModeHelpers.GetModeName(processedEngineMode), JsEngineModeHelpers.GetModeName(previousMode) ) @@ -183,8 +185,8 @@ public MsieJsEngine(JsEngineSettings settings) break; #else - throw new NotSupportedException( - string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); + throw new JsUsageException( + string.Format(NetCoreStrings.Usage_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif case JsEngineMode.Classic: #if !NETSTANDARD @@ -192,12 +194,12 @@ public MsieJsEngine(JsEngineSettings settings) break; #else - throw new NotSupportedException( - string.Format(NetCoreStrings.Runtime_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); + throw new JsUsageException( + string.Format(NetCoreStrings.Usage_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif default: - throw new NotSupportedException( - string.Format(CommonStrings.Runtime_JsEngineModeNotSupported, processedEngineMode)); + throw new JsUsageException( + string.Format(CommonStrings.Usage_JsEngineModeNotSupported, processedEngineMode)); } _currentMode = processedEngineMode; @@ -205,6 +207,7 @@ public MsieJsEngine(JsEngineSettings settings) } + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private void VerifyNotDisposed() { if (_disposedFlag.IsSet()) @@ -218,10 +221,13 @@ private void VerifyNotDisposed() /// /// JS expression /// Result of the expression - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public object Evaluate(string expression) { return Evaluate(expression, string.Empty); @@ -233,18 +239,40 @@ public object Evaluate(string expression) /// JS expression /// Document name /// Result of the expression - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public object Evaluate(string expression, string documentName) { VerifyNotDisposed(); + if (expression == null) + { + throw new ArgumentNullException( + nameof(expression), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(expression)) + ); + } + if (string.IsNullOrWhiteSpace(expression)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "expression"), "expression"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(expression)), + nameof(expression) + ); + } + + if (!string.IsNullOrWhiteSpace(documentName) + && !ValidationHelpers.CheckDocumentNameFormat(documentName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidDocumentNameFormat, documentName), + nameof(documentName) + ); } string uniqueDocumentName = _documentNameManager.GetUniqueName(documentName); @@ -258,12 +286,13 @@ public object Evaluate(string expression, string documentName) /// Type of result /// JS expression /// Result of the expression - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The type of return value - /// is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public T Evaluate(string expression) { return Evaluate(expression, string.Empty); @@ -276,27 +305,49 @@ public T Evaluate(string expression) /// JS expression /// Document name /// Result of the expression - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The type of return value - /// is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public T Evaluate(string expression, string documentName) { VerifyNotDisposed(); + if (expression == null) + { + throw new ArgumentNullException( + nameof(expression), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(expression)) + ); + } + if (string.IsNullOrWhiteSpace(expression)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "expression"), "expression"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(expression)), + nameof(expression) + ); + } + + if (!string.IsNullOrWhiteSpace(documentName) + && !ValidationHelpers.CheckDocumentNameFormat(documentName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidDocumentNameFormat, documentName), + nameof(documentName) + ); } Type returnValueType = typeof(T); if (!ValidationHelpers.IsSupportedType(returnValueType)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_ReturnValueTypeNotSupported, returnValueType.FullName), + nameof(T) + ); } string uniqueDocumentName = _documentNameManager.GetUniqueName(documentName); @@ -309,10 +360,13 @@ public T Evaluate(string expression, string documentName) /// Executes a code /// /// JS code - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public void Execute(string code) { Execute(code, string.Empty); @@ -323,18 +377,40 @@ public void Execute(string code) /// /// JS code /// Document name - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// public void Execute(string code, string documentName) { VerifyNotDisposed(); + if (code == null) + { + throw new ArgumentNullException( + nameof(code), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(code)) + ); + } + if (string.IsNullOrWhiteSpace(code)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "code"), "code"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(code)), + nameof(code) + ); + } + + if (!string.IsNullOrWhiteSpace(documentName) + && !ValidationHelpers.CheckDocumentNameFormat(documentName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidDocumentNameFormat, documentName), + nameof(documentName) + ); } string uniqueDocumentName = _documentNameManager.GetUniqueName(documentName); @@ -346,11 +422,15 @@ public void Execute(string code, string documentName) /// /// Path to the JS-file /// Text encoding - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// Specified JS-file not found. - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// + /// + /// public void ExecuteFile(string path, Encoding encoding = null) { VerifyNotDisposed(); @@ -358,17 +438,38 @@ public void ExecuteFile(string path, Encoding encoding = null) if (path == null) { throw new ArgumentNullException( - "path", string.Format(CommonStrings.Common_ArgumentIsNull, "path")); + nameof(path), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(path)) + ); } if (string.IsNullOrWhiteSpace(path)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "path"), "path"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(path)), + nameof(path) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(path)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidFileNameFormat, path), + nameof(path) + ); } string code = Utils.GetFileTextContent(path, encoding); - Execute(code, path); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotExecuteEmptyFile, path), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(path); + + _jsEngine.Execute(code, uniqueDocumentName); } /// @@ -377,11 +478,14 @@ public void ExecuteFile(string path, Encoding encoding = null) /// The case-sensitive resource name without the namespace of the specified type /// The type, that determines the assembly and whose namespace is used to scope /// the resource name - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// + /// public void ExecuteResource(string resourceName, Type type) { VerifyNotDisposed(); @@ -389,19 +493,33 @@ public void ExecuteResource(string resourceName, Type type) if (resourceName == null) { throw new ArgumentNullException( - "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); } if (type == null) { throw new ArgumentNullException( - "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); + nameof(type), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(type)) + ); } if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidResourceNameFormat, resourceName), + nameof(resourceName) + ); } Assembly assembly = type.GetTypeInfo().Assembly; @@ -409,7 +527,16 @@ public void ExecuteResource(string resourceName, Type type) string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; string code = Utils.GetResourceAsString(resourceFullName, assembly); - Execute(code, resourceName); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotExecuteEmptyResource, resourceFullName), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(resourceFullName); + + _jsEngine.Execute(code, uniqueDocumentName); } /// @@ -417,11 +544,14 @@ public void ExecuteResource(string resourceName, Type type) /// /// The case-sensitive resource name /// The assembly, which contains the embedded resource - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// - /// JS runtime error. + /// + /// + /// + /// + /// + /// + /// + /// public void ExecuteResource(string resourceName, Assembly assembly) { VerifyNotDisposed(); @@ -429,23 +559,46 @@ public void ExecuteResource(string resourceName, Assembly assembly) if (resourceName == null) { throw new ArgumentNullException( - "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); } if (assembly == null) { throw new ArgumentNullException( - "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); + nameof(assembly), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(assembly)) + ); } if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidResourceNameFormat, resourceName), + nameof(resourceName) + ); } string code = Utils.GetResourceAsString(resourceName, assembly); - Execute(code, resourceName); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotExecuteEmptyResource, resourceName), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(resourceName); + + _jsEngine.Execute(code, uniqueDocumentName); } /// @@ -454,27 +607,38 @@ public void ExecuteResource(string resourceName, Assembly assembly) /// Function name /// Function arguments /// Result of the function execution - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The function name has incorrect format. - /// The type of one function - /// parameter is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// + /// public object CallFunction(string functionName, params object[] args) { VerifyNotDisposed(); + if (functionName == null) + { + throw new ArgumentNullException( + nameof(functionName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(functionName)) + ); + } + if (string.IsNullOrWhiteSpace(functionName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "functionName"), "functionName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(functionName)), + nameof(functionName) + ); } if (!ValidationHelpers.CheckNameFormat(functionName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidFunctionNameFormat, functionName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidFunctionNameFormat, functionName), + nameof(functionName) + ); } int argumentCount = args.Length; @@ -490,9 +654,11 @@ public object CallFunction(string functionName, params object[] args) if (!ValidationHelpers.IsSupportedType(argType)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_FunctionParameterTypeNotSupported, - functionName, argType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_FunctionParameterTypeNotSupported, + functionName, argType.FullName), + nameof(args) + ); } } } @@ -510,34 +676,38 @@ public object CallFunction(string functionName, params object[] args) /// Function name /// Function arguments /// Result of the function execution - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The function name has incorrect format. - /// The type of return value or - /// one function parameter is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// + /// public T CallFunction(string functionName, params object[] args) { VerifyNotDisposed(); - if (string.IsNullOrWhiteSpace(functionName)) + if (functionName == null) { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "functionName"), "functionName"); + throw new ArgumentNullException( + nameof(functionName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(functionName)) + ); } - Type returnValueType = typeof(T); - if (!ValidationHelpers.IsSupportedType(returnValueType)) + if (string.IsNullOrWhiteSpace(functionName)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(functionName)), + nameof(functionName) + ); } if (!ValidationHelpers.CheckNameFormat(functionName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidFunctionNameFormat, functionName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidFunctionNameFormat, functionName), + nameof(functionName) + ); } int argumentCount = args.Length; @@ -553,14 +723,25 @@ public T CallFunction(string functionName, params object[] args) if (!ValidationHelpers.IsSupportedType(argType)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_FunctionParameterTypeNotSupported, - functionName, argType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_FunctionParameterTypeNotSupported, + functionName, argType.FullName), + nameof(args) + ); } } } } + Type returnValueType = typeof(T); + if (!ValidationHelpers.IsSupportedType(returnValueType)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_ReturnValueTypeNotSupported, returnValueType.FullName), + nameof(T) + ); + } + object result = _jsEngine.CallFunction(functionName, args); return TypeConverter.ConvertToType(result); @@ -571,25 +752,37 @@ public T CallFunction(string functionName, params object[] args) /// /// Name of variable /// Result of check (true - exists; false - not exists - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The variable name has incorrect format. - /// JS runtime error. + /// + /// + /// + /// + /// public bool HasVariable(string variableName) { VerifyNotDisposed(); + if (variableName == null) + { + throw new ArgumentNullException( + nameof(variableName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(variableName)) + ); + } + if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(variableName)), + nameof(variableName) + ); } if (!ValidationHelpers.CheckNameFormat(variableName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidVariableNameFormat, variableName), + nameof(variableName) + ); } return _jsEngine.HasVariable(variableName); @@ -600,25 +793,37 @@ public bool HasVariable(string variableName) /// /// Name of variable /// Value of variable - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The variable name has incorrect format. - /// JS runtime error. + /// + /// + /// + /// + /// public object GetVariableValue(string variableName) { VerifyNotDisposed(); + if (variableName == null) + { + throw new ArgumentNullException( + nameof(variableName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(variableName)) + ); + } + if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(variableName)), + nameof(variableName) + ); } if (!ValidationHelpers.CheckNameFormat(variableName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidVariableNameFormat, variableName), + nameof(variableName) + ); } return _jsEngine.GetVariableValue(variableName); @@ -630,34 +835,46 @@ public object GetVariableValue(string variableName) /// Type of variable /// Name of variable /// Value of variable - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The variable name has incorrect format. - /// The type of return value - /// is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// public T GetVariableValue(string variableName) { VerifyNotDisposed(); + if (variableName == null) + { + throw new ArgumentNullException( + nameof(variableName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(variableName)) + ); + } + if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(variableName)), + nameof(variableName) + ); } - Type returnValueType = typeof(T); - if (!ValidationHelpers.IsSupportedType(returnValueType)) + if (!ValidationHelpers.CheckNameFormat(variableName)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_ReturnValueTypeNotSupported, returnValueType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidVariableNameFormat, variableName), + nameof(variableName) + ); } - if (!ValidationHelpers.CheckNameFormat(variableName)) + Type returnValueType = typeof(T); + if (!ValidationHelpers.IsSupportedType(returnValueType)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_ReturnValueTypeNotSupported, returnValueType.FullName), + nameof(T) + ); } object result = _jsEngine.GetVariableValue(variableName); @@ -670,27 +887,37 @@ public T GetVariableValue(string variableName) /// /// Name of variable /// Value of variable - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The variable name has incorrect format. - /// The type of variable value - /// is not supported. - /// JS runtime error. + /// + /// + /// + /// + /// public void SetVariableValue(string variableName, object value) { VerifyNotDisposed(); + if (variableName == null) + { + throw new ArgumentNullException( + nameof(variableName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(variableName)) + ); + } + if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(variableName)), + nameof(variableName) + ); } if (!ValidationHelpers.CheckNameFormat(variableName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidVariableNameFormat, variableName), + nameof(variableName) + ); } if (value != null) @@ -699,9 +926,11 @@ public void SetVariableValue(string variableName, object value) if (!ValidationHelpers.IsSupportedType(variableType)) { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_VariableTypeNotSupported, - variableName, variableType.FullName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_VariableTypeNotSupported, + variableName, variableType.FullName), + nameof(value) + ); } } @@ -712,25 +941,37 @@ public void SetVariableValue(string variableName, object value) /// Removes a variable /// /// Name of variable - /// Operation is performed on a disposed MSIE - /// JS engine. - /// - /// The variable name has incorrect format. - /// JS runtime error. + /// + /// + /// + /// + /// public void RemoveVariable(string variableName) { VerifyNotDisposed(); + if (variableName == null) + { + throw new ArgumentNullException( + nameof(variableName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(variableName)) + ); + } + if (string.IsNullOrWhiteSpace(variableName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "variableName"), "variableName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(variableName)), + nameof(variableName) + ); } if (!ValidationHelpers.CheckNameFormat(variableName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidVariableNameFormat, variableName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidVariableNameFormat, variableName), + nameof(variableName) + ); } _jsEngine.RemoveVariable(variableName); @@ -742,36 +983,55 @@ public void RemoveVariable(string variableName) /// The name for the new global variable or function that will represent the object /// The object to expose /// Allows to embed instances of simple classes (or structures) and delegates. + /// + /// + /// + /// public void EmbedHostObject(string itemName, object value) { VerifyNotDisposed(); + if (itemName == null) + { + throw new ArgumentNullException( + nameof(itemName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(itemName)) + ); + } + + if (value == null) + { + throw new ArgumentNullException( + nameof(value), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(value)) + ); + } + if (string.IsNullOrWhiteSpace(itemName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(itemName)), + nameof(itemName) + ); } if (!ValidationHelpers.CheckNameFormat(itemName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidScriptItemNameFormat, itemName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidScriptItemNameFormat, itemName), + nameof(itemName) + ); } - if (value != null) - { - Type itemType = value.GetType(); + Type itemType = value.GetType(); - if (ValidationHelpers.IsPrimitiveType(itemType) - || itemType == typeof (Undefined)) - { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_EmbeddedHostObjectTypeNotSupported, itemName, itemType.FullName)); - } - } - else + if (ValidationHelpers.IsPrimitiveType(itemType) || itemType == typeof(Undefined)) { - throw new ArgumentNullException("value", string.Format(CommonStrings.Common_ArgumentIsNull, "value")); + throw new ArgumentException( + string.Format(CommonStrings.Usage_EmbeddedHostObjectTypeNotSupported, + itemName, itemType.FullName), + nameof(value) + ); } _jsEngine.EmbedHostObject(itemName, value); @@ -786,34 +1046,52 @@ public void EmbedHostObject(string itemName, object value) /// Host types are exposed to script code in the form of objects whose properties and /// methods are bound to the type's static members. /// + /// + /// + /// + /// public void EmbedHostType(string itemName, Type type) { VerifyNotDisposed(); + if (itemName == null) + { + throw new ArgumentNullException( + nameof(itemName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(itemName)) + ); + } + + if (type == null) + { + throw new ArgumentNullException( + nameof(type), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(type)) + ); + } + if (string.IsNullOrWhiteSpace(itemName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "itemName"), "itemName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(itemName)), + nameof(itemName) + ); } if (!ValidationHelpers.CheckNameFormat(itemName)) { - throw new FormatException( - string.Format(CommonStrings.Runtime_InvalidScriptItemNameFormat, itemName)); + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidScriptItemNameFormat, itemName), + nameof(itemName) + ); } - if (type != null) - { - if (ValidationHelpers.IsPrimitiveType(type) - || type == typeof(Undefined)) - { - throw new NotSupportedTypeException( - string.Format(CommonStrings.Runtime_EmbeddedHostTypeNotSupported, type.FullName)); - } - } - else + if (ValidationHelpers.IsPrimitiveType(type) || type == typeof(Undefined)) { - throw new ArgumentNullException("type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); + throw new ArgumentException( + string.Format(CommonStrings.Usage_EmbeddedHostTypeNotSupported, type.FullName), + nameof(type) + ); } _jsEngine.EmbedHostType(itemName, type); diff --git a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs b/src/MsieJavaScriptEngine/NotSupportedTypeException.cs deleted file mode 100644 index cc9a845..0000000 --- a/src/MsieJavaScriptEngine/NotSupportedTypeException.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -#if !NETSTANDARD1_3 -using System.Runtime.Serialization; -#endif - -namespace MsieJavaScriptEngine -{ - /// - /// The exception that is thrown when a .NET type is not supported by JS engine - /// -#if !NETSTANDARD1_3 - [Serializable] -#endif - public sealed class NotSupportedTypeException : Exception - { - /// - /// Initializes a new instance of the class - /// with a specified error message - /// - /// The message that describes the error - public NotSupportedTypeException(string message) - : base(message) - { } - - /// - /// Initializes a new instance of the class - /// with a specified error message and a reference to the inner exception - /// that is the cause of this exception - /// - /// The error message that explains the reason for the exception - /// The exception that is the cause of the current exception - public NotSupportedTypeException(string message, Exception innerException) - : base(message, innerException) - { } -#if !NETSTANDARD1_3 - - /// - /// Initializes a new instance of the class with serialized data - /// - /// The object that holds the serialized data - /// The contextual information about the source or destination - private NotSupportedTypeException(SerializationInfo info, StreamingContext context) - : base(info, context) - { } -#endif - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 574da86..f917ebc 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -89,6 +89,14 @@ internal static string Common_FileNotExist get { return GetString("Common_FileNotExist"); } } + /// + /// Looks up a localized string similar to "Resource with name '{0}' is null." + /// + internal static string Common_ResourceIsNull + { + get { return GetString("Common_ResourceIsNull"); } + } + /// /// Looks up a localized string similar to "Cannot convert null to a value type." /// @@ -97,6 +105,30 @@ internal static string Common_ValueTypeCannotBeNull get { return GetString("Common_ValueTypeCannotBeNull"); } } + /// + /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." + /// + internal static string Engine_EdgeJsEngineNotLoaded + { + get { return GetString("Engine_EdgeJsEngineNotLoaded"); } + } + + /// + /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." + /// + internal static string Engine_IeJsEngineNotLoaded + { + get { return GetString("Engine_IeJsEngineNotLoaded"); } + } + + /// + /// Looks up a localized string similar to "Call stack" + /// + internal static string ErrorDetails_CallStack + { + get { return GetString("ErrorDetails_CallStack"); } + } + /// /// Looks up a localized string similar to "Category" /// @@ -113,6 +145,22 @@ internal static string ErrorDetails_ColumnNumber get { return GetString("ErrorDetails_ColumnNumber"); } } + /// + /// Looks up a localized string similar to "Description" + /// + internal static string ErrorDetails_Description + { + get { return GetString("ErrorDetails_Description"); } + } + + /// + /// Looks up a localized string similar to "Document name" + /// + internal static string ErrorDetails_DocumentName + { + get { return GetString("ErrorDetails_DocumentName"); } + } + /// /// Looks up a localized string similar to "Engine mode" /// @@ -154,131 +202,163 @@ internal static string ErrorDetails_SourceFragment } /// - /// Looks up a localized string similar to "Resource with name '{0}' is null." + /// Looks up a localized string similar to "Type" /// - internal static string Resources_ResourceIsNull + internal static string ErrorDetails_Type { - get { return GetString("Resources_ResourceIsNull"); } + get { return GetString("ErrorDetails_Type"); } } /// - /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." + /// Looks up a localized string similar to "The function with the name '{0}' does not exist." + /// + internal static string Runtime_FunctionNotExist + { + get { return GetString("Runtime_FunctionNotExist"); } + } + + /// + /// Looks up a localized string similar to "The '{0}' line of the script call stack has an incorrect format." + /// + internal static string Runtime_InvalidCallStackLineFormat + { + get { return GetString("Runtime_InvalidCallStackLineFormat"); } + } + + /// + /// Looks up a localized string similar to "Script execution was interrupted." + /// + internal static string Runtime_ScriptInterrupted + { + get { return GetString("Runtime_ScriptInterrupted"); } + } + + /// + /// Looks up a localized string similar to "Сannot execute a '{0}' file, because it is empty." + /// + internal static string Usage_CannotExecuteEmptyFile + { + get { return GetString("Usage_CannotExecuteEmptyFile"); } + } + + /// + /// Looks up a localized string similar to "Сannot execute a '{0}' resource, because it is empty." /// - internal static string Runtime_EdgeJsEngineNotLoaded + internal static string Usage_CannotExecuteEmptyResource { - get { return GetString("Runtime_EdgeJsEngineNotLoaded"); } + get { return GetString("Usage_CannotExecuteEmptyResource"); } } /// /// Looks up a localized string similar to "The embedded host object '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_EmbeddedHostObjectTypeNotSupported + internal static string Usage_EmbeddedHostObjectTypeNotSupported { - get { return GetString("Runtime_EmbeddedHostObjectTypeNotSupported"); } + get { return GetString("Usage_EmbeddedHostObjectTypeNotSupported"); } } /// /// Looks up a localized string similar to "The embedded host type `{0}` is not supported." /// - internal static string Runtime_EmbeddedHostTypeNotSupported + internal static string Usage_EmbeddedHostTypeNotSupported { - get { return GetString("Runtime_EmbeddedHostTypeNotSupported"); } + get { return GetString("Usage_EmbeddedHostTypeNotSupported"); } } /// - /// Looks up a localized string similar to "The function with the name '{0}' does not exist." + /// Looks up a localized string similar to "One of the function parameters '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_FunctionNotExist + internal static string Usage_FunctionParameterTypeNotSupported { - get { return GetString("Runtime_FunctionNotExist"); } + get { return GetString("Usage_FunctionParameterTypeNotSupported"); } } /// - /// Looks up a localized string similar to "One of the function parameters '{0}' has a type `{1}`, which is not supported." + /// Looks up a localized string similar to "The document name '{0}' has incorrect format." /// - internal static string Runtime_FunctionParameterTypeNotSupported + internal static string Usage_InvalidDocumentNameFormat { - get { return GetString("Runtime_FunctionParameterTypeNotSupported"); } + get { return GetString("Usage_InvalidDocumentNameFormat"); } } /// - /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." + /// Looks up a localized string similar to "The file name '{0}' has incorrect format." /// - internal static string Runtime_IeJsEngineNotLoaded + internal static string Usage_InvalidFileNameFormat { - get { return GetString("Runtime_IeJsEngineNotLoaded"); } + get { return GetString("Usage_InvalidFileNameFormat"); } } /// /// Looks up a localized string similar to "The function name '{0}' has incorrect format." /// - internal static string Runtime_InvalidFunctionNameFormat + internal static string Usage_InvalidFunctionNameFormat + { + get { return GetString("Usage_InvalidFunctionNameFormat"); } + } + + /// + /// Looks up a localized string similar to "The resource name '{0}' has incorrect format." + /// + internal static string Usage_InvalidResourceNameFormat { - get { return GetString("Runtime_InvalidFunctionNameFormat"); } + get { return GetString("Usage_InvalidResourceNameFormat"); } } /// /// Looks up a localized string similar to "The script item name '{0}' has incorrect format." /// - internal static string Runtime_InvalidScriptItemNameFormat + internal static string Usage_InvalidScriptItemNameFormat { - get { return GetString("Runtime_InvalidScriptItemNameFormat"); } + get { return GetString("Usage_InvalidScriptItemNameFormat"); } } /// /// Looks up a localized string similar to "The variable name '{0}' has incorrect format." /// - internal static string Runtime_InvalidVariableNameFormat + internal static string Usage_InvalidVariableNameFormat { - get { return GetString("Runtime_InvalidVariableNameFormat"); } + get { return GetString("Usage_InvalidVariableNameFormat"); } } /// /// Looks up a localized string similar to "Selected '{0}' mode of JavaScript engine is not supported." /// - internal static string Runtime_JsEngineModeNotSupported + internal static string Usage_JsEngineModeNotSupported { - get { return GetString("Runtime_JsEngineModeNotSupported"); } + get { return GetString("Usage_JsEngineModeNotSupported"); } } /// /// Looks up a localized string similar to "It is prohibited to use the {0} and {1} engines in one process." /// - internal static string Runtime_JsEnginesConflictInProcess + internal static string Usage_JsEnginesConflictInProcess { - get { return GetString("Runtime_JsEnginesConflictInProcess"); } + get { return GetString("Usage_JsEnginesConflictInProcess"); } } /// /// Looks up a localized string similar to "It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time." /// - internal static string Runtime_JsEnginesConflictOnMachine + internal static string Usage_JsEnginesConflictOnMachine { - get { return GetString("Runtime_JsEnginesConflictOnMachine"); } + get { return GetString("Usage_JsEnginesConflictOnMachine"); } } /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// - internal static string Runtime_ReturnValueTypeNotSupported - { - get { return GetString("Runtime_ReturnValueTypeNotSupported"); } - } - - /// - /// Looks up a localized string similar to "Script execution was interrupted." - /// - internal static string Runtime_ScriptInterrupted + internal static string Usage_ReturnValueTypeNotSupported { - get { return GetString("Runtime_ScriptInterrupted"); } + get { return GetString("Usage_ReturnValueTypeNotSupported"); } } /// /// Looks up a localized string similar to "The variable '{0}' has a type `{1}`, which is not supported." /// - internal static string Runtime_VariableTypeNotSupported + internal static string Usage_VariableTypeNotSupported { - get { return GetString("Runtime_VariableTypeNotSupported"); } + get { return GetString("Usage_VariableTypeNotSupported"); } } private static string GetString(string name) diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index 80031a2..825b191 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -129,15 +129,39 @@ File '{0}' not exist. + + Resource with name '{0}' is null. + Cannot convert null to a value type. + + Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. +See more details: + +{0} + + + Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. +See more details: + +{2} + + + Call stack + Category Column number + + Description + + + Document name + Engine mode @@ -153,58 +177,64 @@ Source fragment - - Resource with name '{0}' is null. + + Type - - Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. -See more details: - -{0} + + The function with the name '{0}' does not exist. + + + The '{0}' line of the script call stack has an incorrect format. + + + Script execution was interrupted. + + + Сannot execute a '{0}' file, because it is empty. + + + Сannot execute a '{0}' resource, because it is empty. - + The embedded host object '{0}' has a type `{1}`, which is not supported. - + The embedded host type `{0}` is not supported. - - The function with the name '{0}' does not exist. - - + One of the function parameters '{0}' has a type `{1}`, which is not supported. - - Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. -See more details: - -{2} + + The document name '{0}' has incorrect format. - + + The file name '{0}' has incorrect format. + + The function name '{0}' has incorrect format. - + + The resource name '{0}' has incorrect format. + + The script item name '{0}' has incorrect format. - + The variable name '{0}' has incorrect format. - + Selected '{0}' mode of JavaScript engine is not supported. - + It is prohibited to use the {0} and {1} engines in one process. - + It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time. - + The type of return value `{0}` is not supported. - - Script execution was interrupted. - - + The variable '{0}' has a type `{1}`, which is not supported. \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index de512f3..c21cc60 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -129,15 +129,39 @@ Файл "{0}" не существует! + + Ресурс с именем "{0}" содержит значение равное null! + Невозможно преобразовать null в значимый тип! + + Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. +Смотрите более подробную информацию об ошибке: + +{0} + + + Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. +Смотрите более подробную информацию об ошибке: + +{2} + + + Стек вызовов + Категория Номер столбца + + Описание + + + Имя документа + Режим движка @@ -153,58 +177,64 @@ Фрагмент исходного кода - - Ресурс с именем "{0}" содержит значение равное null! + + Тип - - Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. -Смотрите более подробную информацию об ошибке: - -{0} + + Функция с именем "{0}" не существует! + + + Строка стека вызовов скрипта "{0}" имеет некорректный формат! + + + Выполнение скрипта было прервано! + + + Нельзя выполнить файл "{0}", потому что он пустой! + + + Нельзя выполнить ресурс "{0}", потому что он пустой! - + Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! - + Встраиваемый тип хоста `{0}` не поддерживается! - - Функция с именем "{0}" не существует! - - + Один из параметров функции "{0}" имеет тип `{1}`, который не поддерживается! - - Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. -Смотрите более подробную информацию об ошибке: - -{2} + + Имя документа "{0}" имеет некорректный формат! - + + Имя файла "{0}" имеет некорректный формат! + + Имя функции "{0}" имеет некорректный формат! - + + Имя ресурса "{0}" имеет некорректный формат! + + Имя скриптового элемента "{0}" имеет некорректный формат! - + Имя переменной "{0}" имеет некорректный формат! - + Выбранный вами режим JavaScript-движка "{0}" не поддерживается! - + Нельзя использовать {0} и {1} движки в одном процессе. - + Нельзя использовать Chakra JsRT и Chakra ActiveScript движки на одном компьютере одновременно. - + Тип возвращаемого значения `{0}` не поддерживается! - - Выполнение скрипта было прервано! - - + Переменная "{0}" имеет тип `{1}`, который не поддерживается! \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index fe57bd8..e2e4c78 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -57,6 +57,14 @@ internal static CultureInfo Culture } } + /// + /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." + /// + internal static string Engine_JsEnginesNotFound + { + get { return GetString("Engine_JsEnginesNotFound"); } + } + /// /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." /// @@ -185,22 +193,6 @@ internal static string Runtime_InvalidThisContextForHostObjectProperty get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } } - /// - /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." - /// - internal static string Runtime_JsEngineModeNotCompatibleWithNetCore - { - get { return GetString("Runtime_JsEngineModeNotCompatibleWithNetCore"); } - } - - /// - /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." - /// - internal static string Runtime_JsEnginesNotFound - { - get { return GetString("Runtime_JsEnginesNotFound"); } - } - /// /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." /// @@ -217,6 +209,14 @@ internal static string Runtime_SuitableMethodOfHostObjectNotFound get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } } + /// + /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." + /// + internal static string Usage_JsEngineModeNotCompatibleWithNetCore + { + get { return GetString("Usage_JsEngineModeNotCompatibleWithNetCore"); } + } + private static string GetString(string name) { string value = ResourceManager.GetString(name, _resourceCulture); diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx index bcfdfd5..f3cfa54 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. + During invocation of the host delegate an error has occurred - “{0}”. @@ -165,16 +168,13 @@ Could not retrieve property '{0}' of the host object, because there was an invalid `this` context. - - The '{0}' mode of JavaScript engine is not compatible with .NET Core. - - - Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. - Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}` host type. Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object. + + The '{0}' mode of JavaScript engine is not compatible with .NET Core. + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx index 859ec26..7938acc 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. + Во время вызова делегата хоста произошла ошибка - «{0}»! @@ -165,16 +168,13 @@ Не удалось получить свойство "{0}" объекта хоста, потому что контекст `this` недействителен! - - Режим JavaScript-движка "{0}" не совместим с .NET Core! - - - Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. - Не получается найти подходящий конструктор или не хватает аргументов для вызова конструктора `{0}` типа хоста! Не получается найти подходящий метод или не хватает аргументов для вызова метода "{0}" объекта хоста! + + Режим JavaScript-движка "{0}" не совместим с .NET Core! + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index 81ce790..feea37f 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -60,33 +60,33 @@ internal static CultureInfo Culture /// /// Looks up a localized string similar to "ActiveScript dispatcher is not initialized." /// - internal static string Runtime_ActiveScriptDispatcherNotInitialized + internal static string Engine_ActiveScriptDispatcherNotInitialized { - get { return GetString("Runtime_ActiveScriptDispatcherNotInitialized"); } + get { return GetString("Engine_ActiveScriptDispatcherNotInitialized"); } } /// /// Looks up a localized string similar to "Failed to set '{0}' version of script language for the ActiveScript JavaScript engine." /// - internal static string Runtime_ActiveScriptLanguageVersionSelectionFailed + internal static string Engine_ActiveScriptLanguageVersionSelectionFailed { - get { return GetString("Runtime_ActiveScriptLanguageVersionSelectionFailed"); } + get { return GetString("Engine_ActiveScriptLanguageVersionSelectionFailed"); } } /// - /// Looks up a localized string similar to "Item with name '{0}' not found." + /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." /// - internal static string Runtime_ItemNotFound + internal static string Engine_JsEnginesNotFound { - get { return GetString("Runtime_ItemNotFound"); } + get { return GetString("Engine_JsEnginesNotFound"); } } /// - /// Looks up a localized string similar to "Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer..." + /// Looks up a localized string similar to "Item with name '{0}' not found." /// - internal static string Runtime_JsEnginesNotFound + internal static string Runtime_ItemNotFound { - get { return GetString("Runtime_JsEnginesNotFound"); } + get { return GetString("Runtime_ItemNotFound"); } } /// diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx index e8b7c43..3ce799f 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.resx @@ -117,18 +117,18 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + ActiveScript dispatcher is not initialized. - + Failed to set '{0}' version of script language for the ActiveScript JavaScript engine. + + Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer browser. + Item with name '{0}' not found. - - Could not found none of the JavaScript engines. Perhaps you have not installed the Internet Explorer browser. - The variable with the name '{0}' does not exist. diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx index 9439445..14923d5 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx @@ -117,18 +117,18 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + ActiveScript-диспетчер не инициализирован! - + Не удалось установить "{0}" версию языка сценариев для ActiveScript JavaScript-движка! + + Не удалось найти ни один из JavaScript-движков! Возможно, на вашем компьютере не установлен браузер Internet Explorer. + Элемент с именем "{0}" не найден! - - Не удалось найти ни один из JavaScript-движков! Возможно, на вашем компьютере не установлен браузер Internet Explorer. - Переменная с именем "{0}" не существует! diff --git a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs index e847c0c..290496b 100644 --- a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs @@ -18,7 +18,7 @@ public static MethodInfo GetMethodInfo(this Delegate source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } return source.Method; diff --git a/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs b/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs index cb9cf01..466adfa 100644 --- a/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs @@ -17,7 +17,7 @@ public static void PreserveStackTrace(this Exception source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } MethodInfo preserveStackTraceMethodInfo = typeof(Exception).GetMethod("InternalPreserveStackTrace", diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs index 98b9e84..bc466db 100644 --- a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs @@ -24,7 +24,7 @@ public static StringBuilder AppendFormatLine(this StringBuilder source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } return source.AppendLine(); @@ -44,7 +44,7 @@ public static StringBuilder AppendFormatLine(this StringBuilder source, string f { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } if (_formatPlaceholderRegExp.IsMatch(format)) @@ -65,7 +65,7 @@ public static StringBuilder TrimEnd(this StringBuilder source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } int charCount = source.Length; diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs new file mode 100644 index 0000000..f84e501 --- /dev/null +++ b/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs @@ -0,0 +1,142 @@ +using System; +using System.Text; +using System.Threading; + +namespace MsieJavaScriptEngine.Utilities +{ + /// + /// Pool of string builders + /// + internal static class StringBuilderPool + { + /// + /// Maximum capacity of builder + /// + const int MAX_BUILDER_CAPACITY = 8 * 1024; + + /// + /// Number of builders per processor + /// + const int BUILDER_COUNT_PER_PROCESSOR = 4; + + /// + /// First builder + /// + /// The first builder is stored in a dedicated field, because we expect + /// to be able to satisfy most requests from it. + private static StringBuilder _firstBuilder; + + /// + /// List of the remaining builders + /// + private static readonly StringBuilder[] _builders; + + + /// + /// Static constructor + /// + static StringBuilderPool() + { + int builderCount = Environment.ProcessorCount * BUILDER_COUNT_PER_PROCESSOR; + if (builderCount < 5) + { + builderCount = 5; + } + + _builders = new StringBuilder[builderCount - 1]; + } + + + /// + /// Gets a instance of string builder from the pool + /// + /// Instance of string builder + public static StringBuilder GetBuilder() + { + // Examine the first builder. + // If that fails, then `GetBuilderSlow` method will look at the remaining builders. + StringBuilder builder = _firstBuilder; + if (builder == null || builder != Interlocked.CompareExchange(ref _firstBuilder, null, builder)) + { + builder = GetBuilderSlow(); + } + + return builder; + } + + /// + /// Gets a instance of string builder with at least the given capacity from the pool + /// + /// If the capacity is less than or equal to our maximum capacity, then return builder from the pool. + /// Otherwise create a new string builder, that will just get discarded when released. + /// Capacity of string builder + /// Instance of string builder + public static StringBuilder GetBuilder(int capacity) + { + if (capacity <= MAX_BUILDER_CAPACITY) + { + return GetBuilder(); + } + + return new StringBuilder(capacity); + } + + private static StringBuilder GetBuilderSlow() + { + StringBuilder[] builders = _builders; + int builderCount = builders.Length; + + for (int builderIndex = 0; builderIndex < builderCount; builderIndex++) + { + StringBuilder builder = builders[builderIndex]; + if (builder != null) + { + if (builder == Interlocked.CompareExchange(ref builders[builderIndex], null, builder)) + { + return builder; + } + } + } + + return new StringBuilder(MAX_BUILDER_CAPACITY); + } + + /// + /// Returns a instance of string builder to the pool + /// + /// Instance of string builder + public static void ReleaseBuilder(StringBuilder builder) + { + if (builder == null || builder.Capacity > MAX_BUILDER_CAPACITY) + { + return; + } + + if (_firstBuilder == null) + { + builder.Clear(); + _firstBuilder = builder; + } + else + { + ReleaseBuilderSlow(builder); + } + } + + private static void ReleaseBuilderSlow(StringBuilder builder) + { + StringBuilder[] builders = _builders; + int builderCount = builders.Length; + + for (int builderIndex = 0; builderIndex < builderCount; builderIndex++) + { + if (builders[builderIndex] == null) + { + builder.Clear(); + builders[builderIndex] = builder; + break; + } + } + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/StringExtensions.cs b/src/MsieJavaScriptEngine/Utilities/StringExtensions.cs new file mode 100644 index 0000000..f9ff13f --- /dev/null +++ b/src/MsieJavaScriptEngine/Utilities/StringExtensions.cs @@ -0,0 +1,98 @@ +using System; +using System.Linq; + +namespace MsieJavaScriptEngine.Utilities +{ + /// + /// Extensions for String + /// + internal static class StringExtensions + { + /// + /// Removes leading occurrence of the specified string from the current object + /// + /// Instance of + /// An string to remove + /// The string that remains after removing of the specified string from the start of + /// the current string + public static string TrimStart(this string source, string trimString) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (trimString == null) + { + throw new ArgumentNullException(nameof(trimString)); + } + + if (source.Length == 0 || trimString.Length == 0) + { + return source; + } + + string result = source; + if (source.StartsWith(trimString, StringComparison.Ordinal)) + { + result = source.Substring(trimString.Length); + } + + return result; + } + + /// + /// Converts a first letter of string to capital + /// + /// Instance of + /// The string starting with a capital letter + public static string CapitalizeFirstLetter(this string source) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + int length = source.Length; + if (length == 0) + { + return source; + } + + string result; + char firstCharacter = source.First(); + + if (char.IsLower(firstCharacter)) + { + result = char.ToUpperInvariant(firstCharacter).ToString(); + if (length > 1) + { + result += source.Substring(1); + } + } + else + { + result = source; + } + + return result; + } + + /// + /// Splits a string into lines + /// + /// Instance of + /// An array of lines + public static string[] SplitToLines(this string source) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + string[] result = source.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + + return result; + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs index 76039c0..dbbd0f5 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs @@ -19,7 +19,7 @@ public static TypeCode GetTypeCode(this Type source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } TypeCode typeCode; @@ -114,7 +114,7 @@ public static TypeInfo GetTypeInfo(this Type source) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } return new TypeInfo(source); diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs index 74103f1..532472f 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs @@ -10,7 +10,7 @@ public static bool IsInstanceOfType(this TypeInfo source, object o) { if (source == null) { - throw new ArgumentNullException("source"); + throw new ArgumentNullException(nameof(source)); } if (o == null) diff --git a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs index 07d7f3c..f126451 100644 --- a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs +++ b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs @@ -36,13 +36,17 @@ public UniqueDocumentNameManager(string defaultName) if (defaultName == null) { throw new ArgumentNullException( - "defaultName", string.Format(CommonStrings.Common_ArgumentIsNull, "defaultName")); + nameof(defaultName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(defaultName)) + ); } if (string.IsNullOrWhiteSpace(defaultName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "defaultName"), "defaultName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(defaultName)), + nameof(defaultName) + ); } _defaultName = defaultName; diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 498a755..ba20f86 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -38,19 +38,25 @@ public static string GetResourceAsString(string resourceName, Type type) if (resourceName == null) { throw new ArgumentNullException( - "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); } if (type == null) { throw new ArgumentNullException( - "type", string.Format(CommonStrings.Common_ArgumentIsNull, "type")); + nameof(type), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(type)) + ); } if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); } Assembly assembly = type.GetTypeInfo().Assembly; @@ -71,19 +77,25 @@ public static string GetResourceAsString(string resourceName, Assembly assembly) if (resourceName == null) { throw new ArgumentNullException( - "resourceName", string.Format(CommonStrings.Common_ArgumentIsNull, "resourceName")); + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); } if (assembly == null) { throw new ArgumentNullException( - "assembly", string.Format(CommonStrings.Common_ArgumentIsNull, "assembly")); + nameof(assembly), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(assembly)) + ); } if (string.IsNullOrWhiteSpace(resourceName)) { throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, "resourceName"), "resourceName"); + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); } return InnerGetResourceAsString(resourceName, assembly); @@ -96,7 +108,7 @@ private static string InnerGetResourceAsString(string resourceName, Assembly ass if (stream == null) { throw new NullReferenceException( - string.Format(CommonStrings.Resources_ResourceIsNull, resourceName)); + string.Format(CommonStrings.Common_ResourceIsNull, resourceName)); } using (var reader = new StreamReader(stream)) @@ -117,7 +129,9 @@ public static string GetFileTextContent(string path, Encoding encoding = null) if (!File.Exists(path)) { throw new FileNotFoundException( - string.Format(CommonStrings.Common_FileNotExist, path), path); + string.Format(CommonStrings.Common_FileNotExist, path), + path + ); } string content; diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index b897510..f7f73e4 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -5,7 +5,7 @@ -------------------------------------------------------------------------------- - Copyright (c) 2012-2017 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru =========== @@ -21,12 +21,23 @@ ============= RELEASE NOTES ============= - 1. Added support of .NET Standard 2.0; - 2. Fixed a error, that occurred in the `Classic` mode during removing the - embedded host objects and types; - 3. Removed a redundant code; - 4. In JsRT modes during calling of the `CollectGarbage` method is no longer - performed blocking. + 1. Format of the error messages was unified; + 2. Created a new exception classes: `JsCompilationException`, + `JsEngineException`, `JsFatalException` and `JsUsageException`. These + exceptions are responsible for handling errors, some of which were previously + handled by the `JsRuntimeException` class; + 3. In the `JsException` class was added two new properties: `Category` and + `Description`; + 4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; + 5. In the `JsRuntimeException` class was added three new properties: `Type`, + `DocumentName` and `CallStack`; + 6. `JsScriptInterruptedException` class was renamed to the + `JsInterruptedException` class and now is inherited from the + `JsRuntimeException` class; + 7. `JsEngineLoadException` class now is inherited from the `JsEngineException` + class; + 8. `Format` method of the `JsErrorHelpers` class was renamed to the + `GenerateErrorDetails`. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs index ba68ecb..35081b1 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs @@ -1,7 +1,10 @@ -using MsieJavaScriptEngine.Test.Common; +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; namespace MsieJavaScriptEngine.Test.Auto { + [TestFixture] public class CommonTests : CommonTestsBase { protected override MsieJsEngine CreateJsEngine(bool enableDebugging) diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 4fe9db2..9873be8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -22,58 +22,100 @@ protected override MsieJsEngine CreateJsEngine(bool enableDebugging) return jsEngine; } - #region Mapping errors + #region Error handling + + #region Mapping of errors [Test] - public void GenerationOfParseErrorMessageIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() { // Arrange - const string input = @"var arr = []; -var obj = {}; -var foo = 'Browser's bar';"; - string targetOutput = "Compilation error: Expected ';'" + Environment.NewLine + - " at 3:20" - ; + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine()) { try { - jsEngine.Execute(input, "variables.js"); + int result = jsEngine.Evaluate(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } + // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(targetOutput, exception.Message); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Conditional compilation is turned off", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); } [Test] - public void GenerationOfParseErrorMessageInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() { // Arrange - const string input = @"var arr = []; -var obj = {}; -var foo = 'Browser's bar';"; - string targetOutput = "Compilation error: Expected ';'" + Environment.NewLine + - " at variables.js:3:20" - ; + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine(true)) { try { - jsEngine.Execute(input, "variables.js"); + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Conditional compilation is turned off", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var variable3 = 678; + +$variable1 + -variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); } catch (JsRuntimeException e) { @@ -81,37 +123,126 @@ public void GenerationOfParseErrorMessageInDebugModeIsCorrect() } } + // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(targetOutput, exception.Message); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'variable2' is undefined", exception.Description); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(5, exception.LineNumber); + Assert.AreEqual(1, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() { // Arrange - const string input = @"function foo(x, y) { - var z = x + y; - if (z > 20) { - bar(); + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); } + + return value !== 1 ? value * factorial(value - 1) : 1; } -var a = 8; -var b = 15; +factorial(5); +factorial(2%); +factorial(0);"; -foo(a, b);"; - string targetOutput = "Runtime error: 'bar' is undefined" + Environment.NewLine + - " at 4:3"; + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } - JsException exception = null; + [Test] + public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(-1); +factorial(0);"; + + JsRuntimeException exception = null; // Act using (var jsEngine = CreateJsEngine()) { try { - jsEngine.Execute(input, "functions.js"); + jsEngine.Execute(input, "factorial.js"); } catch (JsRuntimeException e) { @@ -119,20 +250,99 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("The value must be greater than or equal to zero.", exception.Description); + Assert.IsEmpty(exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(3, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() + { + // Arrange + const string input = @"var arr = []; +var obj = {}; +var foo = 'Browser's bar';"; + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" + ; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } [Test] - public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() { // Arrange - const string input = @"var $variable1 = 611; -var _variable2 = 711; -var @variable3 = 678; + const string input = @"var arr = []; +var obj = {}; +var foo = 'Browser's bar';"; + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" + ; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + Assert.NotNull(exception); + Assert.AreEqual(targetOutput, exception.Message); + } -$variable1 + _variable2 - variable3;"; + [Test] + public void GenerationOfRuntimeErrorMessageIsCorrect() + { + // Arrange + const string input = @"function foo(x, y) { + var z = x + y; + if (z > 20) { + bar(); + } +} + +var a = 8; +var b = 15; + +foo(a, b);"; + string targetOutput = "ReferenceError: 'bar' is undefined" + Environment.NewLine + + " at functions.js:4:3"; JsRuntimeException exception = null; @@ -141,7 +351,7 @@ public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() { try { - int result = jsEngine.Evaluate(input); + jsEngine.Execute(input, "functions.js"); } catch (JsRuntimeException e) { @@ -149,13 +359,12 @@ public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } } - // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(3, exception.LineNumber); - Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual(targetOutput, exception.Message); } #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 5ba70f0..7441f87 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -23,20 +23,266 @@ protected override MsieJsEngine CreateJsEngine(bool enableDebugging) return jsEngine; } - #region Mapping errors + #region Error handling + + #region Mapping of errors + + [Test] + public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Invalid character", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(5, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } + + [Test] + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Invalid character", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(5, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } [Test] - public void GenerationOfParseErrorMessageIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var variable3 = 678; + +$variable1 + -variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.True(Regex.IsMatch(exception.Description, @"^'variable2' is (un|not )defined$")); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(5, exception.LineNumber); + Assert.AreEqual(1, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual(" at Global code (variables.js:5:1)", exception.CallStack); + } + + [Test] + public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(-1); +factorial(0);"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("The value must be greater than or equal to zero.", exception.Description); + Assert.AreEqual("Error", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(3, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at factorial (factorial.js:3:3)" + Environment.NewLine + + " at Global code (factorial.js:10:1)", + exception.CallStack + ); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() { // Arrange const string input = @"var arr = []; var obj = {}; var foo = 'Browser's bar';"; - string targetOutput = "Compile error: Expected ';'" + Environment.NewLine + - " at 3:20" + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" ; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine()) @@ -45,29 +291,28 @@ public void GenerationOfParseErrorMessageIsCorrect() { jsEngine.Execute(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } [Test] - public void GenerationOfParseErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() { // Arrange const string input = @"var arr = []; var obj = {}; var foo = 'Browser's bar';"; - string targetOutput = "Compile error: Expected ';'" + Environment.NewLine + - " at 3:20" + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" ; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine(true)) @@ -76,14 +321,13 @@ public void GenerationOfParseErrorMessageInDebugModeIsCorrect() { jsEngine.Execute(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } @@ -102,12 +346,12 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() var b = 15; foo(a, b);"; - string targetOutputPattern = @"^ReferenceError: 'bar' is (un|not )defined\n" + - @" at foo \(functions.js:4:3\)\n" + + string targetOutputPattern = @"^ReferenceError: 'bar' is (un|not )defined" + Environment.NewLine + + @" at foo \(functions.js:4:3\)" + Environment.NewLine + @" at Global code \(functions.js:11:1\)$" ; - JsException exception = null; + JsRuntimeException exception = null; // Act using (var jsEngine = CreateJsEngine()) @@ -123,10 +367,11 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.True(Regex.IsMatch(exception.Message, targetOutputPattern)); } #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index e83938f..172030a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -22,20 +22,266 @@ protected override MsieJsEngine CreateJsEngine(bool enableDebugging) return jsEngine; } - #region Mapping errors + #region Error handling + + #region Mapping of errors + + [Test] + public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Invalid character", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.IsEmpty(exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(5, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } + + [Test] + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Invalid character", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.IsEmpty(exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(5, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } [Test] - public void GenerationOfParseErrorMessageIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var variable3 = 678; + +$variable1 + -variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'variable2' is undefined", exception.Description); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(5, exception.LineNumber); + Assert.AreEqual(1, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual(" at Global code (variables.js:5:1)", exception.CallStack); + } + + [Test] + public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.IsEmpty(exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.IsEmpty(exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(-1); +factorial(0);"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("The value must be greater than or equal to zero.", exception.Description); + Assert.AreEqual("Error", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(3, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at factorial (factorial.js:3:3)" + Environment.NewLine + + " at Global code (factorial.js:10:1)", + exception.CallStack + ); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() { // Arrange const string input = @"var arr = []; var obj = {}; var foo = 'Browser's bar';"; - string targetOutput = "Compile error: Expected ';'" + Environment.NewLine + - " at 3:20" + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at 3:20 -> var foo = 'Browser's bar';" ; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine()) @@ -44,29 +290,28 @@ public void GenerationOfParseErrorMessageIsCorrect() { jsEngine.Execute(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } [Test] - public void GenerationOfParseErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() { // Arrange const string input = @"var arr = []; var obj = {}; var foo = 'Browser's bar';"; - string targetOutput = "Compile error: Expected ';'" + Environment.NewLine + - " at 3:20" + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at 3:20 -> var foo = 'Browser's bar';" ; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine(true)) @@ -75,14 +320,13 @@ public void GenerationOfParseErrorMessageInDebugModeIsCorrect() { jsEngine.Execute(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } @@ -101,12 +345,12 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() var b = 15; foo(a, b);"; - string targetOutput = "ReferenceError: 'bar' is undefined\n" + - " at foo (functions.js:4:3)\n" + - " at Unknown script code (functions.js:11:1)" + string targetOutput = "ReferenceError: 'bar' is undefined" + Environment.NewLine + + " at foo (functions.js:4:3)" + Environment.NewLine + + " at Global code (functions.js:11:1)" ; - JsException exception = null; + JsRuntimeException exception = null; // Act using (var jsEngine = CreateJsEngine()) @@ -122,10 +366,11 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index be3699f..2bb5442 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -22,58 +22,100 @@ protected override MsieJsEngine CreateJsEngine(bool enableDebugging) return jsEngine; } - #region Mapping errors + #region Error handling + + #region Mapping of errors [Test] - public void GenerationOfParseErrorMessageIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() { // Arrange - const string input = @"var arr = []; -var obj = {}; -var foo = 'Browser's bar';"; - string targetOutput = "Compilation error: Expected ';'" + Environment.NewLine + - " at 3:20" - ; + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine()) { try { - jsEngine.Execute(input, "variables.js"); + int result = jsEngine.Evaluate(input, "variables.js"); } - catch (JsRuntimeException e) + catch (JsCompilationException e) { exception = e; } } + // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(targetOutput, exception.Message); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Conditional compilation is turned off", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); } [Test] - public void GenerationOfParseErrorMessageInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() { // Arrange - const string input = @"var arr = []; -var obj = {}; -var foo = 'Browser's bar';"; - string targetOutput = "Compilation error: Expected ';'" + Environment.NewLine + - " at variables.js:3:20" - ; + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var @variable3 = 678; + +$variable1 + _variable2 - @variable3;"; - JsException exception = null; + JsCompilationException exception = null; // Act using (var jsEngine = CreateJsEngine(true)) { try { - jsEngine.Execute(input, "variables.js"); + int result = jsEngine.Evaluate(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Conditional compilation is turned off", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual("var @variable3 = 678;", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + { + // Arrange + const string input = @"var $variable1 = 611; +var _variable2 = 711; +var variable3 = 678; + +$variable1 + -variable2 - variable3;"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + int result = jsEngine.Evaluate(input, "variables.js"); } catch (JsRuntimeException e) { @@ -81,38 +123,126 @@ public void GenerationOfParseErrorMessageInDebugModeIsCorrect() } } + // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(targetOutput, exception.Message); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'variable2' is undefined", exception.Description); + Assert.AreEqual("TypeError", exception.Type); + Assert.AreEqual("variables.js", exception.DocumentName); + Assert.AreEqual(5, exception.LineNumber); + Assert.AreEqual(1, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() { // Arrange - const string input = @"function foo(x, y) { - var z = x + y; - if (z > 20) { - bar(); + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); } + + return value !== 1 ? value * factorial(value - 1) : 1; } -var a = 8; -var b = 15; +factorial(5); +factorial(2%); +factorial(0);"; -foo(a, b);"; - string targetOutput = "Runtime error: Object expected" + Environment.NewLine + - " at 4:3" - ; + JsCompilationException exception = null; - JsException exception = null; + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(2%); +factorial(0);"; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "factorial.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Syntax error", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(13, exception.ColumnNumber); + Assert.AreEqual("factorial(2%);", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + { + // Arrange + const string input = @"function factorial(value) { + if (value <= 0) { + throw new Error(""The value must be greater than or equal to zero.""); + } + + return value !== 1 ? value * factorial(value - 1) : 1; +} + +factorial(5); +factorial(-1); +factorial(0);"; + + JsRuntimeException exception = null; // Act using (var jsEngine = CreateJsEngine()) { try { - jsEngine.Execute(input, "functions.js"); + jsEngine.Execute(input, "factorial.js"); } catch (JsRuntimeException e) { @@ -120,20 +250,100 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("The value must be greater than or equal to zero.", exception.Description); + Assert.IsEmpty(exception.Type); + Assert.AreEqual("factorial.js", exception.DocumentName); + Assert.AreEqual(3, exception.LineNumber); + Assert.AreEqual(3, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() + { + // Arrange + const string input = @"var arr = []; +var obj = {}; +var foo = 'Browser's bar';"; + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" + ; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + jsEngine.Execute(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); Assert.AreEqual(targetOutput, exception.Message); } [Test] - public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() { // Arrange - const string input = @"var $variable1 = 611; -var _variable2 = 711; -var @variable3 = 678; + const string input = @"var arr = []; +var obj = {}; +var foo = 'Browser's bar';"; + string targetOutput = "SyntaxError: Expected ';'" + Environment.NewLine + + " at variables.js:3:20 -> var foo = 'Browser's bar';" + ; + + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine(true)) + { + try + { + jsEngine.Execute(input, "variables.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + Assert.NotNull(exception); + Assert.AreEqual(targetOutput, exception.Message); + } -$variable1 + _variable2 - variable3;"; + [Test] + public void GenerationOfRuntimeErrorMessageIsCorrect() + { + // Arrange + const string input = @"function foo(x, y) { + var z = x + y; + if (z > 20) { + bar(); + } +} + +var a = 8; +var b = 15; + +foo(a, b);"; + string targetOutput = "TypeError: Object expected" + Environment.NewLine + + " at functions.js:4:3" + ; JsRuntimeException exception = null; @@ -142,7 +352,7 @@ public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() { try { - int result = jsEngine.Evaluate(input); + jsEngine.Execute(input, "functions.js"); } catch (JsRuntimeException e) { @@ -150,13 +360,12 @@ public override void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } } - // Assert Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(3, exception.LineNumber); - Assert.AreEqual(15, exception.ColumnNumber); + Assert.AreEqual(targetOutput, exception.Message); } #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 47ba51c..f3d32c1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -967,7 +967,7 @@ public virtual void ScriptInterruptionIsCorrect() } // Assert - Assert.IsInstanceOf(currentException); + Assert.IsInstanceOf(currentException); Assert.AreEqual(targetOutput, output); } @@ -990,79 +990,5 @@ public virtual void GarbageCollectionIsCorrect() } #endregion - - #region Mapping errors - - [Test] - public virtual void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() - { - // Arrange - const string input = @"var $variable1 = 611; -var _variable2 = 711; -var @variable3 = 678; - -$variable1 + _variable2 - variable3;"; - - JsRuntimeException exception = null; - - // Act - using (var jsEngine = CreateJsEngine()) - { - try - { - int result = jsEngine.Evaluate(input); - } - catch (JsRuntimeException e) - { - exception = e; - } - } - - // Assert - Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(3, exception.LineNumber); - Assert.AreEqual(5, exception.ColumnNumber); - } - - [Test] - public virtual void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() - { - // Arrange - const string input = @"function factorial(value) { - if (value <= 0) { - throw new Error(""The value must be greater than or equal to zero.""); - } - - return value !== 1 ? value * factorial(value - 1) : 1; -} - -factorial(5); -factorial(@); -factorial(0);"; - - JsRuntimeException exception = null; - - // Act - using (var jsEngine = CreateJsEngine()) - { - try - { - jsEngine.Execute(input); - } - catch (JsRuntimeException e) - { - exception = e; - } - } - - // Assert - Assert.NotNull(exception); - Assert.IsNotEmpty(exception.Message); - Assert.AreEqual(10, exception.LineNumber); - Assert.AreEqual(11, exception.ColumnNumber); - } - - #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs index ebe5289..7acc226 100644 --- a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs @@ -35,18 +35,65 @@ public void NameFormatIsWrong() // Arrange // Act - bool name1FormatIsCorrect = ValidationHelpers.CheckNameFormat("good-parts"); - bool name2FormatIsCorrect = ValidationHelpers.CheckNameFormat("1sale"); - bool name3FormatIsCorrect = ValidationHelpers.CheckNameFormat("Foo Bar"); - bool name4FormatIsCorrect = ValidationHelpers.CheckNameFormat("@grid"); - bool name5FormatIsCorrect = ValidationHelpers.CheckNameFormat("2"); + bool name1FormatIsWrong = ValidationHelpers.CheckNameFormat("good-parts"); + bool name2FormatIsWrong = ValidationHelpers.CheckNameFormat("1sale"); + bool name3FormatIsWrong = ValidationHelpers.CheckNameFormat("Foo Bar"); + bool name4FormatIsWrong = ValidationHelpers.CheckNameFormat("@grid"); + bool name5FormatIsWrong = ValidationHelpers.CheckNameFormat("2"); // Assert - Assert.IsFalse(name1FormatIsCorrect); - Assert.IsFalse(name2FormatIsCorrect); - Assert.IsFalse(name3FormatIsCorrect); - Assert.IsFalse(name4FormatIsCorrect); - Assert.IsFalse(name5FormatIsCorrect); + Assert.IsFalse(name1FormatIsWrong); + Assert.IsFalse(name2FormatIsWrong); + Assert.IsFalse(name3FormatIsWrong); + Assert.IsFalse(name4FormatIsWrong); + Assert.IsFalse(name5FormatIsWrong); + } + + [Test] + public void DocumentNameFormatIsCorrect() + { + // Arrange + + // Act + bool documentName1FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat("Script Document"); + bool documentName2FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat("Script Document [2]"); + bool documentName3FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat("doc01.js"); + bool documentName4FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat("/res/scripts.min.js"); + bool documentName5FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat( + @"C:\Users\Vasya\AppData\Roaming\npm\node_modules\typescript\lib\tsc.js"); + bool documentName6FormatIsCorrect = ValidationHelpers.CheckDocumentNameFormat( + "BundleTransformer.Less.Resources.less-combined.min.js"); + + // Assert + Assert.IsTrue(documentName1FormatIsCorrect); + Assert.IsTrue(documentName2FormatIsCorrect); + Assert.IsTrue(documentName3FormatIsCorrect); + Assert.IsTrue(documentName4FormatIsCorrect); + Assert.IsTrue(documentName5FormatIsCorrect); + Assert.IsTrue(documentName6FormatIsCorrect); + } + + [Test] + public void DocumentNameFormatIsWrong() + { + // Arrange + + // Act + bool documentName1FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat("Script Document"); + bool documentName2FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat("Script Document <2>"); + bool documentName3FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat(" doc01.js"); + bool documentName4FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat(@"Document ""Test"""); + bool documentName5FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat("src/*.js"); + bool documentName6FormatIsWrong = ValidationHelpers.CheckDocumentNameFormat( + "/js/shared/SubScribeModal/subscribeChecker.js?v=2017-11-09"); + + // Assert + Assert.IsFalse(documentName1FormatIsWrong); + Assert.IsFalse(documentName2FormatIsWrong); + Assert.IsFalse(documentName3FormatIsWrong); + Assert.IsFalse(documentName4FormatIsWrong); + Assert.IsFalse(documentName5FormatIsWrong); + Assert.IsFalse(documentName6FormatIsWrong); } } } \ No newline at end of file From 6c46e84ecc1ece0bfc83055fbedd58bb92ae317f Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 9 Mar 2018 11:48:11 +0300 Subject: [PATCH 118/238] Fixed a minor errors --- src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs | 2 +- src/MsieJavaScriptEngine/JsScriptException.cs | 4 ++-- src/MsieJavaScriptEngine/MsieJsEngine.cs | 10 ++++++---- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 4 ++-- src/MsieJavaScriptEngine/Utilities/Utils.cs | 3 ++- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index fe6dcb8..496325f 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -11,7 +11,7 @@ namespace MsieJavaScriptEngine.Helpers { /// - /// JS engine error helpers + /// JS error helpers /// public static class JsErrorHelpers { diff --git a/src/MsieJavaScriptEngine/JsScriptException.cs b/src/MsieJavaScriptEngine/JsScriptException.cs index d82951c..44c7776 100644 --- a/src/MsieJavaScriptEngine/JsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsScriptException.cs @@ -44,8 +44,8 @@ public class JsScriptException : JsException /// public string Type { - get; - set; + get { return _type; } + set { _type = value; } } /// diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 929006a..852ce92 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -418,9 +418,9 @@ public void Execute(string code, string documentName) } /// - /// Executes a code from JS-file + /// Executes a code from JS file /// - /// Path to the JS-file + /// Path to the JS file /// Text encoding /// /// @@ -473,7 +473,7 @@ public void ExecuteFile(string path, Encoding encoding = null) } /// - /// Executes a code from embedded JS-resource + /// Executes a code from embedded JS resource /// /// The case-sensitive resource name without the namespace of the specified type /// The type, that determines the assembly and whose namespace is used to scope @@ -481,6 +481,7 @@ public void ExecuteFile(string path, Encoding encoding = null) /// /// /// + /// /// /// /// @@ -540,13 +541,14 @@ public void ExecuteResource(string resourceName, Type type) } /// - /// Executes a code from embedded JS-resource + /// Executes a code from embedded JS resource /// /// The case-sensitive resource name /// The assembly, which contains the embedded resource /// /// /// + /// /// /// /// diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 3c59084..6930eec 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -14,7 +14,7 @@ namespace MsieJavaScriptEngine /// internal sealed class ScriptDispatcher : IDisposable { -#if !NETSTANDARD +#if !NETSTANDARD1_3 /// /// The stack size is sufficient to run the code of modern JS libraries in 32-bit process /// @@ -57,7 +57,7 @@ internal sealed class ScriptDispatcher : IDisposable /// public ScriptDispatcher() { -#if NETSTANDARD +#if NETSTANDARD1_3 _thread = new Thread(StartThread) #else int sufficientStackSize = Utils.Is64BitProcess() ? STACK_SIZE_64 : STACK_SIZE_32; diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index ba20f86..2f761bf 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -108,7 +108,8 @@ private static string InnerGetResourceAsString(string resourceName, Assembly ass if (stream == null) { throw new NullReferenceException( - string.Format(CommonStrings.Common_ResourceIsNull, resourceName)); + string.Format(CommonStrings.Common_ResourceIsNull, resourceName) + ); } using (var reader = new StreamReader(stream)) From ef9109ca8a8f547ae95314918c40f23e8f65d740 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 11 Mar 2018 19:38:18 +0300 Subject: [PATCH 119/238] Was made refactoring --- src/MsieJavaScriptEngine/Helpers/CallStackItem.cs | 10 ---------- src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs | 7 ++----- .../Resources/CommonStrings.Designer.cs | 8 -------- src/MsieJavaScriptEngine/Resources/CommonStrings.resx | 3 --- .../Resources/CommonStrings.ru-ru.resx | 3 --- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 2 ++ .../MsieJavaScriptEngine.Test.Auto.csproj | 6 +++++- ...MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 6 +++++- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 6 +++++- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 6 +++++- .../MsieJavaScriptEngine.Test.Classic.csproj | 6 +++++- .../MsieJavaScriptEngine.Test.Common.csproj | 8 ++++++-- 12 files changed, 35 insertions(+), 36 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs b/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs index f07c0d5..535a6e3 100644 --- a/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs +++ b/src/MsieJavaScriptEngine/Helpers/CallStackItem.cs @@ -41,15 +41,6 @@ public int ColumnNumber set; } - /// - /// Gets or sets a source fragment - /// - public string SourceFragment - { - get; - set; - } - /// /// Constructs an instance of the script call stack item @@ -60,7 +51,6 @@ public CallStackItem() DocumentName = string.Empty; LineNumber = 0; ColumnNumber = 0; - SourceFragment = string.Empty; } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 496325f..7f8ee08 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -76,10 +76,8 @@ internal static CallStackItem[] ParseCallStack(string callStack) /// instances /// /// An array of instances - /// Flag for whether to omit source fragment /// String representation of the script call stack - internal static string StringifyCallStackItems(CallStackItem[] callStackItems, - bool omitSourceFragment = false) + internal static string StringifyCallStackItems(CallStackItem[] callStackItems) { if (callStackItems == null) { @@ -103,8 +101,7 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems, stackBuilder.AppendLine(); } WriteErrorLocation(stackBuilder, stackItem.FunctionName, stackItem.DocumentName, - stackItem.LineNumber, stackItem.ColumnNumber, - !omitSourceFragment ? stackItem.SourceFragment : string.Empty); + stackItem.LineNumber, stackItem.ColumnNumber); } string callStack = stackBuilder.ToString(); diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index f917ebc..9639cd0 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -169,14 +169,6 @@ internal static string ErrorDetails_EngineMode get { return GetString("ErrorDetails_EngineMode"); } } - /// - /// Looks up a localized string similar to "Error code" - /// - internal static string ErrorDetails_ErrorCode - { - get { return GetString("ErrorDetails_ErrorCode"); } - } - /// /// Looks up a localized string similar to "Line number" /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index 825b191..b176837 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -165,9 +165,6 @@ See more details: Engine mode - - Error code - Line number diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index c21cc60..ce05b3d 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -165,9 +165,6 @@ Режим движка - - Код ошибки - Номер строки diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 6930eec..4205f5e 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -3,6 +3,7 @@ #if NET45 || NETSTANDARD using System.Runtime.ExceptionServices; #endif +using System.Runtime.CompilerServices; using System.Threading; using MsieJavaScriptEngine.Utilities; @@ -71,6 +72,7 @@ public ScriptDispatcher() } + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private void VerifyNotDisposed() { if (_disposedFlag.IsSet()) diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index a06bff3..ddb36c5 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -18,7 +18,11 @@ - + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 36eb1db..d26afe1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -17,7 +17,11 @@ - + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 93f97d3..f05f530 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -18,7 +18,11 @@ - + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 5f40dec..d32095d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -18,7 +18,11 @@ - + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index dcf418b..a9f642e 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -17,7 +17,11 @@ - + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index e1b6eca..61fd5fa 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -24,8 +24,8 @@ - - + + @@ -40,4 +40,8 @@ + + + + \ No newline at end of file From 553f351171a59685fc98e80b2b868bd35423c9a4 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 5 Apr 2018 20:07:00 +0300 Subject: [PATCH 120/238] Fixed a minor errors --- global.json | 2 +- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 3 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 180 ++++++----- .../ActiveScriptJsErrorHelpers.cs | 2 +- .../ActiveScript/ActiveScriptWrapper32.cs | 6 +- .../ActiveScript/ActiveScriptWrapper64.cs | 6 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 31 +- .../ClassicActiveScriptJsEngine.cs | 3 + .../ActiveScript/IActiveScriptWrapper.cs | 16 +- src/MsieJavaScriptEngine/Constants/DllName.cs | 2 + .../ExceptionExtensions.cs | 2 +- .../StringBuilderExtensions.cs | 6 +- .../StringExtensions.cs | 25 +- .../TypeExtensions.cs | 28 +- .../Helpers/ComHelpers.cs | 2 +- .../{ => Helpers}/CommonRegExps.cs | 7 +- .../Helpers/JsErrorHelpers.cs | 74 ++++- .../Helpers/NumericHelpers.cs | 2 +- src/MsieJavaScriptEngine/InnerJsEngineBase.cs | 1 + src/MsieJavaScriptEngine/JsException.cs | 27 +- .../JsRt/ChakraJsRtJsEngineBase.cs | 7 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 275 +++++++++------- .../JsRt/Edge/EdgeJsScope.cs | 2 + .../JsRt/Edge/EdgeJsScriptException.cs | 2 +- .../JsRt/Edge/EdgeJsValue.cs | 4 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 300 ++++++++++-------- src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 2 + .../JsRt/Ie/IeJsScriptException.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 4 +- .../JsRt/JsEngineException.cs | 2 +- .../JsRt/JsFatalException.cs | 2 +- .../JsRt/JsUsageException.cs | 2 +- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 3 + .../System/Reflection}/TypeInfo.cs | 2 +- .../System/Reflection}/TypeInfoExtensions.cs | 2 +- .../Polyfills/System/TypeExtensions.cs | 29 ++ .../Resources/CommonStrings.Designer.cs | 36 ++- .../Resources/CommonStrings.resx | 23 +- .../Resources/CommonStrings.ru-ru.resx | 23 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 5 +- .../Utilities/CharExtensions.cs | 18 -- .../Utilities/DelegateExtensions.cs | 28 -- .../{ => Utilities}/InterlockedStatedFlag.cs | 2 +- .../{ => Utilities}/StatedFlag.cs | 2 +- .../Utilities/TypeConverter.cs | 7 + src/MsieJavaScriptEngine/Utilities/Utils.cs | 3 + src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 +- .../CommonTests.cs | 8 +- ...criptEngine.Test.ChakraActiveScript.csproj | 2 +- .../CommonTests.cs | 11 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 +- .../CommonTests.cs | 11 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 +- .../CommonTests.cs | 8 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 4 +- 58 files changed, 758 insertions(+), 516 deletions(-) rename src/MsieJavaScriptEngine/{Utilities => Extensions}/ExceptionExtensions.cs (94%) rename src/MsieJavaScriptEngine/{Utilities => Extensions}/StringBuilderExtensions.cs (96%) rename src/MsieJavaScriptEngine/{Utilities => Extensions}/StringExtensions.cs (74%) rename src/MsieJavaScriptEngine/{Utilities => Extensions}/TypeExtensions.cs (79%) rename src/MsieJavaScriptEngine/{ => Helpers}/CommonRegExps.cs (70%) rename src/MsieJavaScriptEngine/{Utilities => Polyfills/System/Reflection}/TypeInfo.cs (97%) rename src/MsieJavaScriptEngine/{Utilities => Polyfills/System/Reflection}/TypeInfoExtensions.cs (86%) create mode 100644 src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs delete mode 100644 src/MsieJavaScriptEngine/Utilities/CharExtensions.cs delete mode 100644 src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs rename src/MsieJavaScriptEngine/{ => Utilities}/InterlockedStatedFlag.cs (85%) rename src/MsieJavaScriptEngine/{ => Utilities}/StatedFlag.cs (83%) diff --git a/global.json b/global.json index 31017f2..e5fcd6f 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.4" + "version": "2.1.103" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 8c2a6d0..2cfc77a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -105,8 +105,7 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e { int errorNumber = ComHelpers.HResult.GetFacility(hResult) == ComErrorCode.FACILITY_CONTROL ? ComHelpers.HResult.GetCode(hResult) : 0; - category = ActiveScriptJsErrorHelpers.IsEngineError(errorNumber) ? - JsErrorCategory.Engine : _jsEngine.ShortenErrorCategoryName(exceptionInfo.bstrSource); + category = _jsEngine.ShortenErrorCategoryName(exceptionInfo.bstrSource); description = exceptionInfo.bstrDescription; type = _jsEngine.GetErrorTypeByNumber(errorNumber); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 11cda2c..dad4b1e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -5,6 +5,7 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Expando; +using System.Text; using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; @@ -81,6 +82,11 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// private uint _nextSourceContext = 1; + /// + /// Lowest supported version of Internet Explorer + /// + private readonly string _lowerIeVersion; + /// /// Prefix of error category name /// @@ -104,39 +110,62 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, ScriptLanguageVersion languageVersion, string lowerIeVersion, string errorCategoryNamePrefix) : base(settings) { + _lowerIeVersion = lowerIeVersion; _errorCategoryNamePrefix = errorCategoryNamePrefix; - _dispatcher.Invoke(() => + try { - try + _dispatcher.Invoke(() => { _activeScriptWrapper = CreateActiveScriptWrapper(clsid, languageVersion); - } - catch (COMException e) - { - if (e.ErrorCode == ComErrorCode.E_CLASS_NOT_REGISTERED) + + if (_settings.EnableDebugging) { - throw new JsEngineLoadException( - string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, - _engineModeName, lowerIeVersion, e.Message), - _engineModeName - ); + StartDebugging(); } - throw; - } + _activeScriptWrapper.SetScriptSite(CreateScriptSite()); + _activeScriptWrapper.InitNew(); + _activeScriptWrapper.SetScriptState(ScriptState.Started); + + _dispatch = WrapScriptDispatch(_activeScriptWrapper.GetScriptDispatch()); + }); + } + catch (COMException e) + { + throw WrapCOMException(e); + } + catch (InvalidOperationException e) + { + string message = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName) + " " + + e.Message; - if (_settings.EnableDebugging) + throw new JsEngineLoadException(message, _engineModeName, e); + } + catch (ActiveScriptException e) + { + int errorNumber = ComHelpers.HResult.GetFacility(e.ErrorCode) == ComErrorCode.FACILITY_CONTROL ? + ComHelpers.HResult.GetCode(e.ErrorCode) : 0; + if (ActiveScriptJsErrorHelpers.IsEngineError(errorNumber)) { - StartDebugging(); + throw new JsEngineException(e.Message, _engineModeName, e); } - - _activeScriptWrapper.SetScriptSite(CreateScriptSite()); - _activeScriptWrapper.InitNew(); - _activeScriptWrapper.SetScriptState(ScriptState.Started); - - InitScriptDispatch(); - }); + else + { + throw WrapActiveScriptException(e); + } + } + catch (Exception e) + { + throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + } + finally + { + if (_dispatch == null) + { + Dispose(); + } + } } /// @@ -212,13 +241,11 @@ private IActiveScriptWrapper CreateActiveScriptWrapper(string clsid, ScriptLangu if (Utils.Is64BitProcess()) { - activeScriptWrapper = new ActiveScriptWrapper64(_engineModeName, clsid, languageVersion, - _settings.EnableDebugging); + activeScriptWrapper = new ActiveScriptWrapper64(clsid, languageVersion, _settings.EnableDebugging); } else { - activeScriptWrapper = new ActiveScriptWrapper32(_engineModeName, clsid, languageVersion, - _settings.EnableDebugging); + activeScriptWrapper = new ActiveScriptWrapper32(clsid, languageVersion, _settings.EnableDebugging); } return activeScriptWrapper; @@ -253,32 +280,6 @@ private void StartDebugging() /// Instance of the Active Script site protected abstract ScriptSiteBase CreateScriptSite(); - /// - /// Initializes a script dispatch - /// - private void InitScriptDispatch() - { - IExpando dispatch = null; - object obj; - - _activeScriptWrapper.GetScriptDispatch(null, out obj); - - if (obj != null && obj.GetType().IsCOMObject) - { - dispatch = obj as IExpando; - } - - if (dispatch == null) - { - throw new JsEngineLoadException( - NetFrameworkStrings.Engine_ActiveScriptDispatcherNotInitialized, - _engineModeName - ); - } - - _dispatch = dispatch; - } - /// /// Initializes a script context /// @@ -543,8 +544,24 @@ private object[] MapToHostType(object[] args) return TypeMappingHelpers.MapToHostType(args); } - private JsException ConvertOriginalExceptionToWrapperException( - ActiveScriptException originalException) + private static IExpando WrapScriptDispatch(object dispatch) + { + IExpando wrappedDispatch = null; + if (dispatch != null && dispatch.GetType().IsCOMObject) + { + wrappedDispatch = dispatch as IExpando; + } + + if (wrappedDispatch == null) + { + throw new InvalidOperationException( + NetFrameworkStrings.Engine_ActiveScriptDispatcherNotInitialized); + } + + return wrappedDispatch; + } + + private JsException WrapActiveScriptException(ActiveScriptException originalException) { JsException wrapperException; string message = originalException.Message; @@ -567,10 +584,6 @@ private JsException ConvertOriginalExceptionToWrapperException( wrapperException = new JsInterruptedException(message, _engineModeName, originalException); break; - case JsErrorCategory.Engine: - wrapperException = new JsEngineException(message, _engineModeName, originalException); - break; - default: wrapperException = new JsException(message, _engineModeName, originalException); break; @@ -591,6 +604,28 @@ private JsException ConvertOriginalExceptionToWrapperException( return wrapperException; } + private JsEngineLoadException WrapCOMException(COMException originalComException) + { + string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string message; + + if (originalComException.ErrorCode == ComErrorCode.E_CLASS_NOT_REGISTERED) + { + message = jsEngineNotLoadedPart + " " + + string.Format(CommonStrings.Engine_AssemblyNotRegistered, + _settings.EngineMode == JsEngineMode.Classic ? DllName.JScript : DllName.JScript9) + " " + + string.Format(CommonStrings.Engine_IeInstallationRequired, _lowerIeVersion) + ; + } + else + { + message = jsEngineNotLoadedPart + " " + + string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalComException.Message); + } + + return new JsEngineLoadException(message, _engineModeName, originalComException); + } + /// /// Shortens a name of error category /// @@ -625,7 +660,7 @@ public override object Evaluate(string expression, string documentName) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); @@ -646,7 +681,7 @@ public override void Execute(string code, string documentName) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); } @@ -665,7 +700,7 @@ public override object CallFunction(string functionName, params object[] args) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } catch (MissingMemberException) { @@ -696,7 +731,7 @@ public override bool HasVariable(string variableName) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } catch (MissingMemberException) { @@ -721,7 +756,7 @@ public override object GetVariableValue(string variableName) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } catch (MissingMemberException) { @@ -751,7 +786,7 @@ public override void SetVariableValue(string variableName, object value) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); } @@ -768,7 +803,7 @@ public override void RemoveVariable(string variableName) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); } @@ -787,7 +822,7 @@ public override void EmbedHostObject(string itemName, object value) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); } @@ -806,7 +841,7 @@ public override void EmbedHostType(string itemName, Type type) } catch (ActiveScriptException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapActiveScriptException(e); } }); } @@ -866,21 +901,14 @@ private void Dispose(bool disposing) _debugDocuments.Clear(); } - if (_documentNames != null) - { - _documentNames.Clear(); - } - if (_processDebugManagerWrapper != null) { _processDebugManagerWrapper.RemoveApplication(_debugApplicationCookie); _debugApplicationWrapper.Close(); } - if (_hostItems != null) - { - _hostItems.Clear(); - } + _documentNames?.Clear(); + _hostItems?.Clear(); _lastException = null; } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs index 7872496..d2d63a4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using MsieJavaScriptEngine.Constants; -using MsieJavaScriptEngine.Utilities; +using MsieJavaScriptEngine.Extensions; namespace MsieJavaScriptEngine.ActiveScript { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 255f7b5..99468fc 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -31,13 +31,11 @@ internal sealed class ActiveScriptWrapper32 : ActiveScriptWrapperBase /// /// Constructs an instance of the 32-bit Active Script wrapper /// - /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - public ActiveScriptWrapper32(string engineModeName, string clsid, ScriptLanguageVersion languageVersion, - bool enableDebugging) - : base(engineModeName, clsid, languageVersion, enableDebugging) + public ActiveScriptWrapper32(string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) + : base(clsid, languageVersion, enableDebugging) { _activeScriptParse32 = (IActiveScriptParse32)_activeScript; if (_enableDebugging) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index 0e2c248..35e6eca 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -31,13 +31,11 @@ internal sealed class ActiveScriptWrapper64 : ActiveScriptWrapperBase /// /// Constructs an instance of the 64-bit Active Script wrapper /// - /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - public ActiveScriptWrapper64(string engineModeName, string clsid, ScriptLanguageVersion languageVersion, - bool enableDebugging) - : base(engineModeName, clsid, languageVersion, enableDebugging) + public ActiveScriptWrapper64(string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) + : base(clsid, languageVersion, enableDebugging) { _activeScriptParse64 = (IActiveScriptParse64)_activeScript; if (_enableDebugging) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 115f722..7656015 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -1,7 +1,6 @@ #if !NETSTANDARD using System; using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -9,6 +8,7 @@ using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.ActiveScript { @@ -46,12 +46,11 @@ internal abstract class ActiveScriptWrapperBase : IActiveScriptWrapper /// /// Constructs an instance of the Active Script wrapper /// - /// Name of JS engine mode /// CLSID of JS engine /// Version of script language /// Flag for whether to enable script debugging features - protected ActiveScriptWrapperBase(string engineModeName, string clsid, - ScriptLanguageVersion languageVersion, bool enableDebugging) + protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVersion, + bool enableDebugging) { _enableDebugging = enableDebugging; @@ -69,9 +68,9 @@ protected ActiveScriptWrapperBase(string engineModeName, string clsid, IntPtr.Zero, ref scriptLanguageVersion); if (result != ComErrorCode.S_OK) { - throw new JsEngineLoadException( - string.Format(NetFrameworkStrings.Engine_ActiveScriptLanguageVersionSelectionFailed, languageVersion), - engineModeName + throw new InvalidOperationException( + string.Format(NetFrameworkStrings.Engine_ActiveScriptLanguageVersionSelectionFailed, + languageVersion) ); } } @@ -121,19 +120,15 @@ public void AddNamedItem(string name, ScriptItemFlags flags) } /// - /// Retrieves the IDispatch interface for the methods and properties associated - /// with the currently running script + /// Gets a script dispatch /// - /// The name of the item for which the caller needs the associated - /// dispatch object. If this parameter is null, the dispatch object contains as its members - /// all of the global methods and properties defined by the script. Through the - /// IDispatch interface and the associated interface, the host can - /// invoke script methods or view and modify script variables. - /// The object associated with the script's global methods and - /// properties. If the scripting engine does not support such an object, null is returned. - public void GetScriptDispatch(string itemName, out object dispatch) + /// The object associated with the script's global methods and properties + public object GetScriptDispatch() { - _activeScript.GetScriptDispatch(itemName, out dispatch); + object dispatch; + _activeScript.GetScriptDispatch(null, out dispatch); + + return dispatch; } /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index dcdef6b..da7fd8e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -4,6 +4,9 @@ using System.Reflection; using MsieJavaScriptEngine.Constants; +#if NET40 +using MsieJavaScriptEngine.Polyfills.System; +#endif using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs index d1e01f5..4a44316 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs @@ -43,20 +43,10 @@ ScriptItemFlags flags ); /// - /// Retrieves the IDispatch interface for the methods and properties associated - /// with the currently running script + /// Gets a script dispatch /// - /// The name of the item for which the caller needs the associated - /// dispatch object. If this parameter is null, the dispatch object contains as its members - /// all of the global methods and properties defined by the script. Through the - /// IDispatch interface and the associated interface, the host can - /// invoke script methods or view and modify script variables. - /// The object associated with the script's global methods and - /// properties. If the scripting engine does not support such an object, null is returned. - void GetScriptDispatch( - string itemName, - out object dispatch - ); + /// The object associated with the script's global methods and properties + object GetScriptDispatch(); /// /// Initializes the scripting engine diff --git a/src/MsieJavaScriptEngine/Constants/DllName.cs b/src/MsieJavaScriptEngine/Constants/DllName.cs index 3aca275..74bf627 100644 --- a/src/MsieJavaScriptEngine/Constants/DllName.cs +++ b/src/MsieJavaScriptEngine/Constants/DllName.cs @@ -5,6 +5,8 @@ /// internal static class DllName { + public const string JScript = "jscript.dll"; + public const string JScript9 = "jscript9.dll"; public const string Chakra = "chakra.dll"; diff --git a/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs similarity index 94% rename from src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs rename to src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs index 466adfa..6cd58cd 100644 --- a/src/MsieJavaScriptEngine/Utilities/ExceptionExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs @@ -2,7 +2,7 @@ using System; using System.Reflection; -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Extensions { /// /// Exception extensions diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs similarity index 96% rename from src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs rename to src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs index bc466db..04b4c95 100644 --- a/src/MsieJavaScriptEngine/Utilities/StringBuilderExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs @@ -2,7 +2,7 @@ using System.Text; using System.Text.RegularExpressions; -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Extensions { /// /// Extensions for StringBuilder @@ -54,7 +54,6 @@ public static StringBuilder AppendFormatLine(this StringBuilder source, string f return source.AppendLine(format.Replace("{{", "{").Replace("}}", "}")); } -#if !NETSTANDARD /// /// Removes the all trailing white-space characters from the current instance @@ -79,7 +78,7 @@ public static StringBuilder TrimEnd(this StringBuilder source) for (; charIndex >= 0; charIndex--) { char charValue = source[charIndex]; - if (!charValue.IsWhitespace()) + if (!char.IsWhiteSpace(charValue)) { break; } @@ -92,6 +91,5 @@ public static StringBuilder TrimEnd(this StringBuilder source) return source; } -#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs similarity index 74% rename from src/MsieJavaScriptEngine/Utilities/StringExtensions.cs rename to src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index f9ff13f..f141fa5 100644 --- a/src/MsieJavaScriptEngine/Utilities/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -1,13 +1,36 @@ using System; using System.Linq; -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Extensions { /// /// Extensions for String /// internal static class StringExtensions { + /// + /// Returns a value indicating whether the specified quoted string occurs within this string + /// + /// Instance of + /// The string without quotes to seek + /// true if the quoted value occurs within this string; otherwise, false + public static bool ContainsQuotedValue(this string source, string value) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + bool result = source.Contains("'" + value + "'") || source.Contains("\"" + value + "\""); + + return result; + } + /// /// Removes leading occurrence of the specified string from the current object /// diff --git a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs similarity index 79% rename from src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs rename to src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs index dbbd0f5..d7fcdba 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs @@ -2,8 +2,12 @@ #if NETSTANDARD1_3 using System.Reflection; #endif +#if NET40 + +using MsieJavaScriptEngine.Polyfills.System.Reflection; +#endif -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Extensions { /// /// Type extensions @@ -17,11 +21,6 @@ internal static class TypeExtensions /// The code of the underlying type public static TypeCode GetTypeCode(this Type source) { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - TypeCode typeCode; #if NETSTANDARD1_3 @@ -103,22 +102,5 @@ public static TypeCode GetTypeCode(this Type source) return typeCode; } -#if NET40 - - /// - /// Returns the representation of the specified type - /// - /// The type to convert - /// The converted object - public static TypeInfo GetTypeInfo(this Type source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - return new TypeInfo(source); - } -#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 39d7ca1..d999303 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -7,7 +7,7 @@ using MsieJavaScriptEngine.Constants; #if NET40 -using MsieJavaScriptEngine.Utilities; +using MsieJavaScriptEngine.Polyfills.System; #endif namespace MsieJavaScriptEngine.Helpers diff --git a/src/MsieJavaScriptEngine/CommonRegExps.cs b/src/MsieJavaScriptEngine/Helpers/CommonRegExps.cs similarity index 70% rename from src/MsieJavaScriptEngine/CommonRegExps.cs rename to src/MsieJavaScriptEngine/Helpers/CommonRegExps.cs index 70a39eb..4e69b8b 100644 --- a/src/MsieJavaScriptEngine/CommonRegExps.cs +++ b/src/MsieJavaScriptEngine/Helpers/CommonRegExps.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.Helpers { /// /// Common regular expressions @@ -11,6 +11,11 @@ internal static class CommonRegExps public const string JsNamePattern = @"[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}]" + @"[$_\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}\p{Nl}\u200C\u200D\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*"; + /// + /// Pattern for working with JS full names + /// + public const string JsFullNamePattern = JsNamePattern + @"(?:\." + JsNamePattern + @")*"; + /// /// Pattern for working with document names /// diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 7f8ee08..9f83143 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -5,6 +5,8 @@ using System.Text; using System.Text.RegularExpressions; +using MsieJavaScriptEngine; +using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -22,7 +24,7 @@ public static class JsErrorHelpers /// private static readonly Regex _callStackLineRegex = new Regex(@"^[ ]{3}at " + - @"(?[A-Za-z][A-Za-z ]*|" + CommonRegExps.JsNamePattern + @") " + + @"(?[\w][\w ]*|" + CommonRegExps.JsFullNamePattern + @") " + @"\((?" + CommonRegExps.DocumentNamePattern + @"):" + @"(?\d+):(?\d+)\)$"); @@ -100,7 +102,7 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) { stackBuilder.AppendLine(); } - WriteErrorLocation(stackBuilder, stackItem.FunctionName, stackItem.DocumentName, + WriteErrorLocationLine(stackBuilder, stackItem.FunctionName, stackItem.DocumentName, stackItem.LineNumber, stackItem.ColumnNumber); } @@ -173,7 +175,8 @@ internal static string GenerateErrorMessage(string type, string description, str StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); if (!string.IsNullOrWhiteSpace(type)) { - messageBuilder.AppendFormat("{0}: ", type); + messageBuilder.Append(type); + messageBuilder.Append(": "); } messageBuilder.Append(description); @@ -187,7 +190,7 @@ internal static string GenerateErrorMessage(string type, string description, str if (!string.IsNullOrWhiteSpace(documentName) || lineNumber > 0) { messageBuilder.AppendLine(); - WriteErrorLocation(messageBuilder, string.Empty, documentName, lineNumber, columnNumber, + WriteErrorLocationLine(messageBuilder, string.Empty, documentName, lineNumber, columnNumber, sourceFragment); } } @@ -230,6 +233,8 @@ public static string GenerateErrorDetails(JsException jsException, bool omitMess } } + detailsBuilder.TrimEnd(); + string errorDetails = detailsBuilder.ToString(); StringBuilderPool.ReleaseBuilder(detailsBuilder); @@ -260,6 +265,8 @@ public static string GenerateErrorDetails(JsScriptException jsScriptException, WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); } + detailsBuilder.TrimEnd(); + string errorDetails = detailsBuilder.ToString(); StringBuilderPool.ReleaseBuilder(detailsBuilder); @@ -285,6 +292,8 @@ public static string GenerateErrorDetails(JsRuntimeException jsRuntimeException, WriteScriptErrorDetails(detailsBuilder, jsRuntimeException); WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); + detailsBuilder.TrimEnd(); + string errorDetails = detailsBuilder.ToString(); StringBuilderPool.ReleaseBuilder(detailsBuilder); @@ -375,6 +384,19 @@ private static void WriteRuntimeErrorDetails(StringBuilder buffer, #endregion + #region Exception wrapping + + public static JsEngineLoadException WrapUnknownEngineLoadException(Exception originalException, + string engineModeName) + { + string message = string.Format(CommonStrings.Engine_JsEngineNotLoaded, engineModeName) + " " + + string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalException.Message); + + return new JsEngineLoadException(message, engineModeName, originalException); + } + + #endregion + #region Misc /// @@ -442,7 +464,7 @@ internal static string GetSourceFragment(string sourceLine, int columnNumber, } /// - /// Writes a information about error location to the buffer + /// Writes a error location line to the buffer /// /// Instance of /// Function name @@ -450,7 +472,7 @@ internal static string GetSourceFragment(string sourceLine, int columnNumber, /// Line number /// Column number /// Source fragment - internal static void WriteErrorLocation(StringBuilder buffer, string functionName, + internal static void WriteErrorLocationLine(StringBuilder buffer, string functionName, string documentName, int lineNumber, int columnNumber, string sourceFragment = "") { bool functionNameNotEmpty = !string.IsNullOrWhiteSpace(functionName); @@ -482,7 +504,8 @@ internal static void WriteErrorLocation(StringBuilder buffer, string functionNam buffer.Append(lineNumber); if (columnNumber > 0) { - buffer.AppendFormat(":{0}", columnNumber); + buffer.Append(":"); + buffer.Append(columnNumber); } } if (functionNameNotEmpty) @@ -498,6 +521,43 @@ internal static void WriteErrorLocation(StringBuilder buffer, string functionNam } } + #region Obsolete methods + + /// + /// Generates a detailed error message + /// + /// JS exception + /// Detailed error message + [Obsolete("Use a `GenerateErrorDetails` method")] + public static string Format(JsException jsException) + { + return GenerateErrorDetails(jsException); + } + + /// + /// Generates a detailed error message + /// + /// JS script exception + /// Detailed error message + [Obsolete("Use a `GenerateErrorDetails` method")] + public static string Format(JsScriptException jsScriptException) + { + return GenerateErrorDetails(jsScriptException); + } + + /// + /// Generates a detailed error message + /// + /// JS runtime exception + /// Detailed error message + [Obsolete("Use a `GenerateErrorDetails` method")] + public static string Format(JsRuntimeException jsRuntimeException) + { + return GenerateErrorDetails(jsRuntimeException); + } + + #endregion + #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs b/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs index 08944a7..bd26b34 100644 --- a/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs @@ -1,6 +1,6 @@ using System; -using MsieJavaScriptEngine.Utilities; +using MsieJavaScriptEngine.Extensions; namespace MsieJavaScriptEngine.Helpers { diff --git a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs index 9d1a6b7..a1f5026 100644 --- a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs @@ -1,6 +1,7 @@ using System; using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine { diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index 1f93d08..82ae224 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -152,13 +152,30 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont /// A string that represents the current exception public override string ToString() { - string baseResult = base.ToString(); + StringBuilder resultBuilder = StringBuilderPool.GetBuilder(); + resultBuilder.Append(this.GetType().FullName); + resultBuilder.Append(": "); + resultBuilder.Append(this.Message); + string errorDetails = JsErrorHelpers.GenerateErrorDetails(this, true); + if (errorDetails.Length > 0) + { + resultBuilder.AppendLine(); + resultBuilder.AppendLine(); + resultBuilder.Append(errorDetails); + } - StringBuilder resultBuilder = StringBuilderPool.GetBuilder(); - resultBuilder.AppendLine(baseResult); - resultBuilder.AppendLine("--- Script error details follow ---"); - resultBuilder.Append(errorDetails); + if (this.InnerException != null) + { + resultBuilder.Append(" ---> "); + resultBuilder.Append(this.InnerException.ToString()); + } + + if (this.StackTrace != null) + { + resultBuilder.AppendLine(); + resultBuilder.AppendLine(this.StackTrace); + } string result = resultBuilder.ToString(); StringBuilderPool.ReleaseBuilder(resultBuilder); diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index e40107f..b0b44c0 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -4,6 +4,8 @@ using System.Runtime.InteropServices; #endif +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine.JsRt { /// @@ -100,10 +102,7 @@ protected virtual void Dispose(bool disposing) #if NETSTANDARD if (disposing) { - if (_externalObjects != null) - { - _externalObjects.Clear(); - } + _externalObjects?.Clear(); _externalObjectFinalizeCallback = null; } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 84e83ea..7d88ef7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -9,6 +9,7 @@ #endif using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -71,41 +72,45 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) : base(settings) { - _dispatcher.Invoke(() => + try { - try + _dispatcher.Invoke(() => { _jsRuntime = CreateJsRuntime(); _jsContext = _jsRuntime.CreateContext(); - _jsContext.AddRef(); - } - catch (DllNotFoundException e) - { - if (e.Message.IndexOf("'" + DllName.Chakra + "'", StringComparison.OrdinalIgnoreCase) != -1) + if (_jsContext.IsValid) { - throw new WrapperEngineLoadException( - string.Format(CommonStrings.Engine_EdgeJsEngineNotLoaded, e.Message), - _engineModeName - ); + _jsContext.AddRef(); } - - throw; - } - catch (OriginalException e) + }); + } + catch (DllNotFoundException e) + { + throw WrapTypeLoadException(e); + } +#if NETSTANDARD1_3 + catch (TypeLoadException e) +#else + catch (EntryPointNotFoundException e) +#endif + { + throw WrapTypeLoadException(e); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + catch (Exception e) + { + throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + } + finally + { + if (!_jsContext.IsValid) { - if (e.ErrorCode == JsErrorCode.WrongThread) - { - throw new WrapperUsageException( - CommonStrings.Usage_JsEnginesConflictOnMachine, - _engineModeName - ); - } - else - { - throw ConvertOriginalExceptionToWrapperException(e); - } + Dispose(); } - }); + } } /// @@ -153,7 +158,7 @@ public static bool IsSupported() } catch (DllNotFoundException e) { - if (e.Message.IndexOf("'" + DllName.Chakra + "'", StringComparison.OrdinalIgnoreCase) != -1) + if (e.Message.ContainsQuotedValue(DllName.Chakra)) { _isSupported = false; } @@ -855,8 +860,7 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) } #endif - private WrapperException ConvertOriginalExceptionToWrapperException( - OriginalException originalException) + private WrapperException WrapJsException(OriginalException originalException) { WrapperException wrapperException; JsErrorCode errorCode = originalException.ErrorCode; @@ -876,76 +880,94 @@ private WrapperException ConvertOriginalExceptionToWrapperException( if (errorValue.IsValid) { - EdgeJsValue messagePropertyValue = errorValue.GetProperty("message"); - description = messagePropertyValue.ConvertToString().ToString(); - - EdgeJsValue namePropertyValue = errorValue.GetProperty("name"); - type = namePropertyValue.ConvertToString().ToString(); + JsValueType errorValueType = errorValue.ValueType; - EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + if (errorValueType == JsValueType.Error + || errorValueType == JsValueType.Object) { - EdgeJsPropertyId descriptionPropertyId = EdgeJsPropertyId.FromString("description"); - if (errorValue.HasProperty(descriptionPropertyId)) - { - EdgeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); - description = descriptionPropertyValue.ConvertToString().ToString(); - } + EdgeJsValue messagePropertyValue = errorValue.GetProperty("message"); + description = messagePropertyValue.ConvertToString().ToString(); - EdgeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); - string messageWithTypeAndCallStack = stackPropertyValue.ConvertToString().ToString(); - string messageWithType = errorValue.ConvertToString().ToString(); - string rawCallStack = messageWithTypeAndCallStack - .TrimStart(messageWithType) - .TrimStart(new char[] { '\n', '\r' }) - ; + EdgeJsValue namePropertyValue = errorValue.GetProperty("name"); + type = namePropertyValue.ValueType == JsValueType.String ? + namePropertyValue.ConvertToString().ToString() : string.Empty; - CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); - if (callStackItems.Length > 0) + EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) { - CallStackItem firstCallStackItem = callStackItems[0]; - documentName = firstCallStackItem.DocumentName; - lineNumber = firstCallStackItem.LineNumber; - columnNumber = firstCallStackItem.ColumnNumber; - callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); - } + EdgeJsPropertyId descriptionPropertyId = EdgeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) + { + EdgeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + if (descriptionPropertyValue.ValueType == JsValueType.String + && descriptionPropertyValue.StringLength > 0) + { + description = descriptionPropertyValue.ConvertToString().ToString(); + } + } - message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); - } - else - { - EdgeJsPropertyId urlPropertyId = EdgeJsPropertyId.FromString("url"); - if (errorValue.HasProperty(urlPropertyId)) - { - EdgeJsValue urlPropertyValue = errorValue.GetProperty(urlPropertyId); - documentName = urlPropertyValue.ConvertToString().ToString(); - } + EdgeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); + string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? + stackPropertyValue.ConvertToString().ToString() : string.Empty; + string messageWithType = errorValue.ConvertToString().ToString(); + string rawCallStack = messageWithTypeAndCallStack + .TrimStart(messageWithType) + .TrimStart("Error") + .TrimStart(new char[] { '\n', '\r' }) + ; - EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); - if (errorValue.HasProperty(linePropertyId)) - { - EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; - } + CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + if (callStackItems.Length > 0) + { + CallStackItem firstCallStackItem = callStackItems[0]; + documentName = firstCallStackItem.DocumentName; + lineNumber = firstCallStackItem.LineNumber; + columnNumber = firstCallStackItem.ColumnNumber; + callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); + } - EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); - if (errorValue.HasProperty(columnPropertyId)) - { - EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; + message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); } - - string sourceLine = string.Empty; - EdgeJsPropertyId sourcePropertyId = EdgeJsPropertyId.FromString("source"); - if (errorValue.HasProperty(sourcePropertyId)) + else { - EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceLine = sourcePropertyValue.ConvertToString().ToString(); - } + EdgeJsPropertyId urlPropertyId = EdgeJsPropertyId.FromString("url"); + if (errorValue.HasProperty(urlPropertyId)) + { + EdgeJsValue urlPropertyValue = errorValue.GetProperty(urlPropertyId); + documentName = urlPropertyValue.ConvertToString().ToString(); + } + + EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); + if (errorValue.HasProperty(linePropertyId)) + { + EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); + lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; + } + + EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); + if (errorValue.HasProperty(columnPropertyId)) + { + EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; + } + + string sourceLine = string.Empty; + EdgeJsPropertyId sourcePropertyId = EdgeJsPropertyId.FromString("source"); + if (errorValue.HasProperty(sourcePropertyId)) + { + EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); + sourceLine = sourcePropertyValue.ConvertToString().ToString(); + } - sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); - message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, - lineNumber, columnNumber, sourceFragment); + sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + lineNumber, columnNumber, sourceFragment); + } + } + else + { + message = errorValue.ConvertToString().ToString(); + description = message; } } @@ -1001,6 +1023,29 @@ private WrapperException ConvertOriginalExceptionToWrapperException( return wrapperException; } + private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException originalTypeLoadException) + { + string originalMessage = originalTypeLoadException.Message; + string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string message; + + if (originalTypeLoadException is DllNotFoundException + && originalMessage.ContainsQuotedValue(DllName.Chakra)) + { + message = jsEngineNotLoadedPart + " " + + string.Format(CommonStrings.Engine_AssemblyNotRegistered, DllName.Chakra) + " " + + string.Format(CommonStrings.Engine_EdgeInstallationRequired) + ; + } + else + { + message = jsEngineNotLoadedPart + " " + + string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalMessage); + } + + return new WrapperEngineLoadException(message, _engineModeName, originalTypeLoadException); + } + #endregion #region ChakraJsRtJsEngineBase overrides @@ -1033,7 +1078,7 @@ public override object Evaluate(string expression, string documentName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1053,7 +1098,7 @@ public override void Execute(string code, string documentName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1095,11 +1140,17 @@ public override object CallFunction(string functionName, params object[] args) .Concat(processedArgs) .ToArray() ; - resultValue = functionValue.CallFunction(allProcessedArgs); - foreach (EdgeJsValue processedArg in processedArgs) + try { - RemoveReferenceToValue(processedArg); + resultValue = functionValue.CallFunction(allProcessedArgs); + } + finally + { + foreach (EdgeJsValue processedArg in processedArgs) + { + RemoveReferenceToValue(processedArg); + } } } else @@ -1111,7 +1162,7 @@ public override object CallFunction(string functionName, params object[] args) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1141,7 +1192,7 @@ public override bool HasVariable(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1163,7 +1214,7 @@ public override object GetVariableValue(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1180,14 +1231,20 @@ public override void SetVariableValue(string variableName, object value) try { EdgeJsValue inputValue = MapToScriptType(value); - AddReferenceToValue(inputValue); - EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); - RemoveReferenceToValue(inputValue); + + try + { + EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + } + finally + { + RemoveReferenceToValue(inputValue); + } } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1211,7 +1268,7 @@ public override void RemoveVariable(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1230,7 +1287,7 @@ public override void EmbedHostObject(string itemName, object value) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1253,7 +1310,7 @@ public override void EmbedHostType(string itemName, Type type) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1295,7 +1352,10 @@ protected override void Dispose(bool disposing) { _dispatcher.Invoke(() => { - _jsContext.Release(); + if (_jsContext.IsValid) + { + _jsContext.Release(); + } _jsRuntime.Dispose(); }); _dispatcher.Dispose(); @@ -1306,10 +1366,7 @@ protected override void Dispose(bool disposing) if (disposing) { - if (_nativeFunctions != null) - { - _nativeFunctions.Clear(); - } + _nativeFunctions?.Clear(); } #endif } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs index 5188275..95d3b56 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs @@ -1,5 +1,7 @@ using System; +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine.JsRt.Edge { /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs index 722d703..4fa0dfe 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD1_3 using System; using System.Runtime.Serialization; -#endif +#endif namespace MsieJavaScriptEngine.JsRt.Edge { /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 31f0140..f2979a8 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -924,7 +924,7 @@ public EdgeJsValue CallFunction(params EdgeJsValue[] arguments) if (arguments.Length > ushort.MaxValue) { - throw new ArgumentOutOfRangeException("arguments"); + throw new ArgumentOutOfRangeException(nameof(arguments)); } EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCallFunction(this, arguments, (ushort)arguments.Length, out returnReference)); @@ -946,7 +946,7 @@ public EdgeJsValue ConstructObject(params EdgeJsValue[] arguments) if (arguments.Length > ushort.MaxValue) { - throw new ArgumentOutOfRangeException("arguments"); + throw new ArgumentOutOfRangeException(nameof(arguments)); } EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsConstructObject(this, arguments, (ushort)arguments.Length, out returnReference)); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 61bf336..c03b819 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -7,9 +7,11 @@ using System.Reflection; using System.Runtime.InteropServices; #endif +using System.Text; using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; +using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -77,61 +79,45 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraIeJsRtJsEngine(JsEngineSettings settings) : base(settings) { - _dispatcher.Invoke(() => + try { - try + _dispatcher.Invoke(() => { _jsRuntime = CreateJsRuntime(); _jsContext = _jsRuntime.CreateContext(); - _jsContext.AddRef(); - } - catch (DllNotFoundException e) - { - if (e.Message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1) + if (_jsContext.IsValid) { - throw new WrapperEngineLoadException( - string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message), - _engineModeName - ); + _jsContext.AddRef(); } - - throw; - } -#if NETSTANDARD - catch (TypeLoadException e) + }); + } + catch (DllNotFoundException e) + { + throw WrapTypeLoadException(e); + } +#if NETSTANDARD1_3 + catch (TypeLoadException e) #else - catch (EntryPointNotFoundException e) + catch (EntryPointNotFoundException e) #endif + { + throw WrapTypeLoadException(e); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + catch (Exception e) + { + throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + } + finally + { + if (!_jsContext.IsValid) { - string message = e.Message; - if (message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1 - && message.IndexOf("'JsCreateRuntime'", StringComparison.OrdinalIgnoreCase) != -1) - { - throw new WrapperEngineLoadException( - string.Format(CommonStrings.Engine_IeJsEngineNotLoaded, - _engineModeName, LOWER_IE_VERSION, e.Message), - _engineModeName - ); - } - - throw; - } - catch (OriginalException e) - { - if (e.ErrorCode == JsErrorCode.WrongThread) - { - throw new WrapperUsageException( - CommonStrings.Usage_JsEnginesConflictOnMachine, - _engineModeName - ); - } - else - { - throw ConvertOriginalExceptionToWrapperException(e); - } + Dispose(); } - }); + } } /// @@ -179,7 +165,7 @@ public static bool IsSupported() } catch (DllNotFoundException e) { - if (e.Message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1) + if (e.Message.ContainsQuotedValue(DllName.JScript9)) { _isSupported = false; } @@ -188,15 +174,15 @@ public static bool IsSupported() _isSupported = null; } } -#if NETSTANDARD +#if NETSTANDARD1_3 catch (TypeLoadException e) #else catch (EntryPointNotFoundException e) #endif { string message = e.Message; - if (message.IndexOf("'" + DllName.JScript9 + "'", StringComparison.OrdinalIgnoreCase) != -1 - && message.IndexOf("'JsCreateRuntime'", StringComparison.OrdinalIgnoreCase) != -1) + if (message.ContainsQuotedValue(DllName.JScript9) + && message.ContainsQuotedValue("JsCreateRuntime")) { _isSupported = false; } @@ -897,8 +883,7 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) } #endif - private WrapperException ConvertOriginalExceptionToWrapperException( - OriginalException originalException) + private WrapperException WrapJsException(OriginalException originalException) { WrapperException wrapperException; JsErrorCode errorCode = originalException.ErrorCode; @@ -918,73 +903,90 @@ private WrapperException ConvertOriginalExceptionToWrapperException( if (errorValue.IsValid) { - IeJsValue messagePropertyValue = errorValue.GetProperty("message"); - description = messagePropertyValue.ConvertToString().ToString(); - - IeJsValue namePropertyValue = errorValue.GetProperty("name"); - type = namePropertyValue.ConvertToString().ToString(); + JsValueType errorValueType = errorValue.ValueType; - IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + if (errorValueType == JsValueType.Error + || errorValue.ValueType == JsValueType.Object) { - IeJsPropertyId descriptionPropertyId = IeJsPropertyId.FromString("description"); - if (errorValue.HasProperty(descriptionPropertyId)) + IeJsValue messagePropertyValue = errorValue.GetProperty("message"); + description = messagePropertyValue.ConvertToString().ToString(); + + IeJsValue namePropertyValue = errorValue.GetProperty("name"); + type = namePropertyValue.ValueType == JsValueType.String ? + namePropertyValue.ConvertToString().ToString() : string.Empty; + + IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) { - IeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); - description = descriptionPropertyValue.ConvertToString().ToString(); - } + IeJsPropertyId descriptionPropertyId = IeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) + { + IeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + if (descriptionPropertyValue.ValueType == JsValueType.String + && descriptionPropertyValue.StringLength > 0) + { + description = descriptionPropertyValue.ConvertToString().ToString(); + } + } - IeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); - string messageWithTypeAndCallStack = stackPropertyValue.ConvertToString().ToString(); - string messageWithType = errorValue.ConvertToString().ToString(); - string rawCallStack = messageWithTypeAndCallStack - .TrimStart(messageWithType) - .TrimStart(new char[] { '\n', '\r' }) - ; + IeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); + string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? + stackPropertyValue.ConvertToString().ToString() : string.Empty; + string messageWithType = errorValue.ConvertToString().ToString(); + string rawCallStack = messageWithTypeAndCallStack + .TrimStart(messageWithType) + .TrimStart(new char[] { '\n', '\r' }) + ; - CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); - FixCallStackItems(callStackItems); + CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + if (callStackItems.Length > 0) + { + FixCallStackItems(callStackItems); - if (callStackItems.Length > 0) - { - CallStackItem firstCallStackItem = callStackItems[0]; - documentName = firstCallStackItem.DocumentName; - lineNumber = firstCallStackItem.LineNumber; - columnNumber = firstCallStackItem.ColumnNumber; - callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); + CallStackItem firstCallStackItem = callStackItems[0]; + documentName = firstCallStackItem.DocumentName; + lineNumber = firstCallStackItem.LineNumber; + columnNumber = firstCallStackItem.ColumnNumber; + callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); + } + + message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); } + else + { + type = errorCode == JsErrorCode.ScriptCompile ? JsErrorType.Syntax : type; - message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); - } - else - { - type = errorCode == JsErrorCode.ScriptCompile ? JsErrorType.Syntax : type; + IeJsPropertyId linePropertyId = IeJsPropertyId.FromString("line"); + if (errorValue.HasProperty(linePropertyId)) + { + IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); + lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; + } - IeJsPropertyId linePropertyId = IeJsPropertyId.FromString("line"); - if (errorValue.HasProperty(linePropertyId)) - { - IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; - } + IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); + if (errorValue.HasProperty(columnPropertyId)) + { + IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); + columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; + } - IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); - if (errorValue.HasProperty(columnPropertyId)) - { - IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; - } + string sourceLine = string.Empty; + IeJsPropertyId sourcePropertyId = IeJsPropertyId.FromString("source"); + if (errorValue.HasProperty(sourcePropertyId)) + { + IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); + sourceLine = sourcePropertyValue.ConvertToString().ToString(); + } - string sourceLine = string.Empty; - IeJsPropertyId sourcePropertyId = IeJsPropertyId.FromString("source"); - if (errorValue.HasProperty(sourcePropertyId)) - { - IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceLine = sourcePropertyValue.ConvertToString().ToString(); + sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + lineNumber, columnNumber, sourceFragment); } - - sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); - message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, - lineNumber, columnNumber, sourceFragment); + } + else + { + message = errorValue.ConvertToString().ToString(); + description = message; } } @@ -1048,13 +1050,45 @@ private static void FixCallStackItems(CallStackItem[] callStackItems) { foreach (CallStackItem callStackItem in callStackItems) { - if (callStackItem.FunctionName.Equals("Unknown script code", StringComparison.OrdinalIgnoreCase)) + if (callStackItem.FunctionName == "Unknown script code") { callStackItem.FunctionName = "Global code"; } } } + private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException originalTypeLoadException) + { + string originalMessage = originalTypeLoadException.Message; + bool isDllNotFound = originalTypeLoadException is DllNotFoundException; + string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string message; + + if (originalMessage.ContainsQuotedValue(DllName.JScript9) + && (isDllNotFound || originalMessage.ContainsQuotedValue("JsCreateRuntime"))) + { + StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); + messageBuilder.Append(jsEngineNotLoadedPart); + messageBuilder.Append(" "); + if (isDllNotFound) + { + messageBuilder.AppendFormat(CommonStrings.Engine_AssemblyNotRegistered, DllName.JScript9); + messageBuilder.Append(" "); + } + messageBuilder.AppendFormat(CommonStrings.Engine_IeInstallationRequired, LOWER_IE_VERSION); + + message = messageBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(messageBuilder); + } + else + { + message = jsEngineNotLoadedPart + " " + + string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalMessage); + } + + return new WrapperEngineLoadException(message, _engineModeName, originalTypeLoadException); + } + #endregion #region ChakraJsRtJsEngineBase overrides @@ -1102,7 +1136,7 @@ public override object Evaluate(string expression, string documentName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1122,7 +1156,7 @@ public override void Execute(string code, string documentName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1164,11 +1198,17 @@ public override object CallFunction(string functionName, params object[] args) .Concat(processedArgs) .ToArray() ; - resultValue = functionValue.CallFunction(allProcessedArgs); - foreach (IeJsValue processedArg in processedArgs) + try + { + resultValue = functionValue.CallFunction(allProcessedArgs); + } + finally { - RemoveReferenceToValue(processedArg); + foreach (IeJsValue processedArg in processedArgs) + { + RemoveReferenceToValue(processedArg); + } } } else @@ -1180,7 +1220,7 @@ public override object CallFunction(string functionName, params object[] args) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1210,7 +1250,7 @@ public override bool HasVariable(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1232,7 +1272,7 @@ public override object GetVariableValue(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1249,14 +1289,20 @@ public override void SetVariableValue(string variableName, object value) try { IeJsValue inputValue = MapToScriptType(value); - AddReferenceToValue(inputValue); - IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); - RemoveReferenceToValue(inputValue); + + try + { + IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + } + finally + { + RemoveReferenceToValue(inputValue); + } } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1280,7 +1326,7 @@ public override void RemoveVariable(string variableName) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1299,7 +1345,7 @@ public override void EmbedHostObject(string itemName, object value) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1322,7 +1368,7 @@ public override void EmbedHostType(string itemName, Type type) } catch (OriginalException e) { - throw ConvertOriginalExceptionToWrapperException(e); + throw WrapJsException(e); } } }); @@ -1364,7 +1410,10 @@ protected override void Dispose(bool disposing) { _dispatcher.Invoke(() => { - _jsContext.Release(); + if (_jsContext.IsValid) + { + _jsContext.Release(); + } _jsRuntime.Dispose(); }); _dispatcher.Dispose(); @@ -1375,10 +1424,7 @@ protected override void Dispose(bool disposing) if (disposing) { - if (_nativeFunctions != null) - { - _nativeFunctions.Clear(); - } + _nativeFunctions?.Clear(); } #endif } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs index 7470ca7..b53bab8 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs @@ -1,5 +1,7 @@ using System; +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine.JsRt.Ie { /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs index 043f9ca..aaeed01 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD1_3 using System; using System.Runtime.Serialization; -#endif +#endif namespace MsieJavaScriptEngine.JsRt.Ie { /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index 1d653f6..d1dcf29 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -902,7 +902,7 @@ public IeJsValue CallFunction(params IeJsValue[] arguments) if (arguments.Length > ushort.MaxValue) { - throw new ArgumentOutOfRangeException("arguments"); + throw new ArgumentOutOfRangeException(nameof(arguments)); } IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCallFunction(this, arguments, (ushort)arguments.Length, out returnReference)); @@ -924,7 +924,7 @@ public IeJsValue ConstructObject(params IeJsValue[] arguments) if (arguments.Length > ushort.MaxValue) { - throw new ArgumentOutOfRangeException("arguments"); + throw new ArgumentOutOfRangeException(nameof(arguments)); } IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsConstructObject(this, arguments, (ushort)arguments.Length, out returnReference)); diff --git a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs index 86a290a..f538351 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD1_3 using System; using System.Runtime.Serialization; -#endif +#endif namespace MsieJavaScriptEngine.JsRt { /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs index bd03fe2..f65776b 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD1_3 using System; using System.Runtime.Serialization; -#endif +#endif namespace MsieJavaScriptEngine.JsRt { /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs index dc4eee0..8264af1 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs @@ -1,8 +1,8 @@ #if !NETSTANDARD1_3 using System; using System.Runtime.Serialization; -#endif +#endif namespace MsieJavaScriptEngine.JsRt { /// diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 6461487..ff0110a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - alpha3 + beta1 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 852ce92..088573d 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -10,6 +10,9 @@ using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.JsRt.Edge; using MsieJavaScriptEngine.JsRt.Ie; +#if NET40 +using MsieJavaScriptEngine.Polyfills.System; +#endif using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs similarity index 97% rename from src/MsieJavaScriptEngine/Utilities/TypeInfo.cs rename to src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs index c6e04d5..33afcee 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfo.cs +++ b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs @@ -2,7 +2,7 @@ using System; using System.Reflection; -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Polyfills.System.Reflection { /// /// Represents type declarations for class types, interface types, array types, value types, diff --git a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs similarity index 86% rename from src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs rename to src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs index 532472f..0839899 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeInfoExtensions.cs +++ b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs @@ -2,7 +2,7 @@ using System; using System.Reflection; -namespace MsieJavaScriptEngine.Utilities +namespace MsieJavaScriptEngine.Polyfills.System.Reflection { internal static class TypeInfoExtensions { diff --git a/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs b/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs new file mode 100644 index 0000000..f4b45ee --- /dev/null +++ b/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs @@ -0,0 +1,29 @@ +#if NET40 +using System; + +using MsieJavaScriptEngine.Polyfills.System.Reflection; + +namespace MsieJavaScriptEngine.Polyfills.System +{ + /// + /// Type extensions + /// + internal static class TypeExtensions + { + /// + /// Returns the representation of the specified type + /// + /// The type to convert + /// The converted object + public static TypeInfo GetTypeInfo(this Type source) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + return new TypeInfo(source); + } + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 9639cd0..844a2a6 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -97,6 +97,14 @@ internal static string Common_ResourceIsNull get { return GetString("Common_ResourceIsNull"); } } + /// + /// Looks up a localized string similar to "See the original error message: “{0}”." + /// + internal static string Common_SeeOriginalErrorMessage + { + get { return GetString("Common_SeeOriginalErrorMessage"); } + } + /// /// Looks up a localized string similar to "Cannot convert null to a value type." /// @@ -106,19 +114,35 @@ internal static string Common_ValueTypeCannotBeNull } /// - /// Looks up a localized string similar to "Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge..." + /// Looks up a localized string similar to "Most likely it happened, because the '{0}' assembly was not registered in your system." + /// + internal static string Engine_AssemblyNotRegistered + { + get { return GetString("Engine_AssemblyNotRegistered"); } + } + + /// + /// Looks up a localized string similar to "Try to install the Windows 10 with Edge browser." + /// + internal static string Engine_EdgeInstallationRequired + { + get { return GetString("Engine_EdgeInstallationRequired"); } + } + + /// + /// Looks up a localized string similar to "Try to install the Internet Explorer {0} or higher." /// - internal static string Engine_EdgeJsEngineNotLoaded + internal static string Engine_IeInstallationRequired { - get { return GetString("Engine_EdgeJsEngineNotLoaded"); } + get { return GetString("Engine_IeInstallationRequired"); } } /// - /// Looks up a localized string similar to "Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. See more..." + /// Looks up a localized string similar to "Failed to create instance of the MsieJsEngine in {0} mode." /// - internal static string Engine_IeJsEngineNotLoaded + internal static string Engine_JsEngineNotLoaded { - get { return GetString("Engine_IeJsEngineNotLoaded"); } + get { return GetString("Engine_JsEngineNotLoaded"); } } /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index b176837..6a0c3d4 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -132,20 +132,23 @@ Resource with name '{0}' is null. + + See the original error message: “{0}”. + Cannot convert null to a value type. - - Failed to load a Chakra Edge JsRT JavaScript engine. Try to install the Windows 10 with Edge browser. -See more details: - -{0} + + Most likely it happened, because the '{0}' assembly was not registered in your system. - - Failed to load a {0} JavaScript engine. Try to install the Internet Explorer {1} or higher. -See more details: - -{2} + + Try to install the Windows 10 with Edge browser. + + + Try to install the Internet Explorer {0} or higher. + + + Failed to create instance of the MsieJsEngine in {0} mode. Call stack diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index ce05b3d..79c59de 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -132,20 +132,23 @@ Ресурс с именем "{0}" содержит значение равное null! + + Смотри оригинальное сообщение об ошибке: «{0}». + Невозможно преобразовать null в значимый тип! - - Не удалось загрузить Chakra Edge JsRT JavaScript-движок! Попробуйте установить Windows 10 с веб-браузером Edge. -Смотрите более подробную информацию об ошибке: - -{0} + + Скорее всего, это произошло, потому что сборка "{0}" не была зарегистрирована в вашей системе. - - Не удалось загрузить {0} JavaScript-движок! Попробуйте установить Internet Explorer {1} или выше. -Смотрите более подробную информацию об ошибке: - -{2} + + Попробуйте установить Windows 10 с веб-браузером Edge. + + + Попробуйте установить Internet Explorer {0} или выше. + + + Не удалось создать экземпляр MsieJsEngine в режиме {0}. Стек вызовов diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 4205f5e..9ebaa24 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -6,6 +6,7 @@ using System.Runtime.CompilerServices; using System.Threading; +using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine @@ -187,7 +188,7 @@ public T Invoke(Func func) if (func == null) { - throw new ArgumentNullException("func"); + throw new ArgumentNullException(nameof(func)); } return (T)InnnerInvoke(() => func()); @@ -204,7 +205,7 @@ public void Invoke(Action action) if (action == null) { - throw new ArgumentNullException("action"); + throw new ArgumentNullException(nameof(action)); } InnnerInvoke(() => diff --git a/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs b/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs deleted file mode 100644 index d94bf6e..0000000 --- a/src/MsieJavaScriptEngine/Utilities/CharExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -#if !NETSTANDARD -using System.Runtime.CompilerServices; - -namespace MsieJavaScriptEngine.Utilities -{ - /// - /// Extensions for Char - /// - internal static class CharExtensions - { - [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] - public static bool IsWhitespace(this char source) - { - return source == ' ' || (source >= '\t' && source <= '\r'); - } - } -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs b/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs deleted file mode 100644 index 290496b..0000000 --- a/src/MsieJavaScriptEngine/Utilities/DelegateExtensions.cs +++ /dev/null @@ -1,28 +0,0 @@ -#if NET40 -using System; -using System.Reflection; - -namespace MsieJavaScriptEngine.Utilities -{ - /// - /// Delegate extensions - /// - internal static class DelegateExtensions - { - /// - /// Gets an object that represents the method represented by the specified delegate - /// - /// The delegate to examine - /// An object that represents the method - public static MethodInfo GetMethodInfo(this Delegate source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - return source.Method; - } - } -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs b/src/MsieJavaScriptEngine/Utilities/InterlockedStatedFlag.cs similarity index 85% rename from src/MsieJavaScriptEngine/InterlockedStatedFlag.cs rename to src/MsieJavaScriptEngine/Utilities/InterlockedStatedFlag.cs index 2aa396a..8875214 100644 --- a/src/MsieJavaScriptEngine/InterlockedStatedFlag.cs +++ b/src/MsieJavaScriptEngine/Utilities/InterlockedStatedFlag.cs @@ -1,6 +1,6 @@ using System.Threading; -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.Utilities { internal struct InterlockedStatedFlag { diff --git a/src/MsieJavaScriptEngine/StatedFlag.cs b/src/MsieJavaScriptEngine/Utilities/StatedFlag.cs similarity index 83% rename from src/MsieJavaScriptEngine/StatedFlag.cs rename to src/MsieJavaScriptEngine/Utilities/StatedFlag.cs index a90a429..a7c45c2 100644 --- a/src/MsieJavaScriptEngine/StatedFlag.cs +++ b/src/MsieJavaScriptEngine/Utilities/StatedFlag.cs @@ -1,4 +1,4 @@ -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.Utilities { internal struct StatedFlag { diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index f131718..4d7879d 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -7,6 +7,13 @@ #endif using OriginalTypeConverter = System.ComponentModel.TypeConverter; +using MsieJavaScriptEngine.Extensions; +#if NET40 +using MsieJavaScriptEngine.Polyfills.System; +#endif +#if NET40 || NETSTANDARD1_3 +using MsieJavaScriptEngine.Polyfills.System.Reflection; +#endif using MsieJavaScriptEngine.Resources; namespace MsieJavaScriptEngine.Utilities diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 2f761bf..d827d44 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -4,6 +4,9 @@ using System.Runtime.CompilerServices; using System.Text; +#if NET40 +using MsieJavaScriptEngine.Polyfills.System; +#endif using MsieJavaScriptEngine.Resources; namespace MsieJavaScriptEngine.Utilities diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index f7f73e4..8e0fc6d 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Alpha 3 + README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 1 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index ddb36c5..504f932 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,9 +3,9 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - alpha3 + beta1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.8 + 1.0.9 Library true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 9873be8..8b1ecc2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -337,10 +337,12 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } -var a = 8; -var b = 15; +(function (foo) { + var a = 8; + var b = 15; -foo(a, b);"; + foo(a, b); +})(foo);"; string targetOutput = "ReferenceError: 'bar' is undefined" + Environment.NewLine + " at functions.js:4:3"; diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index d26afe1..b2c32f6 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - alpha3 + beta1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 7441f87..9f9f5fe 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -342,13 +342,16 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } -var a = 8; -var b = 15; +(function (foo) { + var a = 8; + var b = 15; -foo(a, b);"; + foo(a, b); +})(foo);"; string targetOutputPattern = @"^ReferenceError: 'bar' is (un|not )defined" + Environment.NewLine + @" at foo \(functions.js:4:3\)" + Environment.NewLine + - @" at Global code \(functions.js:11:1\)$" + @" at Anonymous function \(functions.js:12:2\)" + Environment.NewLine + + @" at Global code \(functions.js:8:2\)$" ; JsRuntimeException exception = null; diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index f05f530..ff4c977 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,9 +3,9 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - alpha3 + beta1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.8 + 1.0.9 Library true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index 172030a..f621d4e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -341,13 +341,16 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } -var a = 8; -var b = 15; +(function (foo) { + var a = 8; + var b = 15; -foo(a, b);"; + foo(a, b); +})(foo);"; string targetOutput = "ReferenceError: 'bar' is undefined" + Environment.NewLine + " at foo (functions.js:4:3)" + Environment.NewLine + - " at Global code (functions.js:11:1)" + " at Anonymous function (functions.js:12:2)" + Environment.NewLine + + " at Global code (functions.js:8:2)" ; JsRuntimeException exception = null; diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index d32095d..a7ec624 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,9 +3,9 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - alpha3 + beta1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.8 + 1.0.9 Library true false diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index 2bb5442..15be1ec 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -337,10 +337,12 @@ public void GenerationOfRuntimeErrorMessageIsCorrect() } } -var a = 8; -var b = 15; +(function (foo) { + var a = 8; + var b = 15; -foo(a, b);"; + foo(a, b); +})(foo);"; string targetOutput = "TypeError: Object expected" + Environment.NewLine + " at functions.js:4:3" ; diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index a9f642e..9ac6610 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - alpha3 + beta1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 61fd5fa..10bc1d1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,9 +3,9 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - alpha3 + beta1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.8 + 1.0.9 Library true false From 326526386afd01575e3ba38a96cdb05991b34b28 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Fri, 6 Apr 2018 22:01:08 +0300 Subject: [PATCH 121/238] Was made refactoring --- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 50 ++++++----- .../ActiveScriptJsErrorHelpers.cs | 13 --- .../Helpers/JsErrorHelpers.cs | 90 +++++++++++++++---- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 47 +++++----- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 40 +++++---- 6 files changed, 142 insertions(+), 100 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 2cfc77a..ef6d44d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -137,7 +137,7 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e callStack = JsErrorHelpers.StringifyCallStackItems(GetCallStackItems()); } - message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, (int)lineNumber, columnNumber, sourceFragment, callStack); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index dad4b1e..46a733c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -5,7 +5,6 @@ using System.Reflection; using System.Runtime.InteropServices; using System.Runtime.InteropServices.Expando; -using System.Text; using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; @@ -135,29 +134,25 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, { throw WrapCOMException(e); } - catch (InvalidOperationException e) + catch (ActiveScriptException e) { - string message = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName) + " " + - e.Message; + string description = e.Description; + string message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); + + var wrapperEngineLoadException = new JsEngineLoadException(message, _engineModeName, e) + { + Description = description + }; - throw new JsEngineLoadException(message, _engineModeName, e); + throw wrapperEngineLoadException; } - catch (ActiveScriptException e) + catch (InvalidOperationException e) { - int errorNumber = ComHelpers.HResult.GetFacility(e.ErrorCode) == ComErrorCode.FACILITY_CONTROL ? - ComHelpers.HResult.GetCode(e.ErrorCode) : 0; - if (ActiveScriptJsErrorHelpers.IsEngineError(errorNumber)) - { - throw new JsEngineException(e.Message, _engineModeName, e); - } - else - { - throw WrapActiveScriptException(e); - } + throw JsErrorHelpers.WrapEngineLoadException(e, _engineModeName); } catch (Exception e) { - throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + throw JsErrorHelpers.WrapEngineLoadException(e, _engineModeName, true); } finally { @@ -606,24 +601,31 @@ private JsException WrapActiveScriptException(ActiveScriptException originalExce private JsEngineLoadException WrapCOMException(COMException originalComException) { - string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string description; string message; if (originalComException.ErrorCode == ComErrorCode.E_CLASS_NOT_REGISTERED) { - message = jsEngineNotLoadedPart + " " + - string.Format(CommonStrings.Engine_AssemblyNotRegistered, - _settings.EngineMode == JsEngineMode.Classic ? DllName.JScript : DllName.JScript9) + " " + + description = string.Format(CommonStrings.Engine_AssemblyNotRegistered, + _settings.EngineMode == JsEngineMode.Classic ? DllName.JScript : DllName.JScript9) + + " " + string.Format(CommonStrings.Engine_IeInstallationRequired, _lowerIeVersion) ; + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); } else { - message = jsEngineNotLoadedPart + " " + - string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalComException.Message); + description = originalComException.Message; + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName, true); } - return new JsEngineLoadException(message, _engineModeName, originalComException); + var wrapperEngineLoadException = new JsEngineLoadException(message, _engineModeName, + originalComException) + { + Description = description + }; + + return wrapperEngineLoadException; } /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs index d2d63a4..32c4c5f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -12,19 +12,6 @@ namespace MsieJavaScriptEngine.ActiveScript /// internal static class ActiveScriptJsErrorHelpers { - /// - /// Checks whether the specified error number is engine error - /// - /// Error number - /// Result of check (true - is engine error; false - is not engine error) - public static bool IsEngineError(int errorNumber) - { - bool result = errorNumber == JScriptSyntaxErrorNumber.OutOfMemory - || errorNumber == JScriptRuntimeErrorNumber.OutOfMemory; - - return result; - } - /// /// Checks whether the specified error number is compilation error /// diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 9f83143..72c3859 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -5,7 +5,6 @@ using System.Text; using System.Text.RegularExpressions; -using MsieJavaScriptEngine; using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -117,7 +116,59 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) #region Generation of error messages /// - /// Generates a error message + /// Generates a engine load error message + /// + /// Description of error + /// Name of JS engine mode + /// Makes a quote from the description + /// Engine load error message + internal static string GenerateEngineLoadErrorMessage(string description, string engineModeName, + bool quoteDescription = false) + { + if (engineModeName == null) + { + throw new ArgumentNullException(nameof(engineModeName)); + } + + if (string.IsNullOrWhiteSpace(engineModeName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(engineModeName)), + nameof(engineModeName) + ); + } + + string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, + engineModeName); + string message; + + if (!string.IsNullOrWhiteSpace(description)) + { + StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); + messageBuilder.Append(jsEngineNotLoadedPart); + messageBuilder.Append(" "); + if (quoteDescription) + { + messageBuilder.AppendFormat(CommonStrings.Common_SeeOriginalErrorMessage, description); + } + else + { + messageBuilder.Append(description); + } + + message = messageBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(messageBuilder); + } + else + { + message = jsEngineNotLoadedPart; + } + + return message; + } + + /// + /// Generates a script error message /// /// Type of the script error /// Description of error @@ -125,28 +176,28 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) /// Line number /// Column number /// Source fragment - /// Error message - internal static string GenerateErrorMessage(string type, string description, + /// Script error message + internal static string GenerateScriptErrorMessage(string type, string description, string documentName, int lineNumber, int columnNumber, string sourceFragment) { - return GenerateErrorMessage(type, description, documentName, lineNumber, columnNumber, + return GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment, string.Empty); } /// - /// Generates a error message + /// Generates a script error message /// /// Type of the script error /// Description of error /// String representation of the script call stack - /// Error message - internal static string GenerateErrorMessage(string type, string description, string callStack) + /// Script error message + internal static string GenerateScriptErrorMessage(string type, string description, string callStack) { - return GenerateErrorMessage(type, description, string.Empty, 0, 0, string.Empty, callStack); + return GenerateScriptErrorMessage(type, description, string.Empty, 0, 0, string.Empty, callStack); } /// - /// Generates a error message + /// Generates a script error message /// /// Type of the script error /// Description of error @@ -155,8 +206,8 @@ internal static string GenerateErrorMessage(string type, string description, str /// Column number /// Source fragment /// String representation of the script call stack - /// Error message - internal static string GenerateErrorMessage(string type, string description, string documentName, + /// Script error message + internal static string GenerateScriptErrorMessage(string type, string description, string documentName, int lineNumber, int columnNumber, string sourceFragment, string callStack) { if (description == null) @@ -386,13 +437,18 @@ private static void WriteRuntimeErrorDetails(StringBuilder buffer, #region Exception wrapping - public static JsEngineLoadException WrapUnknownEngineLoadException(Exception originalException, - string engineModeName) + public static JsEngineLoadException WrapEngineLoadException(Exception exception, + string engineModeName, bool quoteDescription = false) { - string message = string.Format(CommonStrings.Engine_JsEngineNotLoaded, engineModeName) + " " + - string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalException.Message); + string description = exception.Message; + string message = GenerateEngineLoadErrorMessage(description, engineModeName, quoteDescription); + + var jsEngineLoadException = new JsEngineLoadException(message, engineModeName, exception) + { + Description = description + }; - return new JsEngineLoadException(message, engineModeName, originalException); + return jsEngineLoadException; } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 7d88ef7..b7ffd06 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -86,23 +86,11 @@ public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) } catch (DllNotFoundException e) { - throw WrapTypeLoadException(e); - } -#if NETSTANDARD1_3 - catch (TypeLoadException e) -#else - catch (EntryPointNotFoundException e) -#endif - { - throw WrapTypeLoadException(e); - } - catch (OriginalException e) - { - throw WrapJsException(e); + throw WrapDllNotFoundException(e); } catch (Exception e) { - throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + throw JsErrorHelpers.WrapEngineLoadException(e, _engineModeName, true); } finally { @@ -926,7 +914,7 @@ private WrapperException WrapJsException(OriginalException originalException) callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); } - message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); + message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, callStack); } else { @@ -960,7 +948,7 @@ private WrapperException WrapJsException(OriginalException originalException) } sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); - message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } } @@ -1023,27 +1011,34 @@ private WrapperException WrapJsException(OriginalException originalException) return wrapperException; } - private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException originalTypeLoadException) + private WrapperEngineLoadException WrapDllNotFoundException( + DllNotFoundException originalDllNotFoundException) { - string originalMessage = originalTypeLoadException.Message; - string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string originalMessage = originalDllNotFoundException.Message; + string description; string message; - if (originalTypeLoadException is DllNotFoundException - && originalMessage.ContainsQuotedValue(DllName.Chakra)) + if (originalMessage.ContainsQuotedValue(DllName.Chakra)) { - message = jsEngineNotLoadedPart + " " + - string.Format(CommonStrings.Engine_AssemblyNotRegistered, DllName.Chakra) + " " + + description = string.Format(CommonStrings.Engine_AssemblyNotRegistered, DllName.Chakra) + + " " + string.Format(CommonStrings.Engine_EdgeInstallationRequired) ; + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); } else { - message = jsEngineNotLoadedPart + " " + - string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalMessage); + description = originalMessage; + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName, true); } - return new WrapperEngineLoadException(message, _engineModeName, originalTypeLoadException); + var wrapperEngineLoadException = new WrapperEngineLoadException(message, _engineModeName, + originalDllNotFoundException) + { + Description = description + }; + + return wrapperEngineLoadException; } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index c03b819..56a74d5 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -103,13 +103,9 @@ public ChakraIeJsRtJsEngine(JsEngineSettings settings) { throw WrapTypeLoadException(e); } - catch (OriginalException e) - { - throw WrapJsException(e); - } catch (Exception e) { - throw JsErrorHelpers.WrapUnknownEngineLoadException(e, _engineModeName); + throw JsErrorHelpers.WrapEngineLoadException(e, _engineModeName, true); } finally { @@ -950,7 +946,7 @@ private WrapperException WrapJsException(OriginalException originalException) callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); } - message = JsErrorHelpers.GenerateErrorMessage(type, description, callStack); + message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, callStack); } else { @@ -979,7 +975,7 @@ private WrapperException WrapJsException(OriginalException originalException) } sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); - message = JsErrorHelpers.GenerateErrorMessage(type, description, documentName, + message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } } @@ -1061,32 +1057,38 @@ private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException origi { string originalMessage = originalTypeLoadException.Message; bool isDllNotFound = originalTypeLoadException is DllNotFoundException; - string jsEngineNotLoadedPart = string.Format(CommonStrings.Engine_JsEngineNotLoaded, _engineModeName); + string description; string message; if (originalMessage.ContainsQuotedValue(DllName.JScript9) && (isDllNotFound || originalMessage.ContainsQuotedValue("JsCreateRuntime"))) { - StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); - messageBuilder.Append(jsEngineNotLoadedPart); - messageBuilder.Append(" "); + StringBuilder descriptionBuilder = StringBuilderPool.GetBuilder(); if (isDllNotFound) { - messageBuilder.AppendFormat(CommonStrings.Engine_AssemblyNotRegistered, DllName.JScript9); - messageBuilder.Append(" "); + descriptionBuilder.AppendFormat(CommonStrings.Engine_AssemblyNotRegistered, DllName.JScript9); + descriptionBuilder.Append(" "); } - messageBuilder.AppendFormat(CommonStrings.Engine_IeInstallationRequired, LOWER_IE_VERSION); + descriptionBuilder.AppendFormat(CommonStrings.Engine_IeInstallationRequired, LOWER_IE_VERSION); + + description = descriptionBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(descriptionBuilder); - message = messageBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(messageBuilder); + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); } else { - message = jsEngineNotLoadedPart + " " + - string.Format(CommonStrings.Common_SeeOriginalErrorMessage, originalMessage); + description = originalMessage; + message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName, true); } - return new WrapperEngineLoadException(message, _engineModeName, originalTypeLoadException); + var wrapperEngineLoadException = new WrapperEngineLoadException(message, _engineModeName, + originalTypeLoadException) + { + Description = description + }; + + return wrapperEngineLoadException; } #endregion From b6fa1442b90bab08ce6efdac32aae3e20f2c3bd5 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sun, 8 Apr 2018 20:27:40 +0300 Subject: [PATCH 122/238] Version 3.0.0 Beta 1 --- CHANGELOG.md | 10 ++++++++++ .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2abfa37..65d4aec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ Change log ========== +## v3.0.0 Beta 1 - April 8, 2018 + * Format of the error messages was unified + * Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class. + * In the `JsException` class was added two new properties: `Category` and `Description` + * From the `JsRuntimeException` class was removed one property - `ErrorCode` + * In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack` + * `JsScriptInterruptedException` class was renamed to the `JsInterruptedException` class and now is inherited from the `JsRuntimeException` class + * `JsEngineLoadException` class now is inherited from the `JsEngineException` class + * `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails` + ## v3.0.0 Alpha 3 - December 10, 2017 * Added support of .NET Standard 2.0 * Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 46a733c..e3212ec 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -137,7 +137,7 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, catch (ActiveScriptException e) { string description = e.Description; - string message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); + string message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName, true); var wrapperEngineLoadException = new JsEngineLoadException(message, _engineModeName, e) { From 73b6cf363b718e3824dde0d80c71273cfec55a98 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 21 May 2018 19:53:55 +0300 Subject: [PATCH 123/238] 1. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource`; 2. In JsRT modes added a ability to pre-compile scripts. --- MsieJavaScriptEngine.sln | 4 + README.md | 4 +- global.json | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 10 +- .../ChakraActiveScriptJsEngine.cs | 6 + .../ClassicActiveScriptJsEngine.cs | 6 + .../Helpers/JsErrorHelpers.cs | 2 +- src/MsieJavaScriptEngine/IInnerJsEngine.cs | 20 ++ src/MsieJavaScriptEngine/InnerJsEngineBase.cs | 11 +- src/MsieJavaScriptEngine/JsException.cs | 2 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 55 ++- .../JsRt/Edge/EdgeJsContext.cs | 137 +++---- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 55 ++- .../JsRt/Ie/IeJsContext.cs | 131 ++++--- .../MsieJavaScriptEngine.csproj | 10 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 287 +++++++++++++++ src/MsieJavaScriptEngine/PrecompiledScript.cs | 60 ++++ .../Resources/CommonStrings.Designer.cs | 24 ++ .../Resources/CommonStrings.resx | 9 + .../Resources/CommonStrings.ru-ru.resx | 9 + src/MsieJavaScriptEngine/readme.txt | 20 +- .../PrecompilationTests.cs | 23 ++ .../PrecompilationTests.cs | 25 ++ .../PrecompilationTests.cs | 218 ++++++++++++ .../PrecompilationTests.cs | 217 ++++++++++++ .../PrecompilationTests.cs | 25 ++ .../CommonTestsBase.cs | 4 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- .../PrecompilationTestsBase.cs | 333 ++++++++++++++++++ .../Resources/declinationOfDays.js | 23 ++ .../Resources/declinationOfHours.js | 23 ++ test/SharedFiles/declinationOfMinutes.js | 23 ++ 32 files changed, 1620 insertions(+), 160 deletions(-) create mode 100644 src/MsieJavaScriptEngine/PrecompiledScript.cs create mode 100644 test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfDays.js create mode 100644 test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfHours.js create mode 100644 test/SharedFiles/declinationOfMinutes.js diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 1715d38..477383b 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -11,6 +11,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1F9B41F3-5 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{E3F8640B-91D8-4BBE-B807-D69D1DE0D818}" ProjectSection(SolutionItems) = preProject + test\SharedFiles\declinationOfMinutes.js = test\SharedFiles\declinationOfMinutes.js test\SharedFiles\link.txt = test\SharedFiles\link.txt test\SharedFiles\square.js = test\SharedFiles\square.js EndProjectSection @@ -77,4 +78,7 @@ Global {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {72233C70-DF61-449F-8D53-D456284CDA5D} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5035D2B6-B7C8-4A7F-8764-07B60AD66E96} + EndGlobalSection EndGlobal diff --git a/README.md b/README.md index 098408b..1e5e63f 100644 --- a/README.md +++ b/README.md @@ -54,13 +54,13 @@ namespace MsieJavaScriptEngine.Example.Console { Console.WriteLine("During loading of JavaScript engine an error occurred."); Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.Format(e)); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); } catch (JsRuntimeException e) { Console.WriteLine("During execution of JavaScript code an error occurred."); Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.Format(e)); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); } Console.ReadLine(); diff --git a/global.json b/global.json index e5fcd6f..1fb2843 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.103" + "version": "2.1.200" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index e3212ec..56f1f64 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -644,12 +644,11 @@ private string ShortenErrorCategoryName(string categoryName) #region IInnerJsEngine implementation - public override string Mode + public override PrecompiledScript Precompile(string code, string documentName) { - get { return _engineModeName; } + throw new NotSupportedException(); } - public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => @@ -688,6 +687,11 @@ public override void Execute(string code, string documentName) }); } + public override void Execute(PrecompiledScript precompiledScript) + { + throw new NotSupportedException(); + } + public override object CallFunction(string functionName, params object[] args) { object[] processedArgs = MapToScriptType(args); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 5b46969..ea885e9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -121,6 +121,12 @@ protected override void InnerRemoveVariable(string variableName) #region IInnerJsEngine implementation + public override bool SupportsScriptPrecompilation + { + get { return false; } + } + + public override void Interrupt() { _interruptRequested = true; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index da7fd8e..97a823d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -191,6 +191,12 @@ protected override void InnerRemoveVariable(string variableName) #region IInnerJsEngine implementation + public override bool SupportsScriptPrecompilation + { + get { return false; } + } + + public override void Interrupt() { var exceptionInfo = new EXCEPINFO diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 72c3859..4f4952f 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -464,7 +464,7 @@ public static JsEngineLoadException WrapEngineLoadException(Exception exception, internal static string GetSourceFragment(string sourceLine, int columnNumber, int maxFragmentLength = 100) { - if (string.IsNullOrWhiteSpace(sourceLine)) + if (string.IsNullOrEmpty(sourceLine)) { return string.Empty; } diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index 9232983..0d5ed42 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -12,6 +12,19 @@ internal interface IInnerJsEngine : IDisposable /// string Mode { get; } + /// + /// Gets a value that indicates if the JS engine supports script pre-compilation + /// + bool SupportsScriptPrecompilation { get; } + + + /// + /// Creates a pre-compiled script from JS code + /// + /// JS code + /// Document name + /// A pre-compiled script that can be executed by different instances of JS engine + PrecompiledScript Precompile(string code, string documentName); /// /// Evaluates an expression @@ -28,6 +41,13 @@ internal interface IInnerJsEngine : IDisposable /// Document name void Execute(string code, string documentName); + /// + /// Executes a pre-compiled script + /// + /// A pre-compiled script that can be executed by different + /// instances of JS engine + void Execute(PrecompiledScript precompiledScript); + /// /// Calls a function /// diff --git a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs index a1f5026..2befbaf 100644 --- a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs @@ -39,13 +39,22 @@ protected InnerJsEngineBase(JsEngineSettings settings) #region IInnerJsEngine implementation - public abstract string Mode { get; } + public string Mode + { + get { return _engineModeName; } + } + + public abstract bool SupportsScriptPrecompilation { get; } + public abstract PrecompiledScript Precompile(string code, string documentName); + public abstract object Evaluate(string expression, string documentName); public abstract void Execute(string code, string documentName); + public abstract void Execute(PrecompiledScript precompiledScript); + public abstract object CallFunction(string functionName, params object[] args); public abstract bool HasVariable(string variableName); diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index 82ae224..9ff2f72 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -20,7 +20,7 @@ namespace MsieJavaScriptEngine public class JsException : Exception { /// - /// JS engine mode + /// Name of JS engine mode /// private readonly string _engineMode = string.Empty; diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index b7ffd06..c583039 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -848,14 +848,15 @@ private void ProjectMethods(EdgeJsValue target, Type type, bool instance) } #endif - private WrapperException WrapJsException(OriginalException originalException) + private WrapperException WrapJsException(OriginalException originalException, + string defaultDocumentName = null) { WrapperException wrapperException; JsErrorCode errorCode = originalException.ErrorCode; string description = originalException.Message; string message = description; string type = string.Empty; - string documentName = string.Empty; + string documentName = defaultDocumentName ?? string.Empty; int lineNumber = 0; int columnNumber = 0; string callStack = string.Empty; @@ -908,7 +909,10 @@ private WrapperException WrapJsException(OriginalException originalException) if (callStackItems.Length > 0) { CallStackItem firstCallStackItem = callStackItems[0]; - documentName = firstCallStackItem.DocumentName; + if (firstCallStackItem.DocumentName.Length > 0) + { + documentName = firstCallStackItem.DocumentName; + } lineNumber = firstCallStackItem.LineNumber; columnNumber = firstCallStackItem.ColumnNumber; callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); @@ -1052,12 +1056,34 @@ protected override void InnerStartDebugging() #region IInnerJsEngine implementation - public override string Mode + public override bool SupportsScriptPrecompilation { - get { return _engineModeName; } + get { return true; } } + public override PrecompiledScript Precompile(string code, string documentName) + { + PrecompiledScript precompiledScript = _dispatcher.Invoke(() => + { + using (CreateJsScope()) + { + try + { + byte[] cachedBytes = EdgeJsContext.SerializeScript(code); + + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); + } + } + }); + + return precompiledScript; + } + public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => @@ -1099,6 +1125,25 @@ public override void Execute(string code, string documentName) }); } + public override void Execute(PrecompiledScript precompiledScript) + { + _dispatcher.Invoke(() => + { + using (CreateJsScope()) + { + try + { + EdgeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + } + }); + } + public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index eed4ca3..6c95c14 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -130,10 +130,8 @@ internal EdgeJsContext(IntPtr reference) /// Requires an active script context. /// /// - /// - /// The next system tick when there will be more idle work to do. Returns the - /// maximum number of ticks if there no upcoming idle work to do. - /// + /// The next system tick when there will be more idle work to do. Returns the + /// maximum number of ticks if there no upcoming idle work to do. public static uint Idle() { uint ticks; @@ -143,69 +141,76 @@ public static uint Idle() } /// - /// Parses a script and returns a Function representing the script + /// Parses a script and returns a function representing the script /// /// /// Requires an active script context. /// /// The script to parse - /// The cookie identifying the script that can be used - /// by script contexts that have debugging enabled - /// The location the script came from - /// The Function representing the script code - public static EdgeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) + /// A function representing the script code + public static EdgeJsValue ParseScript(string script) { - EdgeJsValue result; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseScript(script, sourceContext, sourceName, out result)); - - return result; + return ParseScript(script, JsSourceContext.None, string.Empty); } /// - /// Parses a serialized script and returns a Function representing the script + /// Parses a script and returns a function representing the script /// /// /// Requires an active script context. /// /// The script to parse - /// The serialized script - /// The cookie identifying the script that can be used + /// A cookie identifying the script that can be used /// by script contexts that have debugging enabled /// The location the script came from - /// The Function representing the script code - public static EdgeJsValue ParseScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + /// A function representing the script code + public static EdgeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) { EdgeJsValue result; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, sourceName, out result)); + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseScript(script, sourceContext, sourceName, + out result)); return result; } /// - /// Parses a script and returns a Function representing the script + /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The script to parse - /// The Function representing the script code - public static EdgeJsValue ParseScript(string script) + /// The serialized script + /// A function representing the script code + public static EdgeJsValue ParseSerializedScript(string script, byte[] buffer) { - return ParseScript(script, JsSourceContext.None, string.Empty); + return ParseSerializedScript(script, buffer, JsSourceContext.None, string.Empty); } /// - /// Parses a serialized script and returns a Function representing the script + /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The script to parse /// The serialized script - /// The Function representing the script code - public static EdgeJsValue ParseScript(string script, byte[] buffer) + /// A cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// A function representing the script code + public static EdgeJsValue ParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, + string sourceName) { - return ParseScript(script, buffer, JsSourceContext.None, string.Empty); + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, + sourceName, out result)); + + return result; } /// @@ -215,63 +220,70 @@ public static EdgeJsValue ParseScript(string script, byte[] buffer) /// Requires an active script context. /// /// The script to run - /// The cookie identifying the script that can be used - /// by script contexts that have debugging enabled - /// The location the script came from /// The result of the script, if any - public static EdgeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) + public static EdgeJsValue RunScript(string script) { - EdgeJsValue result; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunScript(script, sourceContext, sourceName, out result)); - - return result; + return RunScript(script, JsSourceContext.None, string.Empty); } /// - /// Runs a serialized script + /// Executes a script /// /// /// Requires an active script context. /// - /// The source code of the serialized script - /// The serialized script - /// The cookie identifying the script that can be used + /// The script to run + /// A cookie identifying the script that can be used /// by script contexts that have debugging enabled /// The location the script came from /// The result of the script, if any - public static EdgeJsValue RunScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + public static EdgeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) { EdgeJsValue result; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, sourceName, out result)); + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunScript(script, sourceContext, sourceName, + out result)); return result; } /// - /// Executes a script + /// Runs a serialized script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// - /// The script to run + /// The source code of the serialized script + /// The serialized script /// The result of the script, if any - public static EdgeJsValue RunScript(string script) + public static EdgeJsValue RunSerializedScript(string script, byte[] buffer) { - return RunScript(script, JsSourceContext.None, string.Empty); + return RunSerializedScript(script, buffer, JsSourceContext.None, string.Empty); } /// /// Runs a serialized script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The source code of the serialized script /// The serialized script + /// A cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from /// The result of the script, if any - public static EdgeJsValue RunScript(string script, byte[] buffer) + public static EdgeJsValue RunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, + string sourceName) { - return RunScript(script, buffer, JsSourceContext.None, string.Empty); + EdgeJsValue result; + EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, + sourceName, out result)); + + return result; } /// @@ -279,7 +291,7 @@ public static EdgeJsValue RunScript(string script, byte[] buffer) /// /// /// - /// SerializeScript parses a script and then stores the parsed form of the script in a + /// SerializeScript parses a script and then stores the parsed form of the script in a /// runtime-independent format. The serialized script then can be deserialized in any /// runtime without requiring the script to be re-parsed. /// @@ -288,14 +300,21 @@ public static EdgeJsValue RunScript(string script, byte[] buffer) /// /// /// The script to serialize - /// The buffer to put the serialized script into. Can be null. - /// The size of the buffer, in bytes, required to hold the serialized script - public static ulong SerializeScript(string script, byte[] buffer) + /// The buffer to put the serialized script into + public static byte[] SerializeScript(string script) { - var bufferSize = (ulong)buffer.Length; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize)); + byte[] buffer = null; + ulong bufferSize = 0; + + JsErrorCode errorCode = EdgeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); + EdgeJsErrorHelpers.ThrowIfError(errorCode); + + buffer = new byte[(int)bufferSize]; + + errorCode = EdgeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); + EdgeJsErrorHelpers.ThrowIfError(errorCode); - return bufferSize; + return buffer; } /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 56a74d5..84dc0cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -879,14 +879,15 @@ private void ProjectMethods(IeJsValue target, Type type, bool instance) } #endif - private WrapperException WrapJsException(OriginalException originalException) + private WrapperException WrapJsException(OriginalException originalException, + string defaultDocumentName = null) { WrapperException wrapperException; JsErrorCode errorCode = originalException.ErrorCode; string description = originalException.Message; string message = description; string type = string.Empty; - string documentName = string.Empty; + string documentName = defaultDocumentName ?? string.Empty; int lineNumber = 0; int columnNumber = 0; string callStack = string.Empty; @@ -940,7 +941,10 @@ private WrapperException WrapJsException(OriginalException originalException) FixCallStackItems(callStackItems); CallStackItem firstCallStackItem = callStackItems[0]; - documentName = firstCallStackItem.DocumentName; + if (firstCallStackItem.DocumentName.Length > 0) + { + documentName = firstCallStackItem.DocumentName; + } lineNumber = firstCallStackItem.LineNumber; columnNumber = firstCallStackItem.ColumnNumber; callStack = JsErrorHelpers.StringifyCallStackItems(callStackItems); @@ -1117,12 +1121,34 @@ protected override void InnerStartDebugging() #region IInnerJsEngine implementation - public override string Mode + public override bool SupportsScriptPrecompilation { - get { return _engineModeName; } + get { return true; } } + public override PrecompiledScript Precompile(string code, string documentName) + { + PrecompiledScript precompiledScript = _dispatcher.Invoke(() => + { + using (CreateJsScope()) + { + try + { + byte[] cachedBytes = IeJsContext.SerializeScript(code); + + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); + } + } + }); + + return precompiledScript; + } + public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => @@ -1164,6 +1190,25 @@ public override void Execute(string code, string documentName) }); } + public override void Execute(PrecompiledScript precompiledScript) + { + _dispatcher.Invoke(() => + { + using (CreateJsScope()) + { + try + { + IeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + } + }); + } + public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 3544d14..0094d33 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -144,69 +144,76 @@ public static uint Idle() } /// - /// Parses a script and returns a Function representing the script + /// Parses a script and returns a function representing the script /// /// /// Requires an active script context. /// /// The script to parse - /// The cookie identifying the script that can be used - /// by script contexts that have debugging enabled - /// The location the script came from - /// The Function representing the script code - public static IeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) + /// A function representing the script code + public static IeJsValue ParseScript(string script) { - IeJsValue result; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseScript(script, sourceContext, sourceName, out result)); - - return result; + return ParseScript(script, JsSourceContext.None, string.Empty); } /// - /// Parses a serialized script and returns a Function representing the script + /// Parses a script and returns a function representing the script /// /// /// Requires an active script context. /// /// The script to parse - /// The serialized script - /// The cookie identifying the script that can be used + /// A cookie identifying the script that can be used /// by script contexts that have debugging enabled /// The location the script came from - /// The Function representing the script code - public static IeJsValue ParseScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + /// A function representing the script code + public static IeJsValue ParseScript(string script, JsSourceContext sourceContext, string sourceName) { IeJsValue result; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, sourceName, out result)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseScript(script, sourceContext, sourceName, + out result)); return result; } /// - /// Parses a script and returns a Function representing the script + /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The script to parse - /// The Function representing the script code - public static IeJsValue ParseScript(string script) + /// The serialized script + /// A function representing the script code + public static IeJsValue ParseSerializedScript(string script, byte[] buffer) { - return ParseScript(script, JsSourceContext.None, string.Empty); + return ParseSerializedScript(script, buffer, JsSourceContext.None, string.Empty); } /// - /// Parses a serialized script and returns a Function representing the script + /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The script to parse /// The serialized script - /// The Function representing the script code - public static IeJsValue ParseScript(string script, byte[] buffer) + /// A cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from + /// A function representing the script code + public static IeJsValue ParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, + string sourceName) { - return ParseScript(script, buffer, JsSourceContext.None, string.Empty); + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsParseSerializedScript(script, buffer, sourceContext, + sourceName, out result)); + + return result; } /// @@ -216,61 +223,70 @@ public static IeJsValue ParseScript(string script, byte[] buffer) /// Requires an active script context. /// /// The script to run - /// The cookie identifying the script that can be used by script contexts that have debugging enabled - /// The location the script came from /// The result of the script, if any - public static IeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) + public static IeJsValue RunScript(string script) { - IeJsValue result; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunScript(script, sourceContext, sourceName, out result)); - - return result; + return RunScript(script, JsSourceContext.None, string.Empty); } /// - /// Runs a serialized script + /// Executes a script /// /// /// Requires an active script context. /// - /// The source code of the serialized script - /// The serialized script - /// The cookie identifying the script that can be used by script contexts that have debugging enabled + /// The script to run + /// A cookie identifying the script that can be used + /// by script contexts that have debugging enabled /// The location the script came from /// The result of the script, if any - public static IeJsValue RunScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceName) + public static IeJsValue RunScript(string script, JsSourceContext sourceContext, string sourceName) { IeJsValue result; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, sourceName, out result)); + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunScript(script, sourceContext, sourceName, + out result)); return result; } /// - /// Executes a script + /// Runs a serialized script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// - /// The script to run + /// The source code of the serialized script + /// The serialized script /// The result of the script, if any - public static IeJsValue RunScript(string script) + public static IeJsValue RunSerializedScript(string script, byte[] buffer) { - return RunScript(script, JsSourceContext.None, string.Empty); + return RunSerializedScript(script, buffer, JsSourceContext.None, string.Empty); } /// /// Runs a serialized script /// /// - /// Requires an active script context. + /// Requires an active script context. + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. /// /// The source code of the serialized script /// The serialized script + /// A cookie identifying the script that can be used + /// by script contexts that have debugging enabled + /// The location the script came from /// The result of the script, if any - public static IeJsValue RunScript(string script, byte[] buffer) + public static IeJsValue RunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, + string sourceName) { - return RunScript(script, buffer, JsSourceContext.None, string.Empty); + IeJsValue result; + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsRunSerializedScript(script, buffer, sourceContext, + sourceName, out result)); + + return result; } /// @@ -278,7 +294,7 @@ public static IeJsValue RunScript(string script, byte[] buffer) /// /// /// - /// SerializeScript parses a script and then stores the parsed form of the script in a + /// SerializeScript parses a script and then stores the parsed form of the script in a /// runtime-independent format. The serialized script then can be deserialized in any /// runtime without requiring the script to be re-parsed. /// @@ -287,14 +303,21 @@ public static IeJsValue RunScript(string script, byte[] buffer) /// /// /// The script to serialize - /// The buffer to put the serialized script into. Can be null. - /// The size of the buffer, in bytes, required to hold the serialized script - public static ulong SerializeScript(string script, byte[] buffer) + /// The buffer to put the serialized script into + public static byte[] SerializeScript(string script) { - var bufferSize = (ulong)buffer.Length; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize)); + byte[] buffer = null; + ulong bufferSize = 0; + + JsErrorCode errorCode = IeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); + IeJsErrorHelpers.ThrowIfError(errorCode); + + buffer = new byte[(int)bufferSize]; + + errorCode = IeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); + IeJsErrorHelpers.ThrowIfError(errorCode); - return bufferSize; + return buffer; } /// diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index ff0110a..cb39b90 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,14 +24,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Format of the error messages was unified; -2. Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class; -3. In the `JsException` class was added two new properties: `Category` and `Description`; -4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; -5. In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack`; -6. `JsScriptInterruptedException` class was renamed to the `JsInterruptedException` class and now is inherited from the `JsRuntimeException` class; -7. `JsEngineLoadException` class now is inherited from the `JsEngineException` class; -8. `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails`. + 1. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource`; +2. In JsRT modes added a ability to pre-compile scripts. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 088573d..f56eb95 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -57,6 +57,14 @@ public string Mode get { return _jsEngine.Mode; } } + /// + /// Gets a value that indicates if the JS engine supports script pre-compilation + /// + public bool SupportsScriptPrecompilation + { + get { return _jsEngine.SupportsScriptPrecompilation; } + } + /// /// Constructs an instance of MSIE JS engine @@ -219,6 +227,249 @@ private void VerifyNotDisposed() } } + /// + /// Creates a pre-compiled script from JS code + /// + /// JS code + /// A pre-compiled script that can be executed by different instances of JS engine + /// + /// + /// + /// + /// + public PrecompiledScript Precompile(string code) + { + return Precompile(code, string.Empty); + } + + /// + /// Creates a pre-compiled script from JS code + /// + /// JS code + /// Document name + /// A pre-compiled script that can be executed by different instances of JS engine + /// + /// + /// + /// + /// + public PrecompiledScript Precompile(string code, string documentName) + { + VerifyNotDisposed(); + + if (code == null) + { + throw new ArgumentNullException( + nameof(code), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(code)) + ); + } + + if (string.IsNullOrWhiteSpace(code)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(code)), + nameof(code) + ); + } + + if (!string.IsNullOrWhiteSpace(documentName) + && !ValidationHelpers.CheckDocumentNameFormat(documentName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidDocumentNameFormat, documentName), + nameof(documentName) + ); + } + + string uniqueDocumentName = _documentNameManager.GetUniqueName(documentName); + + return _jsEngine.Precompile(code, uniqueDocumentName); + } + + /// + /// Creates a pre-compiled script from JS file + /// + /// Path to the JS file + /// Text encoding + /// A pre-compiled script that can be executed by different instances of JS engine + /// + /// + /// + /// + /// + /// + /// + public PrecompiledScript PrecompileFile(string path, Encoding encoding = null) + { + VerifyNotDisposed(); + + if (path == null) + { + throw new ArgumentNullException( + nameof(path), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(path)) + ); + } + + if (string.IsNullOrWhiteSpace(path)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(path)), + nameof(path) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(path)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidFileNameFormat, path), + nameof(path) + ); + } + + string code = Utils.GetFileTextContent(path, encoding); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotPrecompileEmptyFile, path), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(path); + + return _jsEngine.Precompile(code, uniqueDocumentName); + } + + /// + /// Creates a pre-compiled script from embedded JS resource + /// + /// The case-sensitive resource name without the namespace of the specified type + /// The type, that determines the assembly and whose namespace is used to scope + /// the resource name + /// A pre-compiled script that can be executed by different instances of JS engine + /// + /// + /// + /// + /// + /// + /// + public PrecompiledScript PrecompileResource(string resourceName, Type type) + { + VerifyNotDisposed(); + + if (resourceName == null) + { + throw new ArgumentNullException( + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); + } + + if (type == null) + { + throw new ArgumentNullException( + nameof(type), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(type)) + ); + } + + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidResourceNameFormat, resourceName), + nameof(resourceName) + ); + } + + Assembly assembly = type.GetTypeInfo().Assembly; + string nameSpace = type.Namespace; + string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; + + string code = Utils.GetResourceAsString(resourceFullName, assembly); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotPrecompileEmptyResource, resourceFullName), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(resourceFullName); + + return _jsEngine.Precompile(code, uniqueDocumentName); + } + + /// + /// Creates a pre-compiled script from embedded JS resource + /// + /// The case-sensitive resource name + /// The assembly, which contains the embedded resource + /// A pre-compiled script that can be executed by different instances of JS engine + /// + /// + /// + /// + /// + /// + /// + public PrecompiledScript PrecompileResource(string resourceName, Assembly assembly) + { + VerifyNotDisposed(); + + if (resourceName == null) + { + throw new ArgumentNullException( + nameof(resourceName), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) + ); + } + + if (assembly == null) + { + throw new ArgumentNullException( + nameof(assembly), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(assembly)) + ); + } + + if (string.IsNullOrWhiteSpace(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), + nameof(resourceName) + ); + } + + if (!ValidationHelpers.CheckDocumentNameFormat(resourceName)) + { + throw new ArgumentException( + string.Format(CommonStrings.Usage_InvalidResourceNameFormat, resourceName), + nameof(resourceName) + ); + } + + string code = Utils.GetResourceAsString(resourceName, assembly); + if (string.IsNullOrWhiteSpace(code)) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotPrecompileEmptyResource, resourceName), + _jsEngine.Mode + ); + } + string uniqueDocumentName = _documentNameManager.GetUniqueName(resourceName); + + return _jsEngine.Precompile(code, uniqueDocumentName); + } + /// /// Evaluates an expression /// @@ -420,6 +671,42 @@ public void Execute(string code, string documentName) _jsEngine.Execute(code, uniqueDocumentName); } + /// + /// Executes a pre-compiled script + /// + /// A pre-compiled script that can be executed by different + /// instances of JS engine + /// + /// + /// + /// + /// + /// + /// + public void Execute(PrecompiledScript precompiledScript) + { + VerifyNotDisposed(); + + if (precompiledScript == null) + { + throw new ArgumentNullException( + nameof(precompiledScript), + string.Format(CommonStrings.Common_ArgumentIsNull, nameof(precompiledScript)) + ); + } + + if (precompiledScript.EngineMode != Mode) + { + throw new JsUsageException( + string.Format(CommonStrings.Usage_CannotExecutePrecompiledScriptForAnotherJsEngineMode, + precompiledScript.EngineMode), + _jsEngine.Mode + ); + } + + _jsEngine.Execute(precompiledScript); + } + /// /// Executes a code from JS file /// diff --git a/src/MsieJavaScriptEngine/PrecompiledScript.cs b/src/MsieJavaScriptEngine/PrecompiledScript.cs new file mode 100644 index 0000000..adb00e6 --- /dev/null +++ b/src/MsieJavaScriptEngine/PrecompiledScript.cs @@ -0,0 +1,60 @@ +namespace MsieJavaScriptEngine +{ + /// + /// Represents a pre-compiled script that can be executed by different instances of the MSIE JS engine + /// + public sealed class PrecompiledScript + { + /// + /// Gets a name of JS engine mode + /// + public string EngineMode + { + get; + private set; + } + + /// + /// Gets a source code of the script + /// + internal string Code + { + get; + private set; + } + + /// + /// Gets a cached data for accelerated recompilation + /// + internal byte[] CachedBytes + { + get; + private set; + } + + /// + /// Gets a document name + /// + internal string DocumentName + { + get; + private set; + } + + + /// + /// Constructs an instance of pre-compiled script + /// + /// Name of JS engine mode + /// The source code of the script + /// Cached data for accelerated recompilation + /// Document name + internal PrecompiledScript(string engineMode, string code, byte[] cachedBytes, string documentName) + { + EngineMode = engineMode; + Code = code; + CachedBytes = cachedBytes; + DocumentName = documentName; + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 844a2a6..638bd4e 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -265,6 +265,30 @@ internal static string Usage_CannotExecuteEmptyResource get { return GetString("Usage_CannotExecuteEmptyResource"); } } + /// + /// Looks up a localized string similar to "Сannot execute a pre-compiled script, because it was created for another mode with name `{0}`." + /// + internal static string Usage_CannotExecutePrecompiledScriptForAnotherJsEngineMode + { + get { return GetString("Usage_CannotExecutePrecompiledScriptForAnotherJsEngineMode"); } + } + + /// + /// Looks up a localized string similar to "Сannot pre-compile a '{0}' file, because it is empty." + /// + internal static string Usage_CannotPrecompileEmptyFile + { + get { return GetString("Usage_CannotPrecompileEmptyFile"); } + } + + /// + /// Looks up a localized string similar to "Сannot pre-compile a '{0}' resource, because it is empty." + /// + internal static string Usage_CannotPrecompileEmptyResource + { + get { return GetString("Usage_CannotPrecompileEmptyResource"); } + } + /// /// Looks up a localized string similar to "The embedded host object '{0}' has a type `{1}`, which is not supported." /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index 6a0c3d4..d3d176c 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -195,6 +195,15 @@ Сannot execute a '{0}' resource, because it is empty. + + Сannot execute a pre-compiled script, because it was created for another mode with name `{0}`. + + + Сannot pre-compile a '{0}' file, because it is empty. + + + Сannot pre-compile a '{0}' resource, because it is empty. + The embedded host object '{0}' has a type `{1}`, which is not supported. diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index 79c59de..8e316cd 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -195,6 +195,15 @@ Нельзя выполнить ресурс "{0}", потому что он пустой! + + Нельзя выполнить предварительно скомпилированный сценарий, потому что он был создан для другого режима с именем `{0}`! + + + Нельзя произвести предварительную компиляцию файла "{0}", потому что он пустой! + + + Нельзя произвести предварительную компиляцию ресурса "{0}", потому что он пустой! + Встраиваемый объекта хоста "{0}" имеет тип `{1}`, который не поддерживается! diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8e0fc6d..cd3e7ea 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,23 +21,9 @@ ============= RELEASE NOTES ============= - 1. Format of the error messages was unified; - 2. Created a new exception classes: `JsCompilationException`, - `JsEngineException`, `JsFatalException` and `JsUsageException`. These - exceptions are responsible for handling errors, some of which were previously - handled by the `JsRuntimeException` class; - 3. In the `JsException` class was added two new properties: `Category` and - `Description`; - 4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; - 5. In the `JsRuntimeException` class was added three new properties: `Type`, - `DocumentName` and `CallStack`; - 6. `JsScriptInterruptedException` class was renamed to the - `JsInterruptedException` class and now is inherited from the - `JsRuntimeException` class; - 7. `JsEngineLoadException` class now is inherited from the `JsEngineException` - class; - 8. `Format` method of the `JsErrorHelpers` class was renamed to the - `GenerateErrorDetails`. + 1. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and + three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource`; + 2. In JsRT modes added a ability to pre-compile scripts. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs new file mode 100644 index 0000000..fa985a6 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs @@ -0,0 +1,23 @@ +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.Auto +{ + [TestFixture] + public class PrecompilationTests : PrecompilationTestsBase + { + protected override MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = JsEngineMode.Auto, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs new file mode 100644 index 0000000..a61d3fd --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs @@ -0,0 +1,25 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ + [TestFixture] + public class PrecompilationTests : PrecompilationTestsBase + { + protected override MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = JsEngineMode.ChakraActiveScript, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs new file mode 100644 index 0000000..d182fd9 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs @@ -0,0 +1,218 @@ +using System; +using System.Text.RegularExpressions; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ + [TestFixture] + public class PrecompilationTests : PrecompilationTestsBase + { + protected override MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = JsEngineMode.ChakraEdgeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + + #region Error handling + + #region Mapping of errors + + [Test] + public void MappingCompilationErrorDuringPrecompilationOfCodeIsCorrect() + { + // Arrange + const string input = @"function guid() { + function s4() { + return Math.floor((1 + Math.random() * 0x10000) + .toString(16) + .substring(1) + ; + } + + var result = s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + + return result; +}"; + + PrecompiledScript precompiledScript = null; + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + precompiledScript = jsEngine.Precompile(input, "guid.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.Null(precompiledScript); + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Expected ')'", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("guid.js", exception.DocumentName); + Assert.AreEqual(6, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.AreEqual(" ;", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() + { + // Arrange + const string input = @"function getItem(items, itemIndex) { + var item = items[itemIndex]; + + return item; +} + +(function (getItem) { + var items = null, + item = getItem(items, 5) + ; + + return item; +})(getItem);"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + PrecompiledScript precompiledScript = jsEngine.Precompile(input, "getItem.js"); + jsEngine.Execute(precompiledScript); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Unable to get property '5' of undefined or null reference", exception.Description); + Assert.AreEqual("TypeError", exception.Type); + Assert.AreEqual("getItem.js", exception.DocumentName); + Assert.AreEqual(2, exception.LineNumber); + Assert.AreEqual(2, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at getItem (getItem.js:2:2)" + Environment.NewLine + + " at Anonymous function (getItem.js:9:3)" + Environment.NewLine + + " at Global code (getItem.js:7:2)", + exception.CallStack + ); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() + { + // Arrange + const string input = @"function makeId(length) { + var result = '', + possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + charIndex + ; + + for (charIndex = 0; charIndex < length; charIndex++) + result += possible.charAt(Math.floor(Math.random() * possible.length)); + } + + return result; +}"; + string targetOutput = "SyntaxError: 'return' statement outside of function" + Environment.NewLine + + " at makeId.js:11:2 -> return result;" + ; + + PrecompiledScript precompiledScript = null; + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + precompiledScript = jsEngine.Precompile(input, "makeId.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + Assert.Null(precompiledScript); + Assert.NotNull(exception); + Assert.AreEqual(targetOutput, exception.Message); + } + + [Test] + public void GenerationOfRuntimeErrorMessageIsCorrect() + { + // Arrange + const string input = @"function getFullName(firstName, lastName) { + var fullName = firstName + ' ' + middleName + ' ' + lastName; + + return fullName; +} + +(function (getFullName) { + var firstName = 'Vasya', + lastName = 'Pupkin' + ; + + return getFullName(firstName, lastName); +})(getFullName);"; + string targetOutputPattern = @"^ReferenceError: 'middleName' is (un|not )defined" + Environment.NewLine + + @" at getFullName \(getFullName.js:2:2\)" + Environment.NewLine + + @" at Anonymous function \(getFullName.js:12:2\)" + Environment.NewLine + + @" at Global code \(getFullName.js:7:2\)$" + ; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + PrecompiledScript precompiledScript = jsEngine.Precompile(input, "getFullName.js"); + jsEngine.Execute(precompiledScript); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + Assert.NotNull(exception); + Assert.True(Regex.IsMatch(exception.Message, targetOutputPattern)); + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs new file mode 100644 index 0000000..77ccd8d --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs @@ -0,0 +1,217 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ + [TestFixture] + public class PrecompilationTests : PrecompilationTestsBase + { + protected override MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = JsEngineMode.ChakraIeJsRt, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + + #region Error handling + + #region Mapping of errors + + [Test] + public void MappingCompilationErrorDuringPrecompilationOfCodeIsCorrect() + { + // Arrange + const string input = @"function guid() { + function s4() { + return Math.floor((1 + Math.random() * 0x10000) + .toString(16) + .substring(1) + ; + } + + var result = s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + + return result; +}"; + + PrecompiledScript precompiledScript = null; + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + precompiledScript = jsEngine.Precompile(input, "guid.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + // Assert + Assert.Null(precompiledScript); + Assert.NotNull(exception); + Assert.AreEqual("Compilation error", exception.Category); + Assert.AreEqual("Expected ')'", exception.Description); + Assert.AreEqual("SyntaxError", exception.Type); + Assert.AreEqual("guid.js", exception.DocumentName); + Assert.AreEqual(6, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.AreEqual(" ;", exception.SourceFragment); + } + + [Test] + public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() + { + // Arrange + const string input = @"function getItem(items, itemIndex) { + var item = items[itemIndex]; + + return item; +} + +(function (getItem) { + var items = null, + item = getItem(items, 5) + ; + + return item; +})(getItem);"; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + PrecompiledScript precompiledScript = jsEngine.Precompile(input, "getItem.js"); + jsEngine.Execute(precompiledScript); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Unable to get property '5' of undefined or null reference", exception.Description); + Assert.AreEqual("TypeError", exception.Type); + Assert.AreEqual("getItem.js", exception.DocumentName); + Assert.AreEqual(2, exception.LineNumber); + Assert.AreEqual(2, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at getItem (getItem.js:2:2)" + Environment.NewLine + + " at Anonymous function (getItem.js:9:3)" + Environment.NewLine + + " at Global code (getItem.js:7:2)", + exception.CallStack + ); + } + + #endregion + + #region Generation of error messages + + [Test] + public void GenerationOfCompilationErrorMessageIsCorrect() + { + // Arrange + const string input = @"function makeId(length) { + var result = '', + possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', + charIndex + ; + + for (charIndex = 0; charIndex < length; charIndex++) + result += possible.charAt(Math.floor(Math.random() * possible.length)); + } + + return result; +}"; + string targetOutput = "SyntaxError: 'return' statement outside of function" + Environment.NewLine + + " at makeId.js:11:2 -> return result;" + ; + + PrecompiledScript precompiledScript = null; + JsCompilationException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + precompiledScript = jsEngine.Precompile(input, "makeId.js"); + } + catch (JsCompilationException e) + { + exception = e; + } + } + + Assert.Null(precompiledScript); + Assert.NotNull(exception); + Assert.AreEqual(targetOutput, exception.Message); + } + + [Test] + public void GenerationOfRuntimeErrorMessageIsCorrect() + { + // Arrange + const string input = @"function getFullName(firstName, lastName) { + var fullName = firstName + ' ' + middleName + ' ' + lastName; + + return fullName; +} + +(function (getFullName) { + var firstName = 'Vasya', + lastName = 'Pupkin' + ; + + return getFullName(firstName, lastName); +})(getFullName);"; + string targetOutput = "ReferenceError: 'middleName' is undefined" + Environment.NewLine + + " at getFullName (getFullName.js:2:2)" + Environment.NewLine + + " at Anonymous function (getFullName.js:12:2)" + Environment.NewLine + + " at Global code (getFullName.js:7:2)" + ; + + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + try + { + PrecompiledScript precompiledScript = jsEngine.Precompile(input, "getFullName.js"); + jsEngine.Execute(precompiledScript); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + Assert.NotNull(exception); + Assert.AreEqual(targetOutput, exception.Message); + } + + #endregion + + #endregion + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs new file mode 100644 index 0000000..37accee --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs @@ -0,0 +1,25 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.Classic +{ + [TestFixture] + public class PrecompilationTests : PrecompilationTestsBase + { + protected override MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = JsEngineMode.Classic, + UseEcmaScript5Polyfill = false, + UseJson2Library = false + }); + + return jsEngine; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index f3d32c1..2b8f920 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -17,7 +17,7 @@ protected virtual MsieJsEngine CreateJsEngine() protected abstract MsieJsEngine CreateJsEngine(bool enableDebugging); - #region Evaluation of code + #region Evaluation of scripts [Test] public virtual void EvaluationOfExpressionWithUndefinedResultIsCorrect() @@ -160,7 +160,7 @@ public virtual void EvaluationOfExpressionWithUnicodeStringResultIsCorrect() #endregion - #region Execution of code + #region Execution of scripts [Test] public virtual void ExecutionOfCodeIsCorrect() diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 10bc1d1..0685075 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -37,7 +37,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs new file mode 100644 index 0000000..c8cab6a --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -0,0 +1,333 @@ +using System.IO; +using System.Reflection; + +using NUnit.Framework; + +namespace MsieJavaScriptEngine.Test.Common +{ + [TestFixture] + public abstract class PrecompilationTestsBase : FileSystemTestsBase + { + protected virtual MsieJsEngine CreateJsEngine() + { + return CreateJsEngine(false); + } + + protected abstract MsieJsEngine CreateJsEngine(bool enableDebugging); + + #region Execution of precompiled scripts + + [Test] + public virtual void ExecutionOfPrecompiledCodeIsCorrect() + { + // Arrange + const string libraryCode = @"function declensionOfNumerals(number, titles) { + var result, + titleIndex, + cases = [2, 0, 1, 1, 1, 2], + caseIndex + ; + + if (number % 100 > 4 && number % 100 < 20) { + titleIndex = 2; + } + else { + caseIndex = number % 10 < 5 ? number % 10 : 5; + titleIndex = cases[caseIndex]; + } + + result = titles[titleIndex]; + + return result; +} + +function declinationOfSeconds(number) { + return declensionOfNumerals(number, ['секунда', 'секунды', 'секунд']); +}"; + const string functionName = "declinationOfSeconds"; + + const int input0 = 0; + const string targetOutput0 = "секунд"; + + const int input1 = 1; + const string targetOutput1 = "секунда"; + + const int input2 = 42; + const string targetOutput2 = "секунды"; + + const int input3 = 600; + const string targetOutput3 = "секунд"; + + // Act + bool supportsScriptPrecompilation = false; + PrecompiledScript precompiledCode = null; + + string output0 = string.Empty; + string output1 = string.Empty; + string output2 = string.Empty; + string output3 = string.Empty; + + using (var jsEngine = CreateJsEngine()) + { + supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; + if (supportsScriptPrecompilation) + { + precompiledCode = jsEngine.Precompile(libraryCode, "declinationOfSeconds.js"); + + jsEngine.Execute(precompiledCode); + output0 = jsEngine.CallFunction(functionName, input0); + } + } + + if (supportsScriptPrecompilation) + { + using (var firstJsEngine = CreateJsEngine()) + { + firstJsEngine.Execute(precompiledCode); + output1 = firstJsEngine.CallFunction(functionName, input1); + } + + using (var secondJsEngine = CreateJsEngine()) + { + secondJsEngine.Execute(precompiledCode); + output2 = secondJsEngine.CallFunction(functionName, input2); + } + + using (var thirdJsEngine = CreateJsEngine()) + { + thirdJsEngine.Execute(precompiledCode); + output3 = thirdJsEngine.CallFunction(functionName, input3); + } + } + + // Assert + if (supportsScriptPrecompilation) + { + Assert.AreEqual(targetOutput0, output0); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + } + + [Test] + public virtual void ExecutionOfPrecompiledFileIsCorrect() + { + // Arrange + string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/declinationOfMinutes.js")); + const string functionName = "declinationOfMinutes"; + + const int input0 = 0; + const string targetOutput0 = "минут"; + + const int input1 = 1; + const string targetOutput1 = "минута"; + + const int input2 = 22; + const string targetOutput2 = "минуты"; + + const int input3 = 88; + const string targetOutput3 = "минут"; + + // Act + bool supportsScriptPrecompilation = false; + PrecompiledScript precompiledFile = null; + + string output0 = string.Empty; + string output1 = string.Empty; + string output2 = string.Empty; + string output3 = string.Empty; + + using (var jsEngine = CreateJsEngine()) + { + supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; + if (supportsScriptPrecompilation) + { + precompiledFile = jsEngine.PrecompileFile(filePath); + + jsEngine.Execute(precompiledFile); + output0 = jsEngine.CallFunction(functionName, input0); + } + } + + if (supportsScriptPrecompilation) + { + using (var firstJsEngine = CreateJsEngine()) + { + firstJsEngine.Execute(precompiledFile); + output1 = firstJsEngine.CallFunction(functionName, input1); + } + + using (var secondJsEngine = CreateJsEngine()) + { + secondJsEngine.Execute(precompiledFile); + output2 = secondJsEngine.CallFunction(functionName, input2); + } + + using (var thirdJsEngine = CreateJsEngine()) + { + thirdJsEngine.Execute(precompiledFile); + output3 = thirdJsEngine.CallFunction(functionName, input3); + } + } + + // Assert + if (supportsScriptPrecompilation) + { + Assert.AreEqual(targetOutput0, output0); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + } + + [Test] + public virtual void ExecutionOfPrecompiledResourceByNameAndTypeIsCorrect() + { + // Arrange + const string resourceName = "Resources.declinationOfHours.js"; + const string functionName = "declinationOfHours"; + + const int input0 = 0; + const string targetOutput0 = "часов"; + + const int input1 = 1; + const string targetOutput1 = "час"; + + const int input2 = 24; + const string targetOutput2 = "часа"; + + const int input3 = 48; + const string targetOutput3 = "часов"; + + // Act + bool supportsScriptPrecompilation = false; + PrecompiledScript precompiledResource = null; + + string output0 = string.Empty; + string output1 = string.Empty; + string output2 = string.Empty; + string output3 = string.Empty; + + using (var jsEngine = CreateJsEngine()) + { + supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; + if (supportsScriptPrecompilation) + { + precompiledResource = jsEngine.PrecompileResource(resourceName, typeof(PrecompilationTestsBase)); + + jsEngine.Execute(precompiledResource); + output0 = jsEngine.CallFunction(functionName, input0); + } + } + + if (supportsScriptPrecompilation) + { + using (var firstJsEngine = CreateJsEngine()) + { + firstJsEngine.Execute(precompiledResource); + output1 = firstJsEngine.CallFunction(functionName, input1); + } + + using (var secondJsEngine = CreateJsEngine()) + { + secondJsEngine.Execute(precompiledResource); + output2 = secondJsEngine.CallFunction(functionName, input2); + } + + using (var thirdJsEngine = CreateJsEngine()) + { + thirdJsEngine.Execute(precompiledResource); + output3 = thirdJsEngine.CallFunction(functionName, input3); + } + } + + // Assert + if (supportsScriptPrecompilation) + { + Assert.AreEqual(targetOutput0, output0); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + } + + [Test] + public virtual void ExecutionOfPrecompiledResourceByNameAndAssemblyIsCorrect() + { + // Arrange + const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.declinationOfDays.js"; + const string functionName = "declinationOfDays"; + + const int input0 = 0; + const string targetOutput0 = "дней"; + + const int input1 = 1; + const string targetOutput1 = "день"; + + const int input2 = 3; + const string targetOutput2 = "дня"; + + const int input3 = 80; + const string targetOutput3 = "дней"; + + // Act + bool supportsScriptPrecompilation = false; + PrecompiledScript precompiledResource = null; + + string output0 = string.Empty; + string output1 = string.Empty; + string output2 = string.Empty; + string output3 = string.Empty; + + using (var jsEngine = CreateJsEngine()) + { + supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; + if (supportsScriptPrecompilation) + { + precompiledResource = jsEngine.PrecompileResource(resourceName, typeof(PrecompilationTestsBase) +#if !NET40 + .GetTypeInfo() +#endif + .Assembly + ); + + jsEngine.Execute(precompiledResource); + output0 = jsEngine.CallFunction(functionName, input0); + } + } + + if (supportsScriptPrecompilation) + { + using (var firstJsEngine = CreateJsEngine()) + { + firstJsEngine.Execute(precompiledResource); + output1 = firstJsEngine.CallFunction(functionName, input1); + } + + using (var secondJsEngine = CreateJsEngine()) + { + secondJsEngine.Execute(precompiledResource); + output2 = secondJsEngine.CallFunction(functionName, input2); + } + + using (var thirdJsEngine = CreateJsEngine()) + { + thirdJsEngine.Execute(precompiledResource); + output3 = thirdJsEngine.CallFunction(functionName, input3); + } + } + + // Assert + if (supportsScriptPrecompilation) + { + Assert.AreEqual(targetOutput0, output0); + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfDays.js b/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfDays.js new file mode 100644 index 0000000..812f2cb --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfDays.js @@ -0,0 +1,23 @@ +function declensionOfNumerals(number, titles) { + var result, + titleIndex, + cases = [2, 0, 1, 1, 1, 2], + caseIndex + ; + + if (number % 100 > 4 && number % 100 < 20) { + titleIndex = 2; + } + else { + caseIndex = number % 10 < 5 ? number % 10 : 5; + titleIndex = cases[caseIndex]; + } + + result = titles[titleIndex]; + + return result; +} + +function declinationOfDays(number) { + return declensionOfNumerals(number, ['день', 'дня', 'дней']); +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfHours.js b/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfHours.js new file mode 100644 index 0000000..6660462 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Resources/declinationOfHours.js @@ -0,0 +1,23 @@ +function declensionOfNumerals(number, titles) { + var result, + titleIndex, + cases = [2, 0, 1, 1, 1, 2], + caseIndex + ; + + if (number % 100 > 4 && number % 100 < 20) { + titleIndex = 2; + } + else { + caseIndex = number % 10 < 5 ? number % 10 : 5; + titleIndex = cases[caseIndex]; + } + + result = titles[titleIndex]; + + return result; +} + +function declinationOfHours(number) { + return declensionOfNumerals(number, ['час', 'часа', 'часов']); +} \ No newline at end of file diff --git a/test/SharedFiles/declinationOfMinutes.js b/test/SharedFiles/declinationOfMinutes.js new file mode 100644 index 0000000..41a3e4d --- /dev/null +++ b/test/SharedFiles/declinationOfMinutes.js @@ -0,0 +1,23 @@ +function declensionOfNumerals(number, titles) { + var result, + titleIndex, + cases = [2, 0, 1, 1, 1, 2], + caseIndex + ; + + if (number % 100 > 4 && number % 100 < 20) { + titleIndex = 2; + } + else { + caseIndex = number % 10 < 5 ? number % 10 : 5; + titleIndex = cases[caseIndex]; + } + + result = titles[titleIndex]; + + return result; +} + +function declinationOfMinutes(number) { + return declensionOfNumerals(number, ['минута', 'минуты', 'минут']); +} \ No newline at end of file From afdb6419aad3788203f49cf9b67f0f2a4b72d5ec Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 21 May 2018 20:52:18 +0300 Subject: [PATCH 124/238] Fixed a minor errors --- src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index 6c95c14..503776e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -304,7 +304,7 @@ public static EdgeJsValue RunSerializedScript(string script, byte[] buffer, JsSo public static byte[] SerializeScript(string script) { byte[] buffer = null; - ulong bufferSize = 0; + uint bufferSize = 0; JsErrorCode errorCode = EdgeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); EdgeJsErrorHelpers.ThrowIfError(errorCode); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 275909e..b7f037b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -21,7 +21,7 @@ internal static extern JsErrorCode JsRunScript(string script, JsSourceContext so string sourceUrl, out EdgeJsValue result); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 0094d33..dccc28e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -307,7 +307,7 @@ public static IeJsValue RunSerializedScript(string script, byte[] buffer, JsSour public static byte[] SerializeScript(string script) { byte[] buffer = null; - ulong bufferSize = 0; + uint bufferSize = 0; JsErrorCode errorCode = IeNativeMethods.JsSerializeScript(script, buffer, ref bufferSize); IeJsErrorHelpers.ThrowIfError(errorCode); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index a21cf0d..089c1a4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -22,7 +22,7 @@ internal static extern JsErrorCode JsRunScript(string script, JsSourceContext so string sourceUrl, out IeJsValue result); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] - internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref ulong bufferSize); + internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, From f3ee70899d402c383adbda20cc0febb1d9a40d4d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 21 May 2018 21:37:59 +0300 Subject: [PATCH 125/238] Was made refactoring --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 45 +++++++++++ .../ClassicActiveScriptJsEngine.cs | 76 +------------------ 2 files changed, 46 insertions(+), 75 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 56f1f64..3d14397 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -19,6 +19,16 @@ namespace MsieJavaScriptEngine.ActiveScript /// internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase { + /// + /// Name of resource, which contains a ECMAScript 5 Polyfill + /// + private const string ES5_POLYFILL_RESOURCE_NAME = "MsieJavaScriptEngine.Resources.ES5.min.js"; + + /// + /// Name of resource, which contains a JSON2 library + /// + private const string JSON2_LIBRARY_RESOURCE_NAME = "MsieJavaScriptEngine.Resources.json2.min.js"; + /// /// Instance of Active Script wrapper /// @@ -126,6 +136,7 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, _activeScriptWrapper.SetScriptSite(CreateScriptSite()); _activeScriptWrapper.InitNew(); _activeScriptWrapper.SetScriptState(ScriptState.Started); + LoadPolyfills(); _dispatch = WrapScriptDispatch(_activeScriptWrapper.GetScriptDispatch()); }); @@ -310,6 +321,29 @@ private void ThrowError() /// Error type protected abstract string GetErrorTypeByNumber(int errorNumber); + /// + /// Loads a JS polyfills + /// + private void LoadPolyfills() + { + Assembly assembly = GetType() +#if !NET40 + .GetTypeInfo() +#endif + .Assembly + ; + + if (_settings.UseEcmaScript5Polyfill) + { + InnerExecuteResource(ES5_POLYFILL_RESOURCE_NAME, assembly); + } + + if (_settings.UseJson2Library) + { + InnerExecuteResource(JSON2_LIBRARY_RESOURCE_NAME, assembly); + } + } + /// /// Executes a script text /// @@ -345,6 +379,17 @@ private object InnerExecute(string code, string documentName, bool isExpression) return result; } + /// + /// Executes a code from embedded JS resource + /// + /// The case-sensitive resource name + /// The assembly, which contains the embedded resource + private void InnerExecuteResource(string resourceName, Assembly assembly) + { + string code = Utils.GetResourceAsString(resourceName, assembly); + InnerExecute(code, resourceName, false); + } + /// /// Try create a debug document /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index 97a823d..b268bbb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,14 +1,7 @@ #if !NETSTANDARD -using System; using System.Collections.Generic; -using System.Reflection; using MsieJavaScriptEngine.Constants; -#if NET40 -using MsieJavaScriptEngine.Polyfills.System; -#endif -using MsieJavaScriptEngine.Resources; -using MsieJavaScriptEngine.Utilities; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; @@ -19,16 +12,6 @@ namespace MsieJavaScriptEngine.ActiveScript /// internal sealed partial class ClassicActiveScriptJsEngine : ActiveScriptJsEngineBase { - /// - /// Name of resource, which contains a ECMAScript 5 Polyfill - /// - private const string ES5_POLYFILL_RESOURCE_NAME = "MsieJavaScriptEngine.Resources.ES5.min.js"; - - /// - /// Name of resource, which contains a JSON2 library - /// - private const string JSON2_LIBRARY_RESOURCE_NAME = "MsieJavaScriptEngine.Resources.json2.min.js"; - /// /// Flag indicating whether this JS engine is supported /// @@ -85,9 +68,7 @@ internal sealed partial class ClassicActiveScriptJsEngine : ActiveScriptJsEngine /// JS engine settings public ClassicActiveScriptJsEngine(JsEngineSettings settings) : base(settings, ClassId.Classic, ScriptLanguageVersion.None, "6", "Microsoft JScript ") - { - LoadResources(_settings.UseEcmaScript5Polyfill, _settings.UseJson2Library); - } + { } /// @@ -111,61 +92,6 @@ protected override string GetErrorTypeByNumber(int errorNumber) return ActiveScriptJsErrorHelpers.GetErrorTypeByNumber(errorNumber, _runtimeErrorTypeMap); } - /// - /// Loads a resources - /// - /// Flag for whether to use the ECMAScript 5 Polyfill - /// Flag for whether to use the JSON2 library - private void LoadResources(bool useEcmaScript5Polyfill, bool useJson2Library) - { - Assembly assembly = GetType().GetTypeInfo().Assembly; - - if (useEcmaScript5Polyfill) - { - ExecuteResource(ES5_POLYFILL_RESOURCE_NAME, assembly); - } - - if (useJson2Library) - { - ExecuteResource(JSON2_LIBRARY_RESOURCE_NAME, assembly); - } - } - - /// - /// Executes a code from embedded JS-resource - /// - /// The case-sensitive resource name - /// The assembly, which contains the embedded resource - private void ExecuteResource(string resourceName, Assembly assembly) - { - if (resourceName == null) - { - throw new ArgumentNullException( - nameof(resourceName), - string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) - ); - } - - if (assembly == null) - { - throw new ArgumentNullException( - nameof(assembly), - string.Format(CommonStrings.Common_ArgumentIsNull, nameof(assembly)) - ); - } - - if (string.IsNullOrWhiteSpace(resourceName)) - { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), - nameof(resourceName) - ); - } - - string code = Utils.GetResourceAsString(resourceName, assembly); - Execute(code, resourceName); - } - #region ActiveScriptJsEngineBase overrides /// From 6b98869151fdf4aee2bb02f63ea0cc9f3b88c397 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 22 May 2018 12:16:48 +0300 Subject: [PATCH 126/238] Updated a dependencies of unit tests --- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 504f932..e56e0e0 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index b2c32f6..0ff902d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index ff4c977..e0069b9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index a7ec624..95ba6e1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 9ac6610..f309669 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 0685075..f13d9f1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -14,7 +14,7 @@ - + @@ -24,7 +24,7 @@ - + From f0db86d735ff73d57483304f0c089c8be728bb52 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 22 May 2018 19:18:34 +0300 Subject: [PATCH 127/238] Version 3.0.0 Beta 2 --- CHANGELOG.md | 4 ++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65d4aec..59ce214 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## v3.0.0 Beta 2 - May 22, 2018 + * In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource` + * In JsRT modes added a ability to pre-compile scripts + ## v3.0.0 Beta 1 - April 8, 2018 * Format of the error messages was unified * Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class. diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index cb39b90..3797c68 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - beta1 + beta2 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index cd3e7ea..7bdcfa0 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 1 + README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 2 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index e56e0e0..28d37e8 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - beta1 + beta2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 0ff902d..2d99316 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - beta1 + beta2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index e0069b9..4fb0048 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - beta1 + beta2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 95ba6e1..0aa10aa 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - beta1 + beta2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index f309669..d951831 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - beta1 + beta2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f13d9f1..f22fe1e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - beta1 + beta2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library From 257d9856293cc08814e3990f193d7b34500d6d91 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 29 May 2018 19:26:28 +0300 Subject: [PATCH 128/238] =?UTF-8?q?Fixed=20a=20error=20#18=20=E2=80=9CBloc?= =?UTF-8?q?k=20finalizer=20solved=3F=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JsRt/ChakraJsRtJsEngineBase.cs | 2 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 15 +++++++-------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 15 +++++++-------- .../MsieJavaScriptEngine.csproj | 3 +-- src/MsieJavaScriptEngine/readme.txt | 4 +--- 5 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index b0b44c0..811b362 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -38,7 +38,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// /// Script dispatcher /// - protected readonly ScriptDispatcher _dispatcher = new ScriptDispatcher(); + protected ScriptDispatcher _dispatcher = new ScriptDispatcher(); /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index c583039..9bb27cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1390,16 +1390,15 @@ protected override void Dispose(bool disposing) { if (_dispatcher != null) { - _dispatcher.Invoke(() => - { - if (_jsContext.IsValid) - { - _jsContext.Release(); - } - _jsRuntime.Dispose(); - }); _dispatcher.Dispose(); + _dispatcher = null; + } + + if (_jsContext.IsValid) + { + _jsContext.Release(); } + _jsRuntime.Dispose(); base.Dispose(disposing); #if NETSTANDARD diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 84dc0cd..189cb9b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1455,16 +1455,15 @@ protected override void Dispose(bool disposing) { if (_dispatcher != null) { - _dispatcher.Invoke(() => - { - if (_jsContext.IsValid) - { - _jsContext.Release(); - } - _jsRuntime.Dispose(); - }); _dispatcher.Dispose(); + _dispatcher = null; + } + + if (_jsContext.IsValid) + { + _jsContext.Release(); } + _jsRuntime.Dispose(); base.Dispose(disposing); #if NETSTANDARD diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 3797c68..0c78a26 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,8 +24,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource`; -2. In JsRT modes added a ability to pre-compile scripts. + Fixed a error #18 “Block finalizer solved?”. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 7bdcfa0..698f07f 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,9 +21,7 @@ ============= RELEASE NOTES ============= - 1. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and - three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource`; - 2. In JsRT modes added a ability to pre-compile scripts. + Fixed a error #18 “Block finalizer solved?”. ============ PROJECT SITE From e05719e7b261c8d915a4751b0f240ecb49a77464 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 29 May 2018 19:59:49 +0300 Subject: [PATCH 129/238] Version 3.0.0 Beta 3 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 9 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 59ce214..b534d57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.0 Beta 3 - May 29, 2018 + * Fixed a [error #18](https://github.com/Taritsyn/MsieJavaScriptEngine/issues/18) “Block finalizer solved?” + ## v3.0.0 Beta 2 - May 22, 2018 * In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource` * In JsRT modes added a ability to pre-compile scripts diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 0c78a26..44fecc5 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - beta2 + beta3 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 698f07f..832ea09 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 2 + README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 3 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 28d37e8..a0d33d3 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - beta2 + beta3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 2d99316..8e947fc 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - beta2 + beta3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 4fb0048..1418d0e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - beta2 + beta3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 0aa10aa..a3ce488 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - beta2 + beta3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d951831..97ea53d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - beta2 + beta3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f22fe1e..5bf2f27 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - beta2 + beta3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library From 4119ea6c2d4c510445f7954d73d40ba55790c27c Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 6 Jun 2018 20:18:20 +0300 Subject: [PATCH 130/238] Changed a implementation of the `Dispose` method. --- global.json | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 87 +++++++++---------- .../ActiveScript/ActiveScriptWrapper32.cs | 61 +++++++++++-- .../ActiveScript/ActiveScriptWrapper64.cs | 61 +++++++++++-- .../ActiveScript/ActiveScriptWrapperBase.cs | 39 ++++++--- .../Helpers/ComHelpers.cs | 17 ---- .../JsRt/ChakraJsRtJsEngineBase.cs | 20 +++-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 41 ++++++--- .../JsRt/Edge/EdgeJsContext.cs | 58 ------------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 41 ++++++--- .../JsRt/Ie/IeJsContext.cs | 58 ------------- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- 13 files changed, 249 insertions(+), 240 deletions(-) diff --git a/global.json b/global.json index 1fb2843..bebfefe 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.200" + "version": "2.1.300" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 3d14397..4ee9918 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -42,7 +42,7 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// /// List of host items /// - protected readonly Dictionary _hostItems = new Dictionary(); + protected Dictionary _hostItems = new Dictionary(); /// /// Last Active Script exception @@ -77,14 +77,12 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// /// List of document names /// - private readonly Dictionary _documentNames = - new Dictionary(); + private Dictionary _documentNames = new Dictionary(); /// /// List of debug documents /// - private readonly Dictionary _debugDocuments = - new Dictionary(); + private Dictionary _debugDocuments = new Dictionary(); /// /// Next source context @@ -174,14 +172,6 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, } } - /// - /// Destructs an instance of the Active Script engine - /// - ~ActiveScriptJsEngineBase() - { - Dispose(false); - } - /// /// Checks a support of the JS engine on the machine @@ -910,25 +900,45 @@ public override void CollectGarbage() /// Destroys object /// public override void Dispose() - { - Dispose(true /* disposing */); - GC.SuppressFinalize(this); - } - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - private void Dispose(bool disposing) { if (_disposedFlag.Set()) { + if (_debuggingStarted && _debugDocuments != null) + { + foreach (UIntPtr debugDocumentKey in _debugDocuments.Keys) + { + var debugDocumentValue = _debugDocuments[debugDocumentKey]; + debugDocumentValue.Close(); + } + + _debugDocuments.Clear(); + _debugDocuments = null; + } + + if (_processDebugManagerWrapper != null) + { + _processDebugManagerWrapper.RemoveApplication(_debugApplicationCookie); + + if (_debugApplicationWrapper != null) + { + _debugApplicationWrapper.Close(); + _debugApplicationWrapper = null; + } + + _processDebugManagerWrapper = null; + } + + if (_documentNames != null) + { + _documentNames.Clear(); + _documentNames = null; + } + _dispatcher.Invoke(() => { if (_dispatch != null) { - ComHelpers.ReleaseComObject(ref _dispatch, !disposing); + Marshal.ReleaseComObject(_dispatch); _dispatch = null; } @@ -939,30 +949,13 @@ private void Dispose(bool disposing) } }); - if (disposing) + if (_hostItems != null) { - if (_debuggingStarted && _debugDocuments != null) - { - foreach (UIntPtr debugDocumentKey in _debugDocuments.Keys) - { - var debugDocumentValue = _debugDocuments[debugDocumentKey]; - debugDocumentValue.Close(); - } - - _debugDocuments.Clear(); - } - - if (_processDebugManagerWrapper != null) - { - _processDebugManagerWrapper.RemoveApplication(_debugApplicationCookie); - _debugApplicationWrapper.Close(); - } - - _documentNames?.Clear(); - _hostItems?.Clear(); - - _lastException = null; + _hostItems.Clear(); + _hostItems = null; } + + _lastException = null; } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 99468fc..099be6c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -4,6 +4,7 @@ using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; using MsieJavaScriptEngine.ActiveScript.Debugging; +using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.ActiveScript { @@ -12,6 +13,21 @@ namespace MsieJavaScriptEngine.ActiveScript /// internal sealed class ActiveScriptWrapper32 : ActiveScriptWrapperBase { + /// + /// Pointer to an instance of 32-bit Active Script parser + /// + private IntPtr _pActiveScriptParse32; + + /// + /// Pointer to an instance of 32-bit Active Script debugger + /// + private IntPtr _pActiveScriptDebug32; + + /// + /// Pointer to an instance of 32-bit debug stack frame sniffer + /// + private IntPtr _pDebugStackFrameSniffer32; + /// /// Instance of 32-bit Active Script parser /// @@ -37,14 +53,28 @@ internal sealed class ActiveScriptWrapper32 : ActiveScriptWrapperBase public ActiveScriptWrapper32(string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) : base(clsid, languageVersion, enableDebugging) { + _pActiveScriptParse32 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptParse32 = (IActiveScriptParse32)_activeScript; + if (_enableDebugging) { + _pActiveScriptDebug32 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptDebug32 = (IActiveScriptDebug32)_activeScript; + + _pDebugStackFrameSniffer32 = ComHelpers.QueryInterfaceNoThrow( + _pActiveScript); _debugStackFrameSniffer32 = _activeScript as IDebugStackFrameSnifferEx32; } } + /// + /// Destructs an instance of the 32-bit Active Script wrapper + /// + ~ActiveScriptWrapper32() + { + Dispose(false); + } + #region ActiveScriptWrapperBase overrides @@ -100,15 +130,36 @@ public override void EnumStackFrames(out IEnumDebugStackFrames enumFrames) #region IDisposable implementation + /// + /// Destroys object + /// public override void Dispose() + { + Dispose(true /* disposing */); + GC.SuppressFinalize(this); + } + + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - _debugStackFrameSniffer32 = null; - _activeScriptDebug32 = null; - _activeScriptParse32 = null; - - base.Dispose(); + if (disposing) + { + _debugStackFrameSniffer32 = null; + _activeScriptDebug32 = null; + _activeScriptParse32 = null; + } + + ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer32); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug32); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse32); + + base.Dispose(disposing); } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index 35e6eca..d1ac8f2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -4,6 +4,7 @@ using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; using MsieJavaScriptEngine.ActiveScript.Debugging; +using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.ActiveScript { @@ -12,6 +13,21 @@ namespace MsieJavaScriptEngine.ActiveScript /// internal sealed class ActiveScriptWrapper64 : ActiveScriptWrapperBase { + /// + /// Pointer to an instance of 64-bit Active Script parser + /// + private IntPtr _pActiveScriptParse64; + + /// + /// Pointer to an instance of 64-bit Active Script debugger + /// + private IntPtr _pActiveScriptDebug64; + + /// + /// Pointer to an instance of 64-bit debug stack frame sniffer + /// + private IntPtr _pDebugStackFrameSniffer64; + /// /// Instance of 64-bit Active Script parser /// @@ -37,14 +53,28 @@ internal sealed class ActiveScriptWrapper64 : ActiveScriptWrapperBase public ActiveScriptWrapper64(string clsid, ScriptLanguageVersion languageVersion, bool enableDebugging) : base(clsid, languageVersion, enableDebugging) { + _pActiveScriptParse64 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptParse64 = (IActiveScriptParse64)_activeScript; + if (_enableDebugging) { + _pActiveScriptDebug64 = ComHelpers.QueryInterface(_pActiveScript); _activeScriptDebug64 = (IActiveScriptDebug64)_activeScript; + + _pDebugStackFrameSniffer64 = ComHelpers.QueryInterfaceNoThrow( + _pActiveScript); _debugStackFrameSniffer64 = _activeScript as IDebugStackFrameSnifferEx64; } } + /// + /// Destructs an instance of the 64-bit Active Script wrapper + /// + ~ActiveScriptWrapper64() + { + Dispose(false); + } + #region ActiveScriptWrapperBase overrides @@ -100,15 +130,36 @@ public override void EnumStackFrames(out IEnumDebugStackFrames enumFrames) #region IDisposable implementation + /// + /// Destroys object + /// public override void Dispose() + { + Dispose(true /* disposing */); + GC.SuppressFinalize(this); + } + + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - _debugStackFrameSniffer64 = null; - _activeScriptDebug64 = null; - _activeScriptParse64 = null; - - base.Dispose(); + if (disposing) + { + _debugStackFrameSniffer64 = null; + _activeScriptDebug64 = null; + _activeScriptParse64 = null; + } + + ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer64); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug64); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse64); + + base.Dispose(disposing); } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 7656015..05d9c24 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -25,7 +25,12 @@ internal abstract class ActiveScriptWrapperBase : IActiveScriptWrapper /// /// Pointer to an instance of Active Script engine /// - private IntPtr _pActiveScript; + protected IntPtr _pActiveScript; + + /// + /// Pointer to an instance of Active Script garbage collector + /// + private IntPtr _pActiveScriptGarbageCollector; /// /// Instance of Active Script engine @@ -56,6 +61,9 @@ protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVe _pActiveScript = ComHelpers.CreateInstanceByClsid(clsid); _activeScript = (IActiveScript)Marshal.GetObjectForIUnknown(_pActiveScript); + + _pActiveScriptGarbageCollector = ComHelpers.QueryInterfaceNoThrow( + _pActiveScript); _activeScriptGarbageCollector = _activeScript as IActiveScriptGarbageCollector; if (languageVersion != ScriptLanguageVersion.None) @@ -227,18 +235,29 @@ public void CollectGarbage(ScriptGCType type) /// /// Destroys object /// - public virtual void Dispose() - { - _activeScriptGarbageCollector = null; - - ComHelpers.ReleaseAndEmpty(ref _pActiveScript); + public abstract void Dispose(); - if (_activeScript != null) + /// + /// Destroys object + /// + /// Flag, allowing destruction of + /// managed objects contained in fields of class + protected virtual void Dispose(bool disposing) + { + if (disposing) { - _activeScript.Close(); - Marshal.FinalReleaseComObject(_activeScript); - _activeScript = null; + _activeScriptGarbageCollector = null; + + if (_activeScript != null) + { + _activeScript.Close(); + Marshal.FinalReleaseComObject(_activeScript); + _activeScript = null; + } } + + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptGarbageCollector); + ComHelpers.ReleaseAndEmpty(ref _pActiveScript); } #endregion diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index d999303..1f53554 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -115,23 +115,6 @@ public static void ReleaseAndEmpty(ref IntPtr pUnk) } } - public static void ReleaseComObject(ref T obj, bool final = false) where T : class - { - if (obj != null && Marshal.IsComObject(obj)) - { - if (final) - { - Marshal.FinalReleaseComObject(obj); - } - else - { - Marshal.ReleaseComObject(obj); - } - } - - obj = null; - } - #region Nested type: NativeMethods private static class NativeMethods diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 811b362..35717fb 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -27,7 +27,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// /// Set of external objects /// - protected readonly HashSet _externalObjects = new HashSet(); + protected HashSet _externalObjects = new HashSet(); /// /// Callback for finalization of external object @@ -38,7 +38,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// /// Script dispatcher /// - protected ScriptDispatcher _dispatcher = new ScriptDispatcher(); + protected ScriptDispatcher _dispatcher; /// @@ -48,6 +48,7 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase protected ChakraJsRtJsEngineBase(JsEngineSettings settings) : base(settings) { + _dispatcher = new ScriptDispatcher(); #if NETSTANDARD _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback; #endif @@ -78,15 +79,12 @@ private void ExternalObjectFinalizeCallback(IntPtr data) GCHandle handle = GCHandle.FromIntPtr(data); object obj = handle.Target; - if (obj == null) - { - return; - } - - if (_externalObjects != null) + if (obj != null && _externalObjects != null) { _externalObjects.Remove(obj); } + + handle.Free(); } #endif @@ -102,7 +100,11 @@ protected virtual void Dispose(bool disposing) #if NETSTANDARD if (disposing) { - _externalObjects?.Clear(); + if (_externalObjects != null) + { + _externalObjects.Clear(); + _externalObjects = null; + } _externalObjectFinalizeCallback = null; } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 9bb27cd..ef11f88 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -61,7 +61,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// List of native function callbacks /// - private readonly HashSet _nativeFunctions = new HashSet(); + private HashSet _nativeFunctions = new HashSet(); #endif @@ -1388,27 +1388,40 @@ protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - if (_dispatcher != null) + if (disposing) { - _dispatcher.Dispose(); - _dispatcher = null; - } + if (_dispatcher != null) + { + _dispatcher.Invoke(DisposeUnmanagedResources); + + _dispatcher.Dispose(); + _dispatcher = null; + } +#if NETSTANDARD - if (_jsContext.IsValid) + if (_nativeFunctions != null) + { + _nativeFunctions.Clear(); + _nativeFunctions = null; + } +#endif + } + else { - _jsContext.Release(); + DisposeUnmanagedResources(); } - _jsRuntime.Dispose(); base.Dispose(disposing); -#if NETSTANDARD + } + } - if (disposing) - { - _nativeFunctions?.Clear(); - } -#endif + private void DisposeUnmanagedResources() + { + if (_jsContext.IsValid) + { + _jsContext.Release(); } + _jsRuntime.Dispose(); } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index 503776e..fc91404 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -140,19 +140,6 @@ public static uint Idle() return ticks; } - /// - /// Parses a script and returns a function representing the script - /// - /// - /// Requires an active script context. - /// - /// The script to parse - /// A function representing the script code - public static EdgeJsValue ParseScript(string script) - { - return ParseScript(script, JsSourceContext.None, string.Empty); - } - /// /// Parses a script and returns a function representing the script /// @@ -173,22 +160,6 @@ public static EdgeJsValue ParseScript(string script, JsSourceContext sourceConte return result; } - /// - /// Parses a serialized script and returns a function representing the script - /// - /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. - /// - /// The script to parse - /// The serialized script - /// A function representing the script code - public static EdgeJsValue ParseSerializedScript(string script, byte[] buffer) - { - return ParseSerializedScript(script, buffer, JsSourceContext.None, string.Empty); - } - /// /// Parses a serialized script and returns a function representing the script /// @@ -213,19 +184,6 @@ public static EdgeJsValue ParseSerializedScript(string script, byte[] buffer, Js return result; } - /// - /// Executes a script - /// - /// - /// Requires an active script context. - /// - /// The script to run - /// The result of the script, if any - public static EdgeJsValue RunScript(string script) - { - return RunScript(script, JsSourceContext.None, string.Empty); - } - /// /// Executes a script /// @@ -246,22 +204,6 @@ public static EdgeJsValue RunScript(string script, JsSourceContext sourceContext return result; } - /// - /// Runs a serialized script - /// - /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. - /// - /// The source code of the serialized script - /// The serialized script - /// The result of the script, if any - public static EdgeJsValue RunSerializedScript(string script, byte[] buffer) - { - return RunSerializedScript(script, buffer, JsSourceContext.None, string.Empty); - } - /// /// Runs a serialized script /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 189cb9b..d998851 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -68,7 +68,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// List of native function callbacks /// - private readonly HashSet _nativeFunctions = new HashSet(); + private HashSet _nativeFunctions = new HashSet(); #endif @@ -1453,27 +1453,40 @@ protected override void Dispose(bool disposing) { if (_disposedFlag.Set()) { - if (_dispatcher != null) + if (disposing) { - _dispatcher.Dispose(); - _dispatcher = null; - } + if (_dispatcher != null) + { + _dispatcher.Invoke(DisposeUnmanagedResources); + + _dispatcher.Dispose(); + _dispatcher = null; + } +#if NETSTANDARD - if (_jsContext.IsValid) + if (_nativeFunctions != null) + { + _nativeFunctions.Clear(); + _nativeFunctions = null; + } +#endif + } + else { - _jsContext.Release(); + DisposeUnmanagedResources(); } - _jsRuntime.Dispose(); base.Dispose(disposing); -#if NETSTANDARD + } + } - if (disposing) - { - _nativeFunctions?.Clear(); - } -#endif + private void DisposeUnmanagedResources() + { + if (_jsContext.IsValid) + { + _jsContext.Release(); } + _jsRuntime.Dispose(); } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index dccc28e..1dd91cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -143,19 +143,6 @@ public static uint Idle() return ticks; } - /// - /// Parses a script and returns a function representing the script - /// - /// - /// Requires an active script context. - /// - /// The script to parse - /// A function representing the script code - public static IeJsValue ParseScript(string script) - { - return ParseScript(script, JsSourceContext.None, string.Empty); - } - /// /// Parses a script and returns a function representing the script /// @@ -176,22 +163,6 @@ public static IeJsValue ParseScript(string script, JsSourceContext sourceContext return result; } - /// - /// Parses a serialized script and returns a function representing the script - /// - /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. - /// - /// The script to parse - /// The serialized script - /// A function representing the script code - public static IeJsValue ParseSerializedScript(string script, byte[] buffer) - { - return ParseSerializedScript(script, buffer, JsSourceContext.None, string.Empty); - } - /// /// Parses a serialized script and returns a function representing the script /// @@ -216,19 +187,6 @@ public static IeJsValue ParseSerializedScript(string script, byte[] buffer, JsSo return result; } - /// - /// Executes a script - /// - /// - /// Requires an active script context. - /// - /// The script to run - /// The result of the script, if any - public static IeJsValue RunScript(string script) - { - return RunScript(script, JsSourceContext.None, string.Empty); - } - /// /// Executes a script /// @@ -249,22 +207,6 @@ public static IeJsValue RunScript(string script, JsSourceContext sourceContext, return result; } - /// - /// Runs a serialized script - /// - /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. - /// - /// The source code of the serialized script - /// The serialized script - /// The result of the script, if any - public static IeJsValue RunSerializedScript(string script, byte[] buffer) - { - return RunSerializedScript(script, buffer, JsSourceContext.None, string.Empty); - } - /// /// Runs a serialized script /// diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 44fecc5..f22584a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error #18 “Block finalizer solved?”. + Changed a implementation of the `Dispose` method. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 832ea09..8baebac 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error #18 “Block finalizer solved?”. + Changed a implementation of the `Dispose` method. ============ PROJECT SITE From 84f7f4c85a1033d919f482d3aeaa41e209ef2e1f Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 6 Jun 2018 21:00:55 +0300 Subject: [PATCH 131/238] Version 3.0.0 Beta 4 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 9 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b534d57..e48b4a1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.0 Beta 4 - June 6, 2018 + * Changed a implementation of the `Dispose` method + ## v3.0.0 Beta 3 - May 29, 2018 * Fixed a [error #18](https://github.com/Taritsyn/MsieJavaScriptEngine/issues/18) “Block finalizer solved?” diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index f22584a..8d84b13 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - beta3 + beta4 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8baebac..46b9ddd 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 3 + README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 4 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index a0d33d3..73cc5c6 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - beta3 + beta4 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 8e947fc..aa15563 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - beta3 + beta4 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 1418d0e..edfbf61 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - beta3 + beta4 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index a3ce488..3c57b62 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - beta3 + beta4 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 97ea53d..754d57d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - beta3 + beta4 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 5bf2f27..6d9b97e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - beta3 + beta4 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library From a65cffc25b0b05b5868150449f80321e2db2d3ae Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Thu, 23 Aug 2018 19:16:17 +0300 Subject: [PATCH 132/238] Fixed a error, that occurred during the generation of error message --- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../Helpers/JsErrorHelpers.cs | 15 ++-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../ErrorFormattingTests.cs | 75 +++++++++++++++++++ 7 files changed, 90 insertions(+), 10 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index ef6d44d..10abda6 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -130,7 +130,7 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e string sourceLine; error.GetSourceLineText(out sourceLine); - sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); } else { diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 4f4952f..4b638f9 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -461,7 +461,7 @@ public static JsEngineLoadException WrapEngineLoadException(Exception exception, /// Content of the source line /// Column number /// Maximum length of the source fragment - internal static string GetSourceFragment(string sourceLine, int columnNumber, + public static string GetSourceFragmentFromLine(string sourceLine, int columnNumber, int maxFragmentLength = 100) { if (string.IsNullOrEmpty(sourceLine)) @@ -480,7 +480,14 @@ internal static string GetSourceFragment(string sourceLine, int columnNumber, var leftOffset = (int)Math.Floor((double)maxFragmentLength / 2); int fragmentStartPosition = columnNumber - leftOffset - 1; - if (fragmentStartPosition < 0) + if (fragmentStartPosition > 0) + { + if (lineLength - fragmentStartPosition < maxFragmentLength) + { + fragmentStartPosition = lineLength - maxFragmentLength; + } + } + else { fragmentStartPosition = 0; } @@ -489,12 +496,10 @@ internal static string GetSourceFragment(string sourceLine, int columnNumber, if (fragmentStartPosition > 0) { startPart = ellipsisSymbol; - fragmentLength--; } - if (fragmentStartPosition + maxFragmentLength < lineLength) + if (fragmentStartPosition + fragmentLength < lineLength) { endPart = ellipsisSymbol; - fragmentLength--; } StringBuilder fragmentBuilder = StringBuilderPool.GetBuilder(); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index ef11f88..a67c5f0 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -951,7 +951,7 @@ private WrapperException WrapJsException(OriginalException originalException, sourceLine = sourcePropertyValue.ConvertToString().ToString(); } - sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index d998851..1fe4caf 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -978,7 +978,7 @@ private WrapperException WrapJsException(OriginalException originalException, sourceLine = sourcePropertyValue.ConvertToString().ToString(); } - sourceFragment = JsErrorHelpers.GetSourceFragment(sourceLine, columnNumber); + sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 8d84b13..5a88108 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Changed a implementation of the `Dispose` method. + Fixed a error, that occurred during the generation of error message. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 46b9ddd..aa8d0fd 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Changed a implementation of the `Dispose` method. + Fixed a error, that occurred during the generation of error message. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs new file mode 100644 index 0000000..3ed6672 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs @@ -0,0 +1,75 @@ +using NUnit.Framework; + +using MsieJavaScriptEngine.Helpers; + +namespace MsieJavaScriptEngine.Test.Common +{ + [TestFixture] + public class ErrorFormattingTests + { + [Test] + public void GettingSourceFragmentFromLineIsCorrect() + { + // Arrange + const string input1 = ""; + const string targetOutput1 = input1; + + const string input2 = " \n"; + const string targetOutput2 = input2; + + const string input3 = "var @variable3 = 678;"; + const string targetOutput3 = input3; + + const string input4 = " Math.hasOwnProperty(\"log2\")||(Math.log2=function(n){" + + "return Math.log(@n)*Math.LOG2E});"; + const string targetOutput4 = "…Math.hasOwnProperty(\"log2\")||(Math.log2=function(n){" + + "return Math.log(@n)*Math.LOG2E});"; + + const string input5 = "function mix(destination,source){var propertyName;destination=destination||{};" + + "for(propertyName in source){if(source.hasOwnProperty(propertyName){" + + "destination[propertyName]=source[propertyName]}}return destination}" + ; + const string targetOutput5 = "… in source){if(source.hasOwnProperty(propertyName){" + + "destination[propertyName]=source[propertyName]}}r…"; + + const string input6 = "Object.hasOwnProperty(\"assign)||(Object.assign=function(n){" + + "var u,i,f,t,r;if(typeof n==\"undefined\"||n===null)" + + "throw new TypeError(\"Object.assign: argument is not an Object.\");" + + "for(u=Object(n),f=arguments.length,i=1;i>18&0x3f;h2=bits>>12&0x3f;" + + "h3=bits>>6&0x3f;h4=bits&0x3f;enc+=b.charAt(h1)+b.charAt(h2)+b.charAt(h3)+b.charAt(h4)}" + + "while(i Date: Thu, 23 Aug 2018 19:33:55 +0300 Subject: [PATCH 133/238] Version 3.0.0 Beta 5 --- CHANGELOG.md | 3 +++ global.json | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e48b4a1..602542c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.0 Beta 5 - August 23, 2018 + * Fixed a error, that occurred during the generation of error message + ## v3.0.0 Beta 4 - June 6, 2018 * Changed a implementation of the `Dispose` method diff --git a/global.json b/global.json index bebfefe..3f864e1 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.300" + "version": "2.1.302" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 5a88108..750344d 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - beta4 + beta5 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index aa8d0fd..134b391 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 4 + README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 5 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 73cc5c6..90aeb28 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - beta4 + beta5 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index aa15563..fa6b8cc 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - beta4 + beta5 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index edfbf61..0bb7c9c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - beta4 + beta5 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 3c57b62..6cf8a9c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - beta4 + beta5 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 754d57d..28dc6ac 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - beta4 + beta5 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 6d9b97e..14186c7 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - beta4 + beta5 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library From 2c39c15385492c7f2f6b8295030ae570fb2ce717 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 10 Sep 2018 17:28:23 +0300 Subject: [PATCH 134/238] Uninstalled the MSBuild.Sdk.Extras package --- build/net40-client-target.props | 7 +++++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 4 +--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 build/net40-client-target.props diff --git a/build/net40-client-target.props b/build/net40-client-target.props new file mode 100644 index 0000000..85b46db --- /dev/null +++ b/build/net40-client-target.props @@ -0,0 +1,7 @@ + + + .NETFramework + v4.0 + client + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 750344d..924da3d 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -33,10 +33,10 @@ + - @@ -71,6 +71,4 @@ - - \ No newline at end of file From e3473d0dc58865f3123a7448828b26f1b6e851bb Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 18 Sep 2018 20:46:33 +0300 Subject: [PATCH 135/238] In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB) --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 40 ++++++++++++-- src/MsieJavaScriptEngine/JsEngineSettings.cs | 54 ++++++++++++++++++- .../JsRt/ChakraJsRtJsEngineBase.cs | 4 ++ .../MsieJavaScriptEngine.csproj | 2 +- .../Resources/CommonStrings.Designer.cs | 8 +++ .../Resources/CommonStrings.resx | 3 ++ .../Resources/CommonStrings.ru-ru.resx | 3 ++ src/MsieJavaScriptEngine/ScriptDispatcher.cs | 41 +++++++------- src/MsieJavaScriptEngine/readme.txt | 3 +- 9 files changed, 127 insertions(+), 31 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 4ee9918..598de49 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -49,11 +49,6 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// private ActiveScriptException _lastException; - /// - /// Instance of script dispatcher - /// - private static readonly ScriptDispatcher _dispatcher = new ScriptDispatcher(); - /// /// Instance of process debug manager wrapper /// @@ -104,6 +99,16 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// protected bool _interruptRequested; + /// + /// Instance of script dispatcher + /// + private static ScriptDispatcher _dispatcher; + + /// + /// Synchronizer of script dispatcher initialization + /// + private static readonly object _dispatcherSynchronizer = new object(); + /// /// Constructs an instance of the Active Script engine @@ -117,6 +122,8 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, ScriptLanguageVersion languageVersion, string lowerIeVersion, string errorCategoryNamePrefix) : base(settings) { + InitScriptDispatcher(_settings.MaxStackSize); + _lowerIeVersion = lowerIeVersion; _errorCategoryNamePrefix = errorCategoryNamePrefix; @@ -173,6 +180,29 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, } + /// + /// Initializes a script dispatcher + /// + /// The maximum stack size, in bytes, to be used by the thread, + /// or 0 to use the default maximum stack size specified in the header for the executable. + private static void InitScriptDispatcher(int maxStackSize) + { + if (_dispatcher != null) + { + return; + } + + lock (_dispatcherSynchronizer) + { + if (_dispatcher != null) + { + return; + } + + _dispatcher = new ScriptDispatcher(maxStackSize); + } + } + /// /// Checks a support of the JS engine on the machine /// diff --git a/src/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs index 01e20e1..e6311b8 100644 --- a/src/MsieJavaScriptEngine/JsEngineSettings.cs +++ b/src/MsieJavaScriptEngine/JsEngineSettings.cs @@ -1,10 +1,32 @@ -namespace MsieJavaScriptEngine +using System; + +using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine { /// /// JS engine settings /// public sealed class JsEngineSettings { +#if !NETSTANDARD1_3 + /// + /// The stack size is sufficient to run the code of modern JavaScript libraries in 32-bit process + /// + const int STACK_SIZE_32 = 492 * 1024; // like 32-bit Node.js + + /// + /// The stack size is sufficient to run the code of modern JavaScript libraries in 64-bit process + /// + const int STACK_SIZE_64 = 984 * 1024; // like 64-bit Node.js + + /// + /// The maximum stack size in bytes + /// + private int _maxStackSize; + +#endif /// /// Gets or sets a flag for whether to enable script debugging features /// @@ -22,6 +44,33 @@ public JsEngineMode EngineMode get; set; } +#if !NETSTANDARD1_3 + + /// + /// Gets or sets a maximum stack size in bytes + /// + /// + /// Set a 0 to use the default maximum stack size specified in the header + /// for the executable. + /// + /// + public int MaxStackSize + { + get { return _maxStackSize; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException( + nameof(value), + CommonStrings.Engine_MaxStackSizeMustBeNonNegative + ); + } + + _maxStackSize = value; + } + } +#endif /// /// Gets or sets a flag for whether to use the ECMAScript 5 Polyfill @@ -49,6 +98,9 @@ public JsEngineSettings() { EnableDebugging = false; EngineMode = JsEngineMode.Auto; +#if !NETSTANDARD1_3 + MaxStackSize = Utils.Is64BitProcess() ? STACK_SIZE_64 : STACK_SIZE_32; +#endif UseEcmaScript5Polyfill = false; UseJson2Library = false; } diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 35717fb..54605f9 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -48,7 +48,11 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase protected ChakraJsRtJsEngineBase(JsEngineSettings settings) : base(settings) { +#if NETSTANDARD1_3 _dispatcher = new ScriptDispatcher(); +#else + _dispatcher = new ScriptDispatcher(settings.MaxStackSize); +#endif #if NETSTANDARD _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback; #endif diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 924da3d..bc80bc9 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error, that occurred during the generation of error message. + In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB). en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 638bd4e..a0e8c7c 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -145,6 +145,14 @@ internal static string Engine_JsEngineNotLoaded get { return GetString("Engine_JsEngineNotLoaded"); } } + /// + /// Looks up a localized string similar to "Maximum stack size must be non-negative." + /// + internal static string Engine_MaxStackSizeMustBeNonNegative + { + get { return GetString("Engine_MaxStackSizeMustBeNonNegative"); } + } + /// /// Looks up a localized string similar to "Call stack" /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index d3d176c..ff836f7 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -150,6 +150,9 @@ Failed to create instance of the MsieJsEngine in {0} mode. + + Maximum stack size must be non-negative. + Call stack diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index 8e316cd..19421e4 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -150,6 +150,9 @@ Не удалось создать экземпляр MsieJsEngine в режиме {0}. + + Максимальный размер стека должен быть неотрицательным! + Стек вызовов diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 9ebaa24..fc7b649 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -1,35 +1,25 @@ using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; #if NET45 || NETSTANDARD using System.Runtime.ExceptionServices; #endif -using System.Runtime.CompilerServices; using System.Threading; +#if NET40 using MsieJavaScriptEngine.Extensions; +#endif using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine { /// - /// Provides services for managing the queue of script tasks on the thread with increased stack size + /// Provides services for managing the queue of script tasks on the thread with modified stack size /// internal sealed class ScriptDispatcher : IDisposable { -#if !NETSTANDARD1_3 /// - /// The stack size is sufficient to run the code of modern JS libraries in 32-bit process - /// - const int STACK_SIZE_32 = 492 * 1024; // like 32-bit Node.js - - /// - /// The stack size is sufficient to run the code of modern JS libraries in 64-bit process - /// - const int STACK_SIZE_64 = 984 * 1024; // like 64-bit Node.js - -#endif - /// - /// The thread with increased stack size + /// The thread with modified stack size /// private Thread _thread; @@ -54,17 +44,22 @@ internal sealed class ScriptDispatcher : IDisposable private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); +#if NETSTANDARD1_3 /// /// Constructs an instance of script dispatcher /// public ScriptDispatcher() { -#if NETSTANDARD1_3 _thread = new Thread(StartThread) #else - int sufficientStackSize = Utils.Is64BitProcess() ? STACK_SIZE_64 : STACK_SIZE_32; - - _thread = new Thread(StartThread, sufficientStackSize) + /// + /// Constructs an instance of script dispatcher + /// + /// The maximum stack size, in bytes, to be used by the thread, + /// or 0 to use the default maximum stack size specified in the header for the executable. + public ScriptDispatcher(int maxStackSize) + { + _thread = new Thread(StartThread, maxStackSize) #endif { IsBackground = true @@ -83,7 +78,7 @@ private void VerifyNotDisposed() } /// - /// Starts a thread with increased stack size. + /// Starts a thread with modified stack size. /// Loops forever, processing script tasks from the queue. /// private void StartThread() @@ -139,7 +134,7 @@ private void EnqueueTask(ScriptTask task) } /// - /// Runs a specified delegate on the thread with increased stack size, + /// Runs a specified delegate on the thread with modified stack size, /// and returns its result as an . /// Blocks until the invocation of delegate is completed. /// @@ -174,7 +169,7 @@ private object InnnerInvoke(Func del) } /// - /// Runs a specified delegate on the thread with increased stack size, + /// Runs a specified delegate on the thread with modified stack size, /// and returns its result as an . /// Blocks until the invocation of delegate is completed. /// @@ -195,7 +190,7 @@ public T Invoke(Func func) } /// - /// Runs a specified delegate on the thread with increased stack size. + /// Runs a specified delegate on the thread with modified stack size. /// Blocks until the invocation of delegate is completed. /// /// Delegate to invocation diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 134b391..0b39908 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - Fixed a error, that occurred during the generation of error message. + In JavaScript engine settings was added one new property - `MaxStackSize` + (default `492` or `984` KB). ============ PROJECT SITE From 1bf322e5eabc11e9513c8b6bb1c9da1e1209168a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 18 Sep 2018 21:05:49 +0300 Subject: [PATCH 136/238] JSON2 library was updated to version of June 12, 2017 --- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/Resources/json2.js | 94 ++++++++++++------- src/MsieJavaScriptEngine/readme.txt | 5 +- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index bc80bc9..534d054 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB). + 1. In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB); +2. JSON2 library was updated to version of June 12, 2017. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js index e66f817..f6fada6 100644 --- a/src/MsieJavaScriptEngine/Resources/json2.js +++ b/src/MsieJavaScriptEngine/Resources/json2.js @@ -1,10 +1,7 @@ // json2.js -// 2016-10-28 +// 2017-06-12 // Public Domain. // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. -// See http://www.JSON.org/js.html -// This code should be minified before deployment. -// See http://javascript.crockford.com/jsmin.html // USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO // NOT CONTROL. @@ -113,25 +110,31 @@ // a = // /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); // if (a) { -// return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], -// +a[5], +a[6])); +// return new Date(Date.UTC( +// +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6] +// )); // } +// return value; // } -// return value; // }); -// myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { -// var d; -// if (typeof value === "string" && -// value.slice(0, 5) === "Date(" && -// value.slice(-1) === ")") { -// d = new Date(value.slice(5, -1)); -// if (d) { -// return d; +// myData = JSON.parse( +// "[\"Date(09/09/2001)\"]", +// function (key, value) { +// var d; +// if ( +// typeof value === "string" +// && value.slice(0, 5) === "Date(" +// && value.slice(-1) === ")" +// ) { +// d = new Date(value.slice(5, -1)); +// if (d) { +// return d; +// } // } +// return value; // } -// return value; -// }); +// ); // This is a reference implementation. You are free to copy, modify, or // redistribute. @@ -167,7 +170,7 @@ if (typeof JSON !== "object") { function f(n) { // Format integers to have at least two digits. - return n < 10 + return (n < 10) ? "0" + n : n; } @@ -181,12 +184,20 @@ if (typeof JSON !== "object") { Date.prototype.toJSON = function () { return isFinite(this.valueOf()) - ? this.getUTCFullYear() + "-" + - f(this.getUTCMonth() + 1) + "-" + - f(this.getUTCDate()) + "T" + - f(this.getUTCHours()) + ":" + - f(this.getUTCMinutes()) + ":" + - f(this.getUTCSeconds()) + "Z" + ? ( + this.getUTCFullYear() + + "-" + + f(this.getUTCMonth() + 1) + + "-" + + f(this.getUTCDate()) + + "T" + + f(this.getUTCHours()) + + ":" + + f(this.getUTCMinutes()) + + ":" + + f(this.getUTCSeconds()) + + "Z" + ) : null; }; @@ -234,8 +245,11 @@ if (typeof JSON !== "object") { // If the value has a toJSON method, call it to obtain a replacement value. - if (value && typeof value === "object" && - typeof value.toJSON === "function") { + if ( + value + && typeof value === "object" + && typeof value.toJSON === "function" + ) { value = value.toJSON(key); } @@ -256,7 +270,7 @@ if (typeof JSON !== "object") { // JSON numbers must be finite. Encode non-finite numbers as null. - return isFinite(value) + return (isFinite(value)) ? String(value) : "null"; @@ -304,7 +318,14 @@ if (typeof JSON !== "object") { v = partial.length === 0 ? "[]" : gap - ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]" + ? ( + "[\n" + + gap + + partial.join(",\n" + gap) + + "\n" + + mind + + "]" + ) : "[" + partial.join(",") + "]"; gap = mind; return v; @@ -320,7 +341,7 @@ if (typeof JSON !== "object") { v = str(k, value); if (v) { partial.push(quote(k) + ( - gap + (gap) ? ": " : ":" ) + v); @@ -336,7 +357,7 @@ if (typeof JSON !== "object") { v = str(k, value); if (v) { partial.push(quote(k) + ( - gap + (gap) ? ": " : ":" ) + v); @@ -400,9 +421,10 @@ if (typeof JSON !== "object") { // Otherwise, throw an error. rep = replacer; - if (replacer && typeof replacer !== "function" && - (typeof replacer !== "object" || - typeof replacer.length !== "number")) { + if (replacer && typeof replacer !== "function" && ( + typeof replacer !== "object" + || typeof replacer.length !== "number" + )) { throw new Error("JSON.stringify"); } @@ -456,8 +478,10 @@ if (typeof JSON !== "object") { rx_dangerous.lastIndex = 0; if (rx_dangerous.test(text)) { text = text.replace(rx_dangerous, function (a) { - return "\\u" + - ("0000" + a.charCodeAt(0).toString(16)).slice(-4); + return ( + "\\u" + + ("0000" + a.charCodeAt(0).toString(16)).slice(-4) + ); }); } diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 0b39908..8743596 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,9 @@ ============= RELEASE NOTES ============= - In JavaScript engine settings was added one new property - `MaxStackSize` - (default `492` or `984` KB). + 1. In JavaScript engine settings was added one new property - `MaxStackSize` + (default `492` or `984` KB); + 2. JSON2 library was updated to version of June 12, 2017. ============ PROJECT SITE From 82c64792190eedfa34aeec4be16cffc7b8f1a644 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 18 Sep 2018 21:45:26 +0300 Subject: [PATCH 137/238] Version 3.0.0 RC 1 --- CHANGELOG.md | 4 ++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 9 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 602542c..caead31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## v3.0.0 RC 1 - September 18, 2018 + * In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB) + * JSON2 library was updated to version of June 12, 2017 + ## v3.0.0 Beta 5 - August 23, 2018 * Fixed a error, that occurred during the generation of error message diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 534d054..84d9c26 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - beta5 + rc1 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8743596..98f8916 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 Beta 5 + README file for MSIE JavaScript Engine for .NET v3.0.0 RC 1 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 90aeb28..ddb2f0b 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - beta5 + rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index fa6b8cc..f0b4a90 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - beta5 + rc1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 0bb7c9c..e2c5b7d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - beta5 + rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 6cf8a9c..22fd011 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - beta5 + rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 28dc6ac..153ef60 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - beta5 + rc1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 14186c7..657d41e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - beta5 + rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.9 Library From ef42fb671a7681302f7449037598409fb35483b8 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Sat, 17 Nov 2018 15:45:54 +0300 Subject: [PATCH 138/238] Updated a version of .NET Core Runtime --- global.json | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/global.json b/global.json index 3f864e1..11b0bca 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.302" + "version": "2.1.403" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index ddb2f0b..e0f5f32 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -5,7 +5,7 @@ 3.0.0 rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.9 + 1.0.13 Library true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index e2c5b7d..c6a8ad2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -5,7 +5,7 @@ 3.0.0 rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.9 + 1.0.13 Library true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 22fd011..6284a1f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -5,7 +5,7 @@ 3.0.0 rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.9 + 1.0.13 Library true false diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 657d41e..0ef60bf 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -5,7 +5,7 @@ 3.0.0 rc1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.9 + 1.0.13 Library true false From 19a85f33bd1e68f3166c963bc862a5e08cc8ab63 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 21 Nov 2018 17:15:38 +0300 Subject: [PATCH 139/238] 1. Improved performance of debugging in ActiveScript modes; 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class. --- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../ActiveScript/Debugging/DebugDocument.cs | 35 +---- .../Extensions/StringExtensions.cs | 34 +++++ .../Helpers/JsErrorHelpers.cs | 69 ---------- .../Helpers/TextHelpers.cs | 125 ++++++++++++++++++ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- .../MsieJavaScriptEngine.csproj | 4 +- src/MsieJavaScriptEngine/readme.txt | 6 +- .../ErrorFormattingTests.cs | 14 +- 10 files changed, 177 insertions(+), 116 deletions(-) create mode 100644 src/MsieJavaScriptEngine/Helpers/TextHelpers.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 10abda6..2bf1273 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -130,7 +130,7 @@ protected ActiveScriptException CreateActiveScriptException(IActiveScriptError e string sourceLine; error.GetSourceLineText(out sourceLine); - sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); + sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); } else { diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs index 91a8bc8..7f05635 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs @@ -3,7 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; -using System.Text.RegularExpressions; + +using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.ActiveScript.Debugging { @@ -13,11 +14,6 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging internal sealed class DebugDocument : IDebugDocumentInfo, IDebugDocumentProvider, IDebugDocument, IDebugDocumentText { - /// - /// Regular expression for working with a line break - /// - private static readonly Regex _lineBreakRegex = new Regex("\r\n|\n|\r"); - /// /// Active Script wrapper /// @@ -84,31 +80,6 @@ public DebugDocument(IActiveScriptWrapper activeScriptWrapper, } - /// - /// Finds a line break - /// - /// Source code - /// Position in the input string that defines the leftmost - /// position to be searched - /// Number of characters in the substring to include in the search - /// Position of line break - /// Length of line break - private static void FindLineBreak(string sourceCode, int startPosition, int length, - out int lineBreakPosition, out int lineBreakLength) - { - Match lineBreakMatch = _lineBreakRegex.Match(sourceCode, startPosition, length); - if (lineBreakMatch.Success) - { - lineBreakPosition = lineBreakMatch.Index; - lineBreakLength = lineBreakMatch.Length; - } - else - { - lineBreakPosition = -1; - lineBreakLength = 0; - } - } - /// /// Initializes a debug document /// @@ -126,7 +97,7 @@ private void Initialize() documentStartPosition : lineBreakPosition + lineBreakLength; int remainderLength = documentEndPosition - linePosition + 1; - FindLineBreak(_code, linePosition, remainderLength, + TextHelpers.FindNextLineBreak(_code, linePosition, remainderLength, out lineBreakPosition, out lineBreakLength); int lineLength = lineBreakPosition != -1 ? lineBreakPosition - linePosition : 0; diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index f141fa5..1215e0c 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -117,5 +117,39 @@ public static string[] SplitToLines(this string source) return result; } + + /// + /// Gets a character at the specified index from the string. + /// A return value indicates whether the receiving succeeded. + /// + /// The source string + /// The zero-based index of the character + /// When this method returns, contains the character from the string, + /// if the receiving succeeded, or null character if the receiving failed. + /// The receiving fails if the index out of bounds. + /// true if the character was received successfully; otherwise, false + public static bool TryGetChar(this string source, int index, out char result) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + bool isSuccess; + int length = source.Length; + + if (length > 0 && index >= 0 && index < length) + { + result = source[index]; + isSuccess = true; + } + else + { + result = '\0'; + isSuccess = false; + } + + return isSuccess; + } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 4b638f9..29db369 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -455,75 +455,6 @@ public static JsEngineLoadException WrapEngineLoadException(Exception exception, #region Misc - /// - /// Gets a fragment from the source line - /// - /// Content of the source line - /// Column number - /// Maximum length of the source fragment - public static string GetSourceFragmentFromLine(string sourceLine, int columnNumber, - int maxFragmentLength = 100) - { - if (string.IsNullOrEmpty(sourceLine)) - { - return string.Empty; - } - - string fragment; - int lineLength = sourceLine.Length; - - if (lineLength > maxFragmentLength) - { - const string ellipsisSymbol = "…"; - string startPart = string.Empty; - string endPart = string.Empty; - - var leftOffset = (int)Math.Floor((double)maxFragmentLength / 2); - int fragmentStartPosition = columnNumber - leftOffset - 1; - if (fragmentStartPosition > 0) - { - if (lineLength - fragmentStartPosition < maxFragmentLength) - { - fragmentStartPosition = lineLength - maxFragmentLength; - } - } - else - { - fragmentStartPosition = 0; - } - int fragmentLength = maxFragmentLength; - - if (fragmentStartPosition > 0) - { - startPart = ellipsisSymbol; - } - if (fragmentStartPosition + fragmentLength < lineLength) - { - endPart = ellipsisSymbol; - } - - StringBuilder fragmentBuilder = StringBuilderPool.GetBuilder(); - if (startPart.Length > 0) - { - fragmentBuilder.Append(startPart); - } - fragmentBuilder.Append(sourceLine.Substring(fragmentStartPosition, fragmentLength)); - if (endPart.Length > 0) - { - fragmentBuilder.Append(endPart); - } - - fragment = fragmentBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(fragmentBuilder); - } - else - { - fragment = sourceLine; - } - - return fragment; - } - /// /// Writes a error location line to the buffer /// diff --git a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs new file mode 100644 index 0000000..16f01c6 --- /dev/null +++ b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs @@ -0,0 +1,125 @@ +using System; +using System.Text; + +using MsieJavaScriptEngine.Extensions; +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine.Helpers +{ + /// + /// Text helpers + /// + public static class TextHelpers + { + /// + /// Array of characters used to find the next line break + /// + private static readonly char[] _nextLineBreakChars = new char[] { '\r', '\n' }; + + + /// + /// Gets a fragment from the text line + /// + /// Content of the text line + /// Column number + /// Maximum length of the text fragment + public static string GetTextFragmentFromLine(string textLine, int columnNumber, + int maxFragmentLength = 100) + { + if (string.IsNullOrEmpty(textLine)) + { + return string.Empty; + } + + string fragment; + int lineLength = textLine.Length; + + if (lineLength > maxFragmentLength) + { + const string ellipsisSymbol = "…"; + string startPart = string.Empty; + string endPart = string.Empty; + + var leftOffset = (int)Math.Floor((double)maxFragmentLength / 2); + int fragmentStartPosition = columnNumber - leftOffset - 1; + if (fragmentStartPosition > 0) + { + if (lineLength - fragmentStartPosition < maxFragmentLength) + { + fragmentStartPosition = lineLength - maxFragmentLength; + } + } + else + { + fragmentStartPosition = 0; + } + int fragmentLength = maxFragmentLength; + + if (fragmentStartPosition > 0) + { + startPart = ellipsisSymbol; + } + if (fragmentStartPosition + fragmentLength < lineLength) + { + endPart = ellipsisSymbol; + } + + StringBuilder fragmentBuilder = StringBuilderPool.GetBuilder(); + if (startPart.Length > 0) + { + fragmentBuilder.Append(startPart); + } + fragmentBuilder.Append(textLine.Substring(fragmentStartPosition, fragmentLength)); + if (endPart.Length > 0) + { + fragmentBuilder.Append(endPart); + } + + fragment = fragmentBuilder.ToString(); + StringBuilderPool.ReleaseBuilder(fragmentBuilder); + } + else + { + fragment = textLine; + } + + return fragment; + } + + /// + /// Finds a next line break + /// + /// Source text + /// Position in the input string that defines the leftmost + /// position to be searched + /// Number of characters in the substring to include in the search + /// Position of line break + /// Length of line break + internal static void FindNextLineBreak(string sourceText, int startPosition, int length, + out int lineBreakPosition, out int lineBreakLength) + { + lineBreakPosition = sourceText.IndexOfAny(_nextLineBreakChars, startPosition, length); + if (lineBreakPosition != -1) + { + lineBreakLength = 1; + char currentCharacter = sourceText[lineBreakPosition]; + + if (currentCharacter == '\r') + { + int nextCharacterPosition = lineBreakPosition + 1; + char nextCharacter; + + if (sourceText.TryGetChar(nextCharacterPosition, out nextCharacter) + && nextCharacter == '\n') + { + lineBreakLength = 2; + } + } + } + else + { + lineBreakLength = 0; + } + } + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index a67c5f0..3f95af2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -951,7 +951,7 @@ private WrapperException WrapJsException(OriginalException originalException, sourceLine = sourcePropertyValue.ConvertToString().ToString(); } - sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); + sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 1fe4caf..24fbc6b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -978,7 +978,7 @@ private WrapperException WrapJsException(OriginalException originalException, sourceLine = sourcePropertyValue.ConvertToString().ToString(); } - sourceFragment = JsErrorHelpers.GetSourceFragmentFromLine(sourceLine, columnNumber); + sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 84d9c26..b67206e 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,8 +24,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB); -2. JSON2 library was updated to version of June 12, 2017. + 1. Improved performance of debugging in ActiveScript modes; +2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 98f8916..8636b49 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,9 +21,9 @@ ============= RELEASE NOTES ============= - 1. In JavaScript engine settings was added one new property - `MaxStackSize` - (default `492` or `984` KB); - 2. JSON2 library was updated to version of June 12, 2017. + 1. Improved performance of debugging in ActiveScript modes; + 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been + replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs index 3ed6672..bcd0519 100644 --- a/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs @@ -54,13 +54,13 @@ public void GettingSourceFragmentFromLineIsCorrect() "case 2:enc=enc.slice(0,-1)+'=';break}return @enc}"; // Act - string output1 = JsErrorHelpers.GetSourceFragmentFromLine(input1, 1, 100); - string output2 = JsErrorHelpers.GetSourceFragmentFromLine(input2, 1, 100); - string output3 = JsErrorHelpers.GetSourceFragmentFromLine(input3, 5, 100); - string output4 = JsErrorHelpers.GetSourceFragmentFromLine(input4, 70, 85); - string output5 = JsErrorHelpers.GetSourceFragmentFromLine(input5, 145, 100); - string output6 = JsErrorHelpers.GetSourceFragmentFromLine(input6, 23, 100); - string output7 = JsErrorHelpers.GetSourceFragmentFromLine(input7, 465, 100); + string output1 = TextHelpers.GetTextFragmentFromLine(input1, 1, 100); + string output2 = TextHelpers.GetTextFragmentFromLine(input2, 1, 100); + string output3 = TextHelpers.GetTextFragmentFromLine(input3, 5, 100); + string output4 = TextHelpers.GetTextFragmentFromLine(input4, 70, 85); + string output5 = TextHelpers.GetTextFragmentFromLine(input5, 145, 100); + string output6 = TextHelpers.GetTextFragmentFromLine(input6, 23, 100); + string output7 = TextHelpers.GetTextFragmentFromLine(input7, 465, 100); // Assert Assert.AreEqual(targetOutput1, output1); From 694d2eb51f1fecce1cad69b63af10cb088c0d5c5 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 26 Nov 2018 19:55:33 +0300 Subject: [PATCH 140/238] Added a benchmarks --- MsieJavaScriptEngine.sln | 7 + global.json | 2 +- .../MsieJavaScriptEngine.Benchmarks/Assert.cs | 24 + .../JsExecutionBenchmark.cs | 226 ++++++ .../MsieJavaScriptEngine.Benchmarks.csproj | 25 + .../Program.cs | 12 + .../Resources/russian-translit.js | 754 ++++++++++++++++++ 7 files changed, 1049 insertions(+), 1 deletion(-) create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Assert.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Program.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 477383b..5ede8f0 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -18,6 +18,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{3C9CD486-50AD-476E-9515-3F85EBAFCC38}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Benchmarks", "test\MsieJavaScriptEngine.Benchmarks\MsieJavaScriptEngine.Benchmarks.csproj", "{A304B8BE-B946-453B-B2B5-D21305A299F8}" +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.csproj", "{3DD423C5-DC32-42D4-9924-B5D8C2F23195}" @@ -64,6 +66,10 @@ Global {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.Build.0 = Release|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -77,6 +83,7 @@ Global {5864D57D-2EB8-4684-9908-26111127E75B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {72233C70-DF61-449F-8D53-D456284CDA5D} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} + {A304B8BE-B946-453B-B2B5-D21305A299F8} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {5035D2B6-B7C8-4A7F-8764-07B60AD66E96} diff --git a/global.json b/global.json index 11b0bca..054926a 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.403" + "version": "2.1.500" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Assert.cs b/test/MsieJavaScriptEngine.Benchmarks/Assert.cs new file mode 100644 index 0000000..e794112 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Assert.cs @@ -0,0 +1,24 @@ +using System; +using System.Text; + +namespace MsieJavaScriptEngine.Benchmarks +{ + internal static class Assert + { + public static void Equal(string expected, string actual) + { + if (actual != expected) + { + var messageBuilder = new StringBuilder(); + messageBuilder.AppendLine("Assert.Equal() Failure"); + messageBuilder.AppendLine(); + messageBuilder.AppendLine($"Expected: {expected}"); + messageBuilder.Append($"Actual: {actual}"); + + string errorMessage = messageBuilder.ToString(); + + throw new InvalidOperationException(errorMessage); + } + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs new file mode 100644 index 0000000..d4abe63 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs @@ -0,0 +1,226 @@ +using System; +using System.IO; +using System.Reflection; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Order; + +namespace MsieJavaScriptEngine.Benchmarks +{ + [MemoryDiagnoser] + [Orderer(SummaryOrderPolicy.Method, MethodOrderPolicy.Declared)] + public class JsExecutionBenchmark + { + /// + /// Name of the file containing library for transliteration of Russian + /// + private const string LibraryFileName = "russian-translit.js"; + + /// + /// Name of transliterate function + /// + private const string FunctionName = "transliterate"; + + /// + /// Number of transliterated items + /// + private const int ItemCount = 6; + + /// + /// Code of library for transliteration of Russian + /// + private static string _libraryCode; + + /// + /// List of transliteration types + /// + private static string[] _inputTypes; + + /// + /// List of input strings + /// + private static string[] _inputStrings; + + /// + /// List of target output strings + /// + private static string[] _targetOutputStrings; + + + /// + /// Static constructor + /// + static JsExecutionBenchmark() + { + PopulateTestData(); + } + + + /// + /// Populates a test data + /// + public static void PopulateTestData() + { + Type type = typeof(JsExecutionBenchmark); + Assembly assembly = type.Assembly; + string resourceName = type.Namespace + ".Resources." + LibraryFileName; + + using (Stream stream = assembly.GetManifestResourceStream(resourceName)) + using (StreamReader reader = new StreamReader(stream)) + { + _libraryCode = reader.ReadToEnd(); + } + + _inputTypes = new string[ItemCount] + { + "basic", "letters-numbers", "gost-16876-71", "gost-7-79-2000", "police", "foreign-passport" + }; + _inputStrings = new string[ItemCount] + { + "SOLID — мнемонический акроним, введённый Майклом Фэзерсом для первых пяти принципов, названных " + + "Робертом Мартином в начале 2000-х, которые означали пять основных принципов объектно-ориентированного " + + "программирования и проектирования.", + + "Принцип единственной ответственности (The Single Responsibility Principle). " + + "Каждый класс выполняет лишь одну задачу.", + + "Принцип открытости/закрытости (The Open Closed Principle). " + + "«программные сущности … должны быть открыты для расширения, но закрыты для модификации.»", + + "Принцип подстановки Барбары Лисков (The Liskov Substitution Principle). " + + "«объекты в программе должны быть заменяемыми на экземпляры их подтипов без изменения правильности выполнения программы.»", + + "Принцип разделения интерфейса (The Interface Segregation Principle). " + + "«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»", + + "Принцип инверсии зависимостей (The Dependency Inversion Principle). " + + "«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»" + }; + _targetOutputStrings = new string[ItemCount] + { + "SOLID — mnemonicheskij akronim, vvedjonnyj Majklom Fjezersom dlja pervyh pjati principov, nazvannyh " + + "Robertom Martinom v nachale 2000-h, kotorye oznachali pjat' osnovnyh principov ob#ektno-orientirovannogo " + + "programmirovanija i proektirovanija.", + + "Princip edinstvennoj otvetstvennosti (The Single Responsibility Principle). " + + "Ka#dyj klass vypolnjaet li6' odnu zada4u.", + + "Princip otkrytosti/zakrytosti (The Open Closed Principle). " + + "«programmnye sushhnosti … dolzhny byt' otkryty dlja rasshirenija, no zakryty dlja modifikacii.»", + + "Princip podstanovki Barbary Liskov (The Liskov Substitution Principle). " + + "«ob\"ekty v programme dolzhny byt' zamenyaemymi na e'kzemplyary ix podtipov bez izmeneniya pravil'nosti " + + "vypolneniya programmy.»", + + "Printsip razdeleniia interfeisa (The Interface Segregation Principle). " + + "«mnogo interfeisov, spetsialno prednaznachennykh dlia klientov, luchshe, chem odin interfeis obshchego " + + "naznacheniia.»", + + "Printcip inversii zavisimostei (The Dependency Inversion Principle). " + + "«Zavisimost na Abstraktciiakh. Net zavisimosti na chto-to konkretnoe.»" + }; + } + + /// + /// Transliterates a strings + /// + /// Delegate for create an instance of the JS engine + /// Flag for whether to allow execution of JS code with pre-compilation + private static void TransliterateStrings(Func createJsEngine, bool withPrecompilation) + { + // Arrange + string[] outputStrings = new string[ItemCount]; + PrecompiledScript precompiledCode = null; + + // Act + using (var jsEngine = createJsEngine()) + { + if (withPrecompilation) + { + if (!jsEngine.SupportsScriptPrecompilation) + { + throw new NotSupportedException($"{jsEngine.Mode} mode does not support precompilation."); + } + + precompiledCode = jsEngine.Precompile(_libraryCode, LibraryFileName); + jsEngine.Execute(precompiledCode); + } + else + { + jsEngine.Execute(_libraryCode, LibraryFileName); + } + + outputStrings[0] = jsEngine.CallFunction(FunctionName, _inputStrings[0], _inputTypes[0]); + } + + for (int itemIndex = 1; itemIndex < ItemCount; itemIndex++) + { + using (var jsEngine = createJsEngine()) + { + if (withPrecompilation) + { + jsEngine.Execute(precompiledCode); + } + else + { + jsEngine.Execute(_libraryCode, LibraryFileName); + } + outputStrings[itemIndex] = jsEngine.CallFunction(FunctionName, _inputStrings[itemIndex], + _inputTypes[itemIndex]); + } + } + + // Assert + for (int itemIndex = 1; itemIndex < ItemCount; itemIndex++) + { + Assert.Equal(_targetOutputStrings[itemIndex], outputStrings[itemIndex]); + } + } +#if NET46 + + [Benchmark] + public void Classic() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings{ + EngineMode = JsEngineMode.Classic + }); + TransliterateStrings(createJsEngine, false); + } + + [Benchmark] + public void ChakraActiveScript() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript + }); + TransliterateStrings(createJsEngine, false); + } +#endif + + [Benchmark] + [Arguments(false)] + [Arguments(true)] + public void ChakraIeJsRt(bool withPrecompilation) + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt + }); + TransliterateStrings(createJsEngine, withPrecompilation); + } + + [Benchmark] + [Arguments(false)] + [Arguments(true)] + public void ChakraEdgeJsRt(bool withPrecompilation) + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt + }); + TransliterateStrings(createJsEngine, withPrecompilation); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj new file mode 100644 index 0000000..eeb15db --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -0,0 +1,25 @@ + + + + MSIE JavaScript Engine: Benchmarks + 3.0.0 + rc1 + net46;netcoreapp2.0 + Exe + true + false + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Program.cs b/test/MsieJavaScriptEngine.Benchmarks/Program.cs new file mode 100644 index 0000000..abd0419 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Program.cs @@ -0,0 +1,12 @@ +using BenchmarkDotNet.Running; + +namespace MsieJavaScriptEngine.Benchmarks +{ + public static class Program + { + public static void Main(string[] args) + { + BenchmarkRunner.Run(); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js b/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js new file mode 100644 index 0000000..4685668 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js @@ -0,0 +1,754 @@ +var transliterate = (function () { + 'use strict'; + + /** + * Сопоставления русских и латинских символов, сгруппированные по типам (системам) транслитерации + * + * @private {Object} + */ + var characterMappings = { + // Основной + 'basic': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'jo', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'j', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'h', + 'ц': 'c', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shh', + 'ъ': '#', + 'ы': 'y', + 'ь': '\'', + 'э': 'je', + 'ю': 'ju', + 'я': 'ja', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Jo', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'J', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'H', + 'Ц': 'C', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shh', + 'Ъ': '##', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'Je', + 'Ю': 'Ju', + 'Я': 'Ja' + }, + + // Буквы-цифры + 'letters-numbers': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'jo', + 'ж': '#', + 'з': 'z', + 'и': 'i', + 'й': 'j', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'h', + 'ц': 'c', + 'ч': '4', + 'ш': '6', + 'щ': 'sch', + 'ъ': '*', + 'ы': 'y', + 'ь': '\'', + 'э': 'je', + 'ю': 'ju', + 'я': 'ja', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Jo', + 'Ж': '##', + 'З': 'Z', + 'И': 'I', + 'Й': 'J', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'H', + 'Ц': 'C', + 'Ч': '44', + 'Ш': '66', + 'Щ': 'Sch', + 'Ъ': '**', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'Je', + 'Ю': 'Ju', + 'Я': 'Ja' + }, + + // ГОСТ 16876-71 + 'gost-16876-71': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'jo', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'jj', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'c', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shh', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'eh', + 'ю': 'ju', + 'я': 'ja', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Jo', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'Jj', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'C', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shh', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'Eh', + 'Ю': 'Ju', + 'Я': 'Ja' + }, + + // ГОСТ 7.79-2000 + 'gost-7-79-2000': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'yo', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'j', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'x', + 'ц': 'c', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shh', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'e\'', + 'ю': 'yu', + 'я': 'ya', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Yo', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'J', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'X', + 'Ц': 'C', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shh', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'E\'', + 'Ю': 'Yu', + 'Я': 'Ya' + }, + + // СЭВ 1362-78 + 'sev-1362-78': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'jo', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'j', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'c', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shh', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'eh', + 'ю': 'ju', + 'я': 'ja', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Jo', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'J', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'C', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shh', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'Eh', + 'Ю': 'Ju', + 'Я': 'Ja' + }, + + // LC + 'lc': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'i', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'ts', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shch', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'e', + 'ю': 'iu', + 'я': 'ia', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'I', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'Ts', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shch', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'E', + 'Ю': 'Iu', + 'Я': 'Ia' + }, + + // BGN + 'bgn': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'y', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'ts', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shch', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'e', + 'ю': 'yu', + 'я': 'ya', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'Y', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'Ts', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shch', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'E', + 'Ю': 'Yu', + 'Я': 'Ya' + }, + + // BSI + 'bsi': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'i', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'ts', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shch', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'e', + 'ю': 'yu', + 'я': 'ya', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'I', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'Ts', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shch', + 'Ъ': '""', + 'Ы': 'Y', + 'Ь': '\'\'', + 'Э': 'E', + 'Ю': 'Yu', + 'Я': 'Ya' + }, + + // Сходно с МВД + 'police': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'i', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'ts', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shch', + 'ъ': 'ie', + 'ы': 'y', + 'ь': '', + 'э': 'e', + 'ю': 'iu', + 'я': 'ia', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'I', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'Ts', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shch', + 'Ъ': 'Ie', + 'Ы': 'Y', + 'Ь': '', + 'Э': 'E', + 'Ю': 'Iu', + 'Я': 'Ia' + }, + + // Как на загранпаспорт + 'foreign-passport': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'zh', + 'з': 'z', + 'и': 'i', + 'й': 'i', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'kh', + 'ц': 'tc', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'shch', + 'ъ': '', + 'ы': 'y', + 'ь': '', + 'э': 'e', + 'ю': 'iu', + 'я': 'ia', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'Zh', + 'З': 'Z', + 'И': 'I', + 'Й': 'I', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'Kh', + 'Ц': 'Tc', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Shch', + 'Ъ': '', + 'Ы': 'Y', + 'Ь': '', + 'Э': 'E', + 'Ю': 'Iu', + 'Я': 'Ia' + } + }; + + /** + * Производит транслитерацию русского текста с кириллицы на латиницу + * + * @param {String} value - Текст, содержащий символы русского (кириллического) алфавита + * @param {String} type - Код типа (системы) транслитерации + * @returns {String} Текст, содержащий только символы латинского алфавита + * @expose + */ + function transliterate(value, type) { + var charCount, + charIndex, + charValue, + newCharValue, + characterMapping, + result + ; + + value = value || ''; + type = type || 'basic'; + + charCount = value.length; + if (charCount === 0) { + return value; + } + + characterMapping = characterMappings[type]; + if (typeof characterMapping === 'undefined') { + return value; + } + + result = ''; + + for (charIndex = 0; charIndex < charCount; charIndex++) { + charValue = value.charAt(charIndex); + newCharValue = typeof characterMapping[charValue] !== 'undefined' ? + characterMapping[charValue] : charValue; + result += newCharValue; + } + + return result; + } + + return transliterate; +}()); \ No newline at end of file From 1b54aeb9a58bbe8833acae507bd9dfd560d47e17 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Wed, 28 Nov 2018 16:39:46 +0300 Subject: [PATCH 141/238] Added a tests for variables and functions with names containing Unicode characters --- build/common.props | 2 +- .../CommonTestsBase.cs | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/build/common.props b/build/common.props index 39fe967..bc1dfcf 100644 --- a/build/common.props +++ b/build/common.props @@ -3,7 +3,7 @@ Copyright © 2012-2018 Andrey Taritsyn - + $(DefineConstants);NETFULL diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 2b8f920..aab79e3 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -638,6 +638,29 @@ public virtual void CallingOfFunctionWithManyParametersAndUnicodeStringResultIsC Assert.AreEqual("Привет, Петя!", output); } + [Test] + public virtual void CallingOfFunctionWithNameContainingUnicodeCharactersIsCorrect() + { + // Arrange + const string functionCode = @"function сумма(число1, число2) { + var результат = число1 + число2; + + return результат; +}"; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(functionCode); + output = jsEngine.CallFunction("сумма", 678, 711); + } + + // Assert + Assert.AreEqual(1389, output); + } + #endregion #region Getting, setting and removing variables @@ -916,6 +939,30 @@ public virtual void RemovingVariableIsCorrect() Assert.IsFalse(variableAfterRemovingExists); } + [Test] + public virtual void RemovingVariableWithNameContainingUnicodeCharactersIsCorrect() + { + // Arrange + const string variableName = "цена"; + const double input = 6780.00; + + // Act + bool variableBeforeRemovingExists; + bool variableAfterRemovingExists; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.SetVariableValue(variableName, input); + variableBeforeRemovingExists = jsEngine.HasVariable(variableName); + jsEngine.RemoveVariable(variableName); + variableAfterRemovingExists = jsEngine.HasVariable(variableName); + } + + // Assert + Assert.IsTrue(variableBeforeRemovingExists); + Assert.IsFalse(variableAfterRemovingExists); + } + #endregion #region Script interruption From 9460b499f73dca0207a48bbce4bca2d3fedc3fa8 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 3 Dec 2018 21:43:46 +0300 Subject: [PATCH 142/238] One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder --- .../Extensions/ExceptionExtensions.cs | 2 +- .../Extensions/StringBuilderExtensions.cs | 95 ------------ .../Extensions/TypeExtensions.cs | 4 - .../Helpers/ComHelpers.cs | 12 +- .../Helpers/JsErrorHelpers.cs | 33 ++-- .../Helpers/TextHelpers.cs | 8 +- src/MsieJavaScriptEngine/JsException.cs | 11 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 7 +- .../MsieJavaScriptEngine.csproj | 6 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 11 +- .../Polyfills/System/Reflection/TypeInfo.cs | 78 ---------- .../Polyfills/System/TypeExtensions.cs | 29 ---- .../Utilities/StringBuilderPool.cs | 142 ------------------ .../Utilities/TypeConverter.cs | 13 +- src/MsieJavaScriptEngine/Utilities/Utils.cs | 7 +- src/MsieJavaScriptEngine/readme.txt | 4 +- 16 files changed, 69 insertions(+), 393 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs delete mode 100644 src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs delete mode 100644 src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs delete mode 100644 src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs diff --git a/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs index 6cd58cd..e6e2fa5 100644 --- a/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs @@ -7,7 +7,7 @@ namespace MsieJavaScriptEngine.Extensions /// /// Exception extensions /// - public static class ExceptionExtensions + internal static class ExceptionExtensions { /// /// Preserves a stack trace of exception diff --git a/src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs deleted file mode 100644 index 04b4c95..0000000 --- a/src/MsieJavaScriptEngine/Extensions/StringBuilderExtensions.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System; -using System.Text; -using System.Text.RegularExpressions; - -namespace MsieJavaScriptEngine.Extensions -{ - /// - /// Extensions for StringBuilder - /// - internal static class StringBuilderExtensions - { - /// - /// Regular expression for format placeholder - /// - private static readonly Regex _formatPlaceholderRegExp = - new Regex(@"\{[0-9]\}", RegexOptions.Multiline); - - /// - /// Appends the default line terminator to the end of the current instance - /// - /// Instance of - /// Instance of - public static StringBuilder AppendFormatLine(this StringBuilder source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - return source.AppendLine(); - } - - /// - /// Appends the string returned by processing a composite format string, which - /// contains zero or more format items, with default line terminator to this instance. - /// Each format item is replaced by the string representation of a corresponding - /// argument in a parameter array. - /// - /// Instance of - /// A composite format string - /// An array of objects to format - /// Instance of - public static StringBuilder AppendFormatLine(this StringBuilder source, string format, params object[] args) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - if (_formatPlaceholderRegExp.IsMatch(format)) - { - return source.AppendFormat(format, args).AppendLine(); - } - - return source.AppendLine(format.Replace("{{", "{").Replace("}}", "}")); - } - - /// - /// Removes the all trailing white-space characters from the current instance - /// - /// Instance of - /// Instance of without trailing white-space characters - public static StringBuilder TrimEnd(this StringBuilder source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - int charCount = source.Length; - if (charCount == 0) - { - return source; - } - - int charIndex = charCount - 1; - - for (; charIndex >= 0; charIndex--) - { - char charValue = source[charIndex]; - if (!char.IsWhiteSpace(charValue)) - { - break; - } - } - - if (charIndex < source.Length - 1) - { - source.Length = charIndex + 1; - } - - return source; - } - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs index d7fcdba..4b67c11 100644 --- a/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs @@ -2,10 +2,6 @@ #if NETSTANDARD1_3 using System.Reflection; #endif -#if NET40 - -using MsieJavaScriptEngine.Polyfills.System.Reflection; -#endif namespace MsieJavaScriptEngine.Extensions { diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 1f53554..f023354 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,14 +1,8 @@ #if !NETSTANDARD using System; -#if NET45 -using System.Reflection; -#endif using System.Runtime.InteropServices; using MsieJavaScriptEngine.Constants; -#if NET40 -using MsieJavaScriptEngine.Polyfills.System; -#endif namespace MsieJavaScriptEngine.Helpers { @@ -27,7 +21,7 @@ public static IntPtr CreateInstanceByClsid(string clsid) public static IntPtr CreateInstanceByClsid(Guid clsid) { IntPtr pInterface; - Guid iid = typeof(T).GetTypeInfo().GUID; + Guid iid = typeof(T).GUID; HResult.Check(NativeMethods.CoCreateInstance(ref clsid, IntPtr.Zero, 1, ref iid, out pInterface)); return pInterface; @@ -82,7 +76,7 @@ public static bool TryGetComType(string progId, string serverName, out Type type public static IntPtr QueryInterface(IntPtr pUnknown) { IntPtr pInterface; - Guid iid = typeof(T).GetTypeInfo().GUID; + Guid iid = typeof(T).GUID; HResult.Check(Marshal.QueryInterface(pUnknown, ref iid, out pInterface)); @@ -92,7 +86,7 @@ public static IntPtr QueryInterface(IntPtr pUnknown) public static IntPtr QueryInterfaceNoThrow(IntPtr pUnknown) { IntPtr pInterface; - Guid iid = typeof(T).GetTypeInfo().GUID; + Guid iid = typeof(T).GUID; int result = Marshal.QueryInterface(pUnknown, ref iid, out pInterface); return result == ComErrorCode.S_OK ? pInterface : IntPtr.Zero; diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 29db369..613ceff 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -5,9 +5,10 @@ using System.Text; using System.Text.RegularExpressions; +using AdvancedStringBuilder; + using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Resources; -using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.Helpers { @@ -91,7 +92,8 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) return string.Empty; } - StringBuilder stackBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder stackBuilder = stringBuilderPool.Rent(); for (int stackItemIndex = 0; stackItemIndex < stackItemCount; stackItemIndex++) { @@ -106,7 +108,7 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) } string callStack = stackBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(stackBuilder); + stringBuilderPool.Return(stackBuilder); return callStack; } @@ -144,7 +146,8 @@ internal static string GenerateEngineLoadErrorMessage(string description, string if (!string.IsNullOrWhiteSpace(description)) { - StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder messageBuilder = stringBuilderPool.Rent(); messageBuilder.Append(jsEngineNotLoadedPart); messageBuilder.Append(" "); if (quoteDescription) @@ -157,7 +160,7 @@ internal static string GenerateEngineLoadErrorMessage(string description, string } message = messageBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(messageBuilder); + stringBuilderPool.Return(messageBuilder); } else { @@ -223,7 +226,8 @@ internal static string GenerateScriptErrorMessage(string type, string descriptio ); } - StringBuilder messageBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder messageBuilder = stringBuilderPool.Rent(); if (!string.IsNullOrWhiteSpace(type)) { messageBuilder.Append(type); @@ -247,7 +251,7 @@ internal static string GenerateScriptErrorMessage(string type, string descriptio } string errorMessage = messageBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(messageBuilder); + stringBuilderPool.Return(messageBuilder); return errorMessage; } @@ -269,7 +273,8 @@ public static string GenerateErrorDetails(JsException jsException, bool omitMess throw new ArgumentNullException(nameof(jsException)); } - StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder detailsBuilder = stringBuilderPool.Rent(); WriteCommonErrorDetails(detailsBuilder, jsException, omitMessage); var jsScriptException = jsException as JsScriptException; @@ -287,7 +292,7 @@ public static string GenerateErrorDetails(JsException jsException, bool omitMess detailsBuilder.TrimEnd(); string errorDetails = detailsBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(detailsBuilder); + stringBuilderPool.Return(detailsBuilder); return errorDetails; } @@ -306,7 +311,8 @@ public static string GenerateErrorDetails(JsScriptException jsScriptException, throw new ArgumentNullException(nameof(jsScriptException)); } - StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder detailsBuilder = stringBuilderPool.Rent(); WriteCommonErrorDetails(detailsBuilder, jsScriptException, omitMessage); WriteScriptErrorDetails(detailsBuilder, jsScriptException); @@ -319,7 +325,7 @@ public static string GenerateErrorDetails(JsScriptException jsScriptException, detailsBuilder.TrimEnd(); string errorDetails = detailsBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(detailsBuilder); + stringBuilderPool.Return(detailsBuilder); return errorDetails; } @@ -338,7 +344,8 @@ public static string GenerateErrorDetails(JsRuntimeException jsRuntimeException, throw new ArgumentNullException(nameof(jsRuntimeException)); } - StringBuilder detailsBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder detailsBuilder = stringBuilderPool.Rent(); WriteCommonErrorDetails(detailsBuilder, jsRuntimeException, omitMessage); WriteScriptErrorDetails(detailsBuilder, jsRuntimeException); WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); @@ -346,7 +353,7 @@ public static string GenerateErrorDetails(JsRuntimeException jsRuntimeException, detailsBuilder.TrimEnd(); string errorDetails = detailsBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(detailsBuilder); + stringBuilderPool.Return(detailsBuilder); return errorDetails; } diff --git a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs index 16f01c6..a0b511b 100644 --- a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs @@ -1,8 +1,9 @@ using System; using System.Text; +using AdvancedStringBuilder; + using MsieJavaScriptEngine.Extensions; -using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.Helpers { @@ -64,7 +65,8 @@ public static string GetTextFragmentFromLine(string textLine, int columnNumber, endPart = ellipsisSymbol; } - StringBuilder fragmentBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder fragmentBuilder = stringBuilderPool.Rent(); if (startPart.Length > 0) { fragmentBuilder.Append(startPart); @@ -76,7 +78,7 @@ public static string GetTextFragmentFromLine(string textLine, int columnNumber, } fragment = fragmentBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(fragmentBuilder); + stringBuilderPool.Return(fragmentBuilder); } else { diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index 9ff2f72..7a72e7f 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -5,9 +5,10 @@ using System.Security.Permissions; #endif +using AdvancedStringBuilder; + using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; -using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine { @@ -152,12 +153,14 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont /// A string that represents the current exception public override string ToString() { - StringBuilder resultBuilder = StringBuilderPool.GetBuilder(); + string errorDetails = JsErrorHelpers.GenerateErrorDetails(this, true); + + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder resultBuilder = stringBuilderPool.Rent(); resultBuilder.Append(this.GetType().FullName); resultBuilder.Append(": "); resultBuilder.Append(this.Message); - string errorDetails = JsErrorHelpers.GenerateErrorDetails(this, true); if (errorDetails.Length > 0) { resultBuilder.AppendLine(); @@ -178,7 +181,7 @@ public override string ToString() } string result = resultBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(resultBuilder); + stringBuilderPool.Return(resultBuilder); return result; } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 24fbc6b..5d5bfad 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -9,6 +9,8 @@ #endif using System.Text; +using AdvancedStringBuilder; + using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Extensions; @@ -1067,7 +1069,8 @@ private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException origi if (originalMessage.ContainsQuotedValue(DllName.JScript9) && (isDllNotFound || originalMessage.ContainsQuotedValue("JsCreateRuntime"))) { - StringBuilder descriptionBuilder = StringBuilderPool.GetBuilder(); + var stringBuilderPool = StringBuilderPool.Shared; + StringBuilder descriptionBuilder = stringBuilderPool.Rent(); if (isDllNotFound) { descriptionBuilder.AppendFormat(CommonStrings.Engine_AssemblyNotRegistered, DllName.JScript9); @@ -1076,7 +1079,7 @@ private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException origi descriptionBuilder.AppendFormat(CommonStrings.Engine_IeInstallationRequired, LOWER_IE_VERSION); description = descriptionBuilder.ToString(); - StringBuilderPool.ReleaseBuilder(descriptionBuilder); + stringBuilderPool.Return(descriptionBuilder); message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index b67206e..5a3b496 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -11,7 +11,7 @@ ../../build/Key.snk true true - $(NoWarn);CS1591 + $(NoWarn);CS1591;NU5125 true true $(Product) @@ -25,7 +25,8 @@ git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Improved performance of debugging in ActiveScript modes; -2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class. +2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; +3. One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder. en-US ../../nuget true @@ -37,6 +38,7 @@ + diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index f56eb95..49c13e6 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -10,9 +10,6 @@ using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.JsRt.Edge; using MsieJavaScriptEngine.JsRt.Ie; -#if NET40 -using MsieJavaScriptEngine.Polyfills.System; -#endif using MsieJavaScriptEngine.Resources; using MsieJavaScriptEngine.Utilities; @@ -391,7 +388,11 @@ public PrecompiledScript PrecompileResource(string resourceName, Type type) ); } +#if NET40 + Assembly assembly = type.Assembly; +#else Assembly assembly = type.GetTypeInfo().Assembly; +#endif string nameSpace = type.Namespace; string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; @@ -813,7 +814,11 @@ public void ExecuteResource(string resourceName, Type type) ); } +#if NET40 + Assembly assembly = type.Assembly; +#else Assembly assembly = type.GetTypeInfo().Assembly; +#endif string nameSpace = type.Namespace; string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; diff --git a/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs deleted file mode 100644 index 33afcee..0000000 --- a/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfo.cs +++ /dev/null @@ -1,78 +0,0 @@ -#if NET40 -using System; -using System.Reflection; - -namespace MsieJavaScriptEngine.Polyfills.System.Reflection -{ - /// - /// Represents type declarations for class types, interface types, array types, value types, - /// enumeration types, type parameters, generic type definitions, and open - /// or closed constructed generic types. - /// - internal class TypeInfo - { - /// - /// Target type - /// - private readonly Type _type; - - /// - /// Gets a in which the type is declared. - /// For generic types, gets the in which the generic type is defined. - /// - public Assembly Assembly - { - get { return _type.Assembly; } - } - - /// - /// Gets a GUID associated with the type - /// - public Guid GUID - { - get { return _type.GUID; } - } - - /// - /// Gets a value indicating whether the current type is a generic type - /// - public bool IsGenericType - { - get { return _type.IsGenericType; } - } - - /// - /// Gets a value indicating whether the current type is a value type - /// - public bool IsValueType - { - get { return _type.IsValueType; } - } - - - /// - /// Constructs an instance of the representation of the specified type - /// - /// The type - public TypeInfo(Type type) - { - _type = type; - } - - - /// - /// Determines whether the specified object is an instance of the current type - /// - /// The object to compare with the current type - /// true if the current type is in the inheritance hierarchy of the object represented - /// by o, or if the current type is an interface that o supports. - /// false if neither of these conditions is the case, or if o is null, or if - /// the current type is an open generic type - /// (that is, System.Type.ContainsGenericParameters returns true). - public bool IsInstanceOfType(object o) - { - return _type.IsInstanceOfType(o); - } - } -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs b/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs deleted file mode 100644 index f4b45ee..0000000 --- a/src/MsieJavaScriptEngine/Polyfills/System/TypeExtensions.cs +++ /dev/null @@ -1,29 +0,0 @@ -#if NET40 -using System; - -using MsieJavaScriptEngine.Polyfills.System.Reflection; - -namespace MsieJavaScriptEngine.Polyfills.System -{ - /// - /// Type extensions - /// - internal static class TypeExtensions - { - /// - /// Returns the representation of the specified type - /// - /// The type to convert - /// The converted object - public static TypeInfo GetTypeInfo(this Type source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - - return new TypeInfo(source); - } - } -} -#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs b/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs deleted file mode 100644 index f84e501..0000000 --- a/src/MsieJavaScriptEngine/Utilities/StringBuilderPool.cs +++ /dev/null @@ -1,142 +0,0 @@ -using System; -using System.Text; -using System.Threading; - -namespace MsieJavaScriptEngine.Utilities -{ - /// - /// Pool of string builders - /// - internal static class StringBuilderPool - { - /// - /// Maximum capacity of builder - /// - const int MAX_BUILDER_CAPACITY = 8 * 1024; - - /// - /// Number of builders per processor - /// - const int BUILDER_COUNT_PER_PROCESSOR = 4; - - /// - /// First builder - /// - /// The first builder is stored in a dedicated field, because we expect - /// to be able to satisfy most requests from it. - private static StringBuilder _firstBuilder; - - /// - /// List of the remaining builders - /// - private static readonly StringBuilder[] _builders; - - - /// - /// Static constructor - /// - static StringBuilderPool() - { - int builderCount = Environment.ProcessorCount * BUILDER_COUNT_PER_PROCESSOR; - if (builderCount < 5) - { - builderCount = 5; - } - - _builders = new StringBuilder[builderCount - 1]; - } - - - /// - /// Gets a instance of string builder from the pool - /// - /// Instance of string builder - public static StringBuilder GetBuilder() - { - // Examine the first builder. - // If that fails, then `GetBuilderSlow` method will look at the remaining builders. - StringBuilder builder = _firstBuilder; - if (builder == null || builder != Interlocked.CompareExchange(ref _firstBuilder, null, builder)) - { - builder = GetBuilderSlow(); - } - - return builder; - } - - /// - /// Gets a instance of string builder with at least the given capacity from the pool - /// - /// If the capacity is less than or equal to our maximum capacity, then return builder from the pool. - /// Otherwise create a new string builder, that will just get discarded when released. - /// Capacity of string builder - /// Instance of string builder - public static StringBuilder GetBuilder(int capacity) - { - if (capacity <= MAX_BUILDER_CAPACITY) - { - return GetBuilder(); - } - - return new StringBuilder(capacity); - } - - private static StringBuilder GetBuilderSlow() - { - StringBuilder[] builders = _builders; - int builderCount = builders.Length; - - for (int builderIndex = 0; builderIndex < builderCount; builderIndex++) - { - StringBuilder builder = builders[builderIndex]; - if (builder != null) - { - if (builder == Interlocked.CompareExchange(ref builders[builderIndex], null, builder)) - { - return builder; - } - } - } - - return new StringBuilder(MAX_BUILDER_CAPACITY); - } - - /// - /// Returns a instance of string builder to the pool - /// - /// Instance of string builder - public static void ReleaseBuilder(StringBuilder builder) - { - if (builder == null || builder.Capacity > MAX_BUILDER_CAPACITY) - { - return; - } - - if (_firstBuilder == null) - { - builder.Clear(); - _firstBuilder = builder; - } - else - { - ReleaseBuilderSlow(builder); - } - } - - private static void ReleaseBuilderSlow(StringBuilder builder) - { - StringBuilder[] builders = _builders; - int builderCount = builders.Length; - - for (int builderIndex = 0; builderIndex < builderCount; builderIndex++) - { - if (builders[builderIndex] == null) - { - builder.Clear(); - builders[builderIndex] = builder; - break; - } - } - } - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 4d7879d..e40c5ec 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -8,10 +8,7 @@ using OriginalTypeConverter = System.ComponentModel.TypeConverter; using MsieJavaScriptEngine.Extensions; -#if NET40 -using MsieJavaScriptEngine.Polyfills.System; -#endif -#if NET40 || NETSTANDARD1_3 +#if NETSTANDARD1_3 using MsieJavaScriptEngine.Polyfills.System.Reflection; #endif using MsieJavaScriptEngine.Resources; @@ -193,7 +190,11 @@ private static bool InnerConvertObjectToType(object obj, Type type, bool throwOn } } +#if NET40 + if (type.IsInstanceOfType(obj)) +#else if (type.GetTypeInfo().IsInstanceOfType(obj)) +#endif { convertedObject = obj; return true; @@ -217,7 +218,11 @@ private static bool IsNonNullableValueType(Type type) return false; } +#if NET40 + Type typeInfo = type; +#else TypeInfo typeInfo = type.GetTypeInfo(); +#endif if (!typeInfo.IsValueType) { return false; diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index d827d44..15979a2 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -4,9 +4,6 @@ using System.Runtime.CompilerServices; using System.Text; -#if NET40 -using MsieJavaScriptEngine.Polyfills.System; -#endif using MsieJavaScriptEngine.Resources; namespace MsieJavaScriptEngine.Utilities @@ -62,7 +59,11 @@ public static string GetResourceAsString(string resourceName, Type type) ); } +#if NET40 + Assembly assembly = type.Assembly; +#else Assembly assembly = type.GetTypeInfo().Assembly; +#endif string nameSpace = type.Namespace; string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8636b49..4bcfbd0 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -23,7 +23,9 @@ ============= 1. Improved performance of debugging in ActiveScript modes; 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been - replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class. + replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; + 3. One part of the auxiliary code was removed, and other part moved to an + external library - AdvancedStringBuilder. ============ PROJECT SITE From 962eff06684de63d251ef6404a55bd603ce29a70 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Mon, 3 Dec 2018 22:23:14 +0300 Subject: [PATCH 143/238] In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl` --- .../JsRt/Edge/EdgeNativeMethods.cs | 175 ++++++++--------- .../JsRt/Ie/IeNativeMethods.cs | 177 +++++++++--------- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 5 +- 4 files changed, 189 insertions(+), 171 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index b7f037b..acb89f7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -10,285 +10,292 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// internal static class EdgeNativeMethods { +#if NETSTANDARD + private const CallingConvention DefaultCallingConvention = CallingConvention.Cdecl; +#else + private const CallingConvention DefaultCallingConvention = CallingConvention.StdCall; +#endif + + #region Hosting - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisposeRuntime(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(EdgeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(EdgeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRelease(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(EdgeJsRuntime runtime, out EdgeJsContext newContext); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetCurrentContext(out EdgeJsContext currentContext); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetCurrentContext(EdgeJsContext context); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntime(EdgeJsContext context, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetNullValue(out EdgeJsValue nullValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetTrueValue(out EdgeJsValue trueValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetFalseValue(out EdgeJsValue falseValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBooleanToBool(EdgeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToBoolean(EdgeJsValue value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetValueType(EdgeJsValue value, out JsValueType type); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIntToNumber(int intValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsNumberToInt(EdgeJsValue value, out int intValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPrototype(EdgeJsValue obj, out EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetPrototype(EdgeJsValue obj, EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExtensionAllowed(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStrictEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasExternalData(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExternalData(EdgeJsValue obj, out IntPtr externalData); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetExternalData(EdgeJsValue obj, IntPtr externalData); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRangeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateReferenceError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateSyntaxError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateTypeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateURIError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetAndClearException(out EdgeJsValue exception); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetException(EdgeJsValue exception); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 089c1a4..01e9711 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -11,289 +11,296 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// internal static class IeNativeMethods { +#if NETSTANDARD + private const CallingConvention DefaultCallingConvention = CallingConvention.Cdecl; +#else + private const CallingConvention DefaultCallingConvention = CallingConvention.StdCall; +#endif + + #region Hosting - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisposeRuntime(IeJsRuntime handle); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(IeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(IeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetCurrentContext(IeJsContext context); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetRuntime(IeJsContext context, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetNullValue(out IeJsValue nullValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetTrueValue(out IeJsValue trueValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetFalseValue(out IeJsValue falseValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsBooleanToBool(IeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToBoolean(IeJsValue value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetValueType(IeJsValue value, out JsValueType type); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out IeJsValue value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIntToNumber(int intValue, out IeJsValue value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsNumberToDouble(IeJsValue value, out double doubleValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToNumber(IeJsValue value, out IeJsValue numberValue); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPrototype(IeJsValue obj, out IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetPrototype(IeJsValue obj, IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExtensionAllowed(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDeleteIndexedProperty(IeJsValue obj, IeJsValue index); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsStrictEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasExternalData(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetExternalData(IeJsValue obj, out IntPtr externalData); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetExternalData(IeJsValue obj, IntPtr externalData); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateRangeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateReferenceError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateSyntaxError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateTypeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsCreateURIError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetAndClearException(out IeJsValue exception); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSetException(IeJsValue exception); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsDisableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsEnableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 5a3b496..81923c3 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -26,7 +26,8 @@ JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Improved performance of debugging in ActiveScript modes; 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; -3. One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder. +3. One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder; +4. In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl`. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 4bcfbd0..8ed9425 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -25,7 +25,10 @@ 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; 3. One part of the auxiliary code was removed, and other part moved to an - external library - AdvancedStringBuilder. + external library - AdvancedStringBuilder; + 4. In the `IeNativeMethods` and `EdgeNativeMethods` classes for the + `netstandard` targets was changed a calling convention from `StdCall` to + `Cdecl`. ============ PROJECT SITE From a2d69903c8c0cf25beb07ad15d6de52d0fac4e9d Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 4 Dec 2018 15:48:26 +0300 Subject: [PATCH 144/238] =?UTF-8?q?`TextHelpers`=20=D1=81lass=20became=20i?= =?UTF-8?q?nternal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/strong-name-signing.props | 7 +++++++ src/MsieJavaScriptEngine/Helpers/TextHelpers.cs | 4 ++-- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 4 +--- src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs | 8 ++++++++ .../MsieJavaScriptEngine.Test.Common.csproj | 1 + 5 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 build/strong-name-signing.props create mode 100644 src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs diff --git a/build/strong-name-signing.props b/build/strong-name-signing.props new file mode 100644 index 0000000..5130e09 --- /dev/null +++ b/build/strong-name-signing.props @@ -0,0 +1,7 @@ + + + ../../build/Key.snk + true + true + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs index a0b511b..19b15a7 100644 --- a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs @@ -10,7 +10,7 @@ namespace MsieJavaScriptEngine.Helpers /// /// Text helpers /// - public static class TextHelpers + internal static class TextHelpers { /// /// Array of characters used to find the next line break @@ -24,7 +24,7 @@ public static class TextHelpers /// Content of the text line /// Column number /// Maximum length of the text fragment - public static string GetTextFragmentFromLine(string textLine, int columnNumber, + internal static string GetTextFragmentFromLine(string textLine, int columnNumber, int maxFragmentLength = 100) { if (string.IsNullOrEmpty(textLine)) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 81923c3..5e0c12d 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -8,9 +8,6 @@ 1.6.0 Library true - ../../build/Key.snk - true - true $(NoWarn);CS1591;NU5125 true true @@ -37,6 +34,7 @@ + diff --git a/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2820a6c --- /dev/null +++ b/src/MsieJavaScriptEngine/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +using System.Runtime.CompilerServices; + +// Unit tests need access to internal members +[assembly: InternalsVisibleTo("MsieJavaScriptEngine.Test.Common, PublicKey=002400000480000094000000060200000024000052534131000400000100010031605c3b70d76b" + +"bb7e2afeccded26c52f66c4c7047c7a5b6a88301f54f1e91d5e5a08a9e36b0ad18a403f7894eda" + +"d58b014576963d6c6073e3df92eebadd1e9c6bc6c8fb3ad8b95e6358a0948a2fc5df0fa76553b5" + +"63c7584fc6fa22952bd24965f64877622d14559a3603879f8a746eaed0f2cb009dec5537770d94" + +"83e629a9")] \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 0ef60bf..55261ac 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -12,6 +12,7 @@ + From cb484ad53b766a68265cc0d0673ffe09e8f0e0a7 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 4 Dec 2018 16:29:42 +0300 Subject: [PATCH 145/238] Unnecessary `CharSet` properties have been removed from the `DllImport` attribute --- .../JsRt/Edge/EdgeNativeMethods.cs | 154 ++++++++--------- .../JsRt/Ie/IeNativeMethods.cs | 156 +++++++++--------- 2 files changed, 155 insertions(+), 155 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index acb89f7..a57b164 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -41,261 +41,261 @@ internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] b [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDisposeRuntime(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(EdgeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(EdgeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsRelease(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateContext(EdgeJsRuntime runtime, out EdgeJsContext newContext); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetCurrentContext(out EdgeJsContext currentContext); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetCurrentContext(EdgeJsContext context); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntime(EdgeJsContext context, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStartDebugging(); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetNullValue(out EdgeJsValue nullValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetTrueValue(out EdgeJsValue trueValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetFalseValue(out EdgeJsValue falseValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsBooleanToBool(EdgeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToBoolean(EdgeJsValue value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetValueType(EdgeJsValue value, out JsValueType type); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIntToNumber(int intValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsNumberToInt(EdgeJsValue value, out int intValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetPrototype(EdgeJsValue obj, out EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetPrototype(EdgeJsValue obj, EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetExtensionAllowed(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStrictEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasExternalData(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetExternalData(EdgeJsValue obj, out IntPtr externalData); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetExternalData(EdgeJsValue obj, IntPtr externalData); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateRangeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateReferenceError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateSyntaxError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateTypeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateURIError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetAndClearException(out EdgeJsValue exception); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetException(EdgeJsValue exception); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDisableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsEnableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 01e9711..a035d6f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -42,265 +42,265 @@ internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] b [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDisposeRuntime(IeJsRuntime handle); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(IeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(IeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsAddRef")] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode, EntryPoint = "JsRelease")] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetCurrentContext(IeJsContext context); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetRuntime(IeJsContext context, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetNullValue(out IeJsValue nullValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetTrueValue(out IeJsValue trueValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetFalseValue(out IeJsValue falseValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsBooleanToBool(IeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToBoolean(IeJsValue value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetValueType(IeJsValue value, out JsValueType type); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIntToNumber(int intValue, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsNumberToDouble(IeJsValue value, out double doubleValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToNumber(IeJsValue value, out IeJsValue numberValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetPrototype(IeJsValue obj, out IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetPrototype(IeJsValue obj, IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetExtensionAllowed(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDeleteIndexedProperty(IeJsValue obj, IeJsValue index); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsStrictEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasExternalData(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetExternalData(IeJsValue obj, out IntPtr externalData); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetExternalData(IeJsValue obj, IntPtr externalData); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateRangeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateReferenceError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateSyntaxError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateTypeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsCreateURIError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsGetAndClearException(out IeJsValue exception); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsSetException(IeJsValue exception); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsDisableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsEnableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file From 54987375b7d42961ec8fe6a3e697373d46a6dc4a Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 4 Dec 2018 16:41:09 +0300 Subject: [PATCH 146/238] Changed a sorting of properties of the `DllImport` attribute --- src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs | 4 ++-- src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index a57b164..072b510 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -81,13 +81,13 @@ internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRu internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, EntryPoint = "JsAddRef")] + [DllImport(DllName.Chakra, EntryPoint = "JsAddRef", CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, EntryPoint = "JsRelease")] + [DllImport(DllName.Chakra, EntryPoint = "JsRelease", CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index a035d6f..2448859 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -82,13 +82,13 @@ internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRunt internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, EntryPoint = "JsAddRef")] + [DllImport(DllName.JScript9, EntryPoint = "JsAddRef", CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, EntryPoint = "JsRelease")] + [DllImport(DllName.JScript9, EntryPoint = "JsRelease", CallingConvention = DefaultCallingConvention)] internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] From c374c84102cc1966256e19ce25181924b0565064 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 4 Dec 2018 17:18:34 +0300 Subject: [PATCH 147/238] Updated a dependencies in test projects --- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 6 +++--- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index e0f5f32..6387d0a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index f0b4a90..2940081 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index c6a8ad2..94f058b 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 6284a1f..a2dae58 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -18,7 +18,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 153ef60..96b7af6 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -17,7 +17,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 55261ac..8c73011 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -15,7 +15,7 @@ - + @@ -25,8 +25,8 @@ - - + + From 9664fa7e160014917ee9adc4ff4ae7e9379b7381 Mon Sep 17 00:00:00 2001 From: Andrey Taritsyn Date: Tue, 4 Dec 2018 17:42:06 +0300 Subject: [PATCH 148/238] Version 3.0.0 RC 2 --- CHANGELOG.md | 6 ++++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 15 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caead31..02867ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Change log ========== +## v3.0.0 RC 2 - December 4, 2018 + * Improved performance of debugging in ActiveScript modes + * `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class + * One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder + * In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl` + ## v3.0.0 RC 1 - September 18, 2018 * In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB) * JSON2 library was updated to version of June 12, 2017 diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 5e0c12d..9951b38 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.0.0 - rc1 + rc2 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8ed9425..e30f0dc 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 RC 1 + README file for MSIE JavaScript Engine for .NET v3.0.0 RC 2 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index eeb15db..4aee762 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.0 - rc1 + rc2 net46;netcoreapp2.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 6387d0a..26c3eb5 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - rc1 + rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 2940081..56252fa 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - rc1 + rc2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 94f058b..4d239ef 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - rc1 + rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index a2dae58..85a9043 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - rc1 + rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 96b7af6..3c6b8df 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - rc1 + rc2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 8c73011..e3ee61b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - rc1 + rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library From ae27bbcb448ade273adacf1ff5f5a80dff1db6cf Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 18:30:26 +0300 Subject: [PATCH 149/238] Prevents a early destruction of pre-compiled scripts by the garbage collector --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 4 + .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 4 + .../JsExecutionBenchmark.cs | 2 +- .../PrecompilationTestsBase.cs | 221 ++++++------------ 4 files changed, 78 insertions(+), 153 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 3f95af2..b22134c 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1140,6 +1140,10 @@ public override void Execute(PrecompiledScript precompiledScript) { throw WrapJsException(e); } + finally + { + GC.KeepAlive(precompiledScript); + } } }); } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 5d5bfad..ac95080 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1208,6 +1208,10 @@ public override void Execute(PrecompiledScript precompiledScript) { throw WrapJsException(e); } + finally + { + GC.KeepAlive(precompiledScript); + } } }); } diff --git a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs index d4abe63..d67f18f 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs @@ -172,7 +172,7 @@ private static void TransliterateStrings(Func createJsEngine, bool } // Assert - for (int itemIndex = 1; itemIndex < ItemCount; itemIndex++) + for (int itemIndex = 0; itemIndex < ItemCount; itemIndex++) { Assert.Equal(_targetOutputStrings[itemIndex], outputStrings[itemIndex]); } diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index c8cab6a..c3eeaf5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -1,5 +1,6 @@ using System.IO; using System.Reflection; +using System.Threading.Tasks; using NUnit.Framework; @@ -45,28 +46,16 @@ function declinationOfSeconds(number) { return declensionOfNumerals(number, ['секунда', 'секунды', 'секунд']); }"; const string functionName = "declinationOfSeconds"; + const int itemCount = 4; - const int input0 = 0; - const string targetOutput0 = "секунд"; - - const int input1 = 1; - const string targetOutput1 = "секунда"; - - const int input2 = 42; - const string targetOutput2 = "секунды"; - - const int input3 = 600; - const string targetOutput3 = "секунд"; + int[] inputSeconds = new int[itemCount] { 0, 1, 42, 600 }; + string[] targetOutputStrings = new string[itemCount] { "секунд", "секунда", "секунды", "секунд" }; + string[] outputStrings = new string[itemCount]; // Act bool supportsScriptPrecompilation = false; PrecompiledScript precompiledCode = null; - string output0 = string.Empty; - string output1 = string.Empty; - string output2 = string.Empty; - string output3 = string.Empty; - using (var jsEngine = CreateJsEngine()) { supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; @@ -75,38 +64,29 @@ function declinationOfSeconds(number) { precompiledCode = jsEngine.Precompile(libraryCode, "declinationOfSeconds.js"); jsEngine.Execute(precompiledCode); - output0 = jsEngine.CallFunction(functionName, input0); + outputStrings[0] = jsEngine.CallFunction(functionName, inputSeconds[0]); } } if (supportsScriptPrecompilation) { - using (var firstJsEngine = CreateJsEngine()) - { - firstJsEngine.Execute(precompiledCode); - output1 = firstJsEngine.CallFunction(functionName, input1); - } - - using (var secondJsEngine = CreateJsEngine()) - { - secondJsEngine.Execute(precompiledCode); - output2 = secondJsEngine.CallFunction(functionName, input2); - } - - using (var thirdJsEngine = CreateJsEngine()) - { - thirdJsEngine.Execute(precompiledCode); - output3 = thirdJsEngine.CallFunction(functionName, input3); - } + Parallel.For(1, itemCount, itemIndex => + { + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(precompiledCode); + outputStrings[itemIndex] = jsEngine.CallFunction(functionName, inputSeconds[itemIndex]); + } + }); } // Assert if (supportsScriptPrecompilation) { - Assert.AreEqual(targetOutput0, output0); - Assert.AreEqual(targetOutput1, output1); - Assert.AreEqual(targetOutput2, output2); - Assert.AreEqual(targetOutput3, output3); + for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) + { + Assert.AreEqual(targetOutputStrings[itemIndex], outputStrings[itemIndex]); + } } } @@ -116,28 +96,16 @@ public virtual void ExecutionOfPrecompiledFileIsCorrect() // Arrange string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/declinationOfMinutes.js")); const string functionName = "declinationOfMinutes"; + const int itemCount = 4; - const int input0 = 0; - const string targetOutput0 = "минут"; - - const int input1 = 1; - const string targetOutput1 = "минута"; - - const int input2 = 22; - const string targetOutput2 = "минуты"; - - const int input3 = 88; - const string targetOutput3 = "минут"; + int[] inputMinutes = new int[itemCount] { 0, 1, 22, 88 }; + string[] targetOutputStrings = new string[itemCount] { "минут", "минута", "минуты", "минут" }; + string[] outputStrings = new string[itemCount]; // Act bool supportsScriptPrecompilation = false; PrecompiledScript precompiledFile = null; - string output0 = string.Empty; - string output1 = string.Empty; - string output2 = string.Empty; - string output3 = string.Empty; - using (var jsEngine = CreateJsEngine()) { supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; @@ -146,38 +114,29 @@ public virtual void ExecutionOfPrecompiledFileIsCorrect() precompiledFile = jsEngine.PrecompileFile(filePath); jsEngine.Execute(precompiledFile); - output0 = jsEngine.CallFunction(functionName, input0); + outputStrings[0] = jsEngine.CallFunction(functionName, inputMinutes[0]); } } if (supportsScriptPrecompilation) { - using (var firstJsEngine = CreateJsEngine()) - { - firstJsEngine.Execute(precompiledFile); - output1 = firstJsEngine.CallFunction(functionName, input1); - } - - using (var secondJsEngine = CreateJsEngine()) - { - secondJsEngine.Execute(precompiledFile); - output2 = secondJsEngine.CallFunction(functionName, input2); - } - - using (var thirdJsEngine = CreateJsEngine()) - { - thirdJsEngine.Execute(precompiledFile); - output3 = thirdJsEngine.CallFunction(functionName, input3); - } + Parallel.For(1, itemCount, itemIndex => + { + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(precompiledFile); + outputStrings[itemIndex] = jsEngine.CallFunction(functionName, inputMinutes[itemIndex]); + } + }); } // Assert if (supportsScriptPrecompilation) { - Assert.AreEqual(targetOutput0, output0); - Assert.AreEqual(targetOutput1, output1); - Assert.AreEqual(targetOutput2, output2); - Assert.AreEqual(targetOutput3, output3); + for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) + { + Assert.AreEqual(targetOutputStrings[itemIndex], outputStrings[itemIndex]); + } } } @@ -187,28 +146,16 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndTypeIsCorrect() // Arrange const string resourceName = "Resources.declinationOfHours.js"; const string functionName = "declinationOfHours"; + const int itemCount = 4; - const int input0 = 0; - const string targetOutput0 = "часов"; - - const int input1 = 1; - const string targetOutput1 = "час"; - - const int input2 = 24; - const string targetOutput2 = "часа"; - - const int input3 = 48; - const string targetOutput3 = "часов"; + int[] inputHours = new int[itemCount] { 0, 1, 24, 48 }; + string[] targetOutputStrings = new string[itemCount] { "часов", "час", "часа", "часов" }; + string[] outputStrings = new string[itemCount]; // Act bool supportsScriptPrecompilation = false; PrecompiledScript precompiledResource = null; - string output0 = string.Empty; - string output1 = string.Empty; - string output2 = string.Empty; - string output3 = string.Empty; - using (var jsEngine = CreateJsEngine()) { supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; @@ -217,38 +164,29 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndTypeIsCorrect() precompiledResource = jsEngine.PrecompileResource(resourceName, typeof(PrecompilationTestsBase)); jsEngine.Execute(precompiledResource); - output0 = jsEngine.CallFunction(functionName, input0); + outputStrings[0] = jsEngine.CallFunction(functionName, inputHours[0]); } } if (supportsScriptPrecompilation) { - using (var firstJsEngine = CreateJsEngine()) - { - firstJsEngine.Execute(precompiledResource); - output1 = firstJsEngine.CallFunction(functionName, input1); - } - - using (var secondJsEngine = CreateJsEngine()) - { - secondJsEngine.Execute(precompiledResource); - output2 = secondJsEngine.CallFunction(functionName, input2); - } - - using (var thirdJsEngine = CreateJsEngine()) - { - thirdJsEngine.Execute(precompiledResource); - output3 = thirdJsEngine.CallFunction(functionName, input3); - } + Parallel.For(1, itemCount, itemIndex => + { + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(precompiledResource); + outputStrings[itemIndex] = jsEngine.CallFunction(functionName, inputHours[itemIndex]); + } + }); } // Assert if (supportsScriptPrecompilation) { - Assert.AreEqual(targetOutput0, output0); - Assert.AreEqual(targetOutput1, output1); - Assert.AreEqual(targetOutput2, output2); - Assert.AreEqual(targetOutput3, output3); + for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) + { + Assert.AreEqual(targetOutputStrings[itemIndex], outputStrings[itemIndex]); + } } } @@ -258,28 +196,16 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndAssemblyIsCorrect() // Arrange const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.declinationOfDays.js"; const string functionName = "declinationOfDays"; + const int itemCount = 4; - const int input0 = 0; - const string targetOutput0 = "дней"; - - const int input1 = 1; - const string targetOutput1 = "день"; - - const int input2 = 3; - const string targetOutput2 = "дня"; - - const int input3 = 80; - const string targetOutput3 = "дней"; + int[] inputDays = new int[itemCount] { 0, 1, 3, 80 }; + string[] targetOutputStrings = new string[itemCount] { "дней", "день", "дня", "дней" }; + string[] outputStrings = new string[itemCount]; // Act bool supportsScriptPrecompilation = false; PrecompiledScript precompiledResource = null; - string output0 = string.Empty; - string output1 = string.Empty; - string output2 = string.Empty; - string output3 = string.Empty; - using (var jsEngine = CreateJsEngine()) { supportsScriptPrecompilation = jsEngine.SupportsScriptPrecompilation; @@ -293,38 +219,29 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndAssemblyIsCorrect() ); jsEngine.Execute(precompiledResource); - output0 = jsEngine.CallFunction(functionName, input0); + outputStrings[0] = jsEngine.CallFunction(functionName, inputDays[0]); } } if (supportsScriptPrecompilation) { - using (var firstJsEngine = CreateJsEngine()) - { - firstJsEngine.Execute(precompiledResource); - output1 = firstJsEngine.CallFunction(functionName, input1); - } - - using (var secondJsEngine = CreateJsEngine()) - { - secondJsEngine.Execute(precompiledResource); - output2 = secondJsEngine.CallFunction(functionName, input2); - } - - using (var thirdJsEngine = CreateJsEngine()) - { - thirdJsEngine.Execute(precompiledResource); - output3 = thirdJsEngine.CallFunction(functionName, input3); - } + Parallel.For(1, itemCount, itemIndex => + { + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(precompiledResource); + outputStrings[itemIndex] = jsEngine.CallFunction(functionName, inputDays[itemIndex]); + } + }); } // Assert if (supportsScriptPrecompilation) { - Assert.AreEqual(targetOutput0, output0); - Assert.AreEqual(targetOutput1, output1); - Assert.AreEqual(targetOutput2, output2); - Assert.AreEqual(targetOutput3, output3); + for (int itemIndex = 0; itemIndex < itemCount; itemIndex++) + { + Assert.AreEqual(targetOutputStrings[itemIndex], outputStrings[itemIndex]); + } } } From 852efc366be0f90c76ccfadfa04c91ca129d562d Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 18:45:51 +0300 Subject: [PATCH 150/238] From the `IeNativeMethods` and `EdgeNativeMethods` classes was removed a explicit calling convention --- .../JsRt/Edge/EdgeNativeMethods.cs | 175 +++++++++-------- .../JsRt/Ie/IeNativeMethods.cs | 177 +++++++++--------- 2 files changed, 169 insertions(+), 183 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 072b510..9c030a5 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -10,292 +10,285 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// internal static class EdgeNativeMethods { -#if NETSTANDARD - private const CallingConvention DefaultCallingConvention = CallingConvention.Cdecl; -#else - private const CallingConvention DefaultCallingConvention = CallingConvention.StdCall; -#endif - - #region Hosting - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out EdgeJsPropertyId propertyId); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetPropertyNameFromId(EdgeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.Chakra, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out EdgeJsValue stringValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsStringToPointer(EdgeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsThreadServiceCallback threadService, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCollectGarbage(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDisposeRuntime(EdgeJsRuntime handle); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(EdgeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(EdgeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(EdgeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.Chakra, EntryPoint = "JsAddRef", CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsAddRef(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, EntryPoint = "JsRelease", CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(EdgeJsContext reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsRelease(EdgeJsValue reference, out uint count); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateContext(EdgeJsRuntime runtime, out EdgeJsContext newContext); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetCurrentContext(out EdgeJsContext currentContext); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetCurrentContext(EdgeJsContext context); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetRuntime(EdgeJsContext context, out EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsStartDebugging(); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetUndefinedValue(out EdgeJsValue undefinedValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetNullValue(out EdgeJsValue nullValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetTrueValue(out EdgeJsValue trueValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetFalseValue(out EdgeJsValue falseValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsBooleanToBool(EdgeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToBoolean(EdgeJsValue value, out EdgeJsValue booleanValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetValueType(EdgeJsValue value, out JsValueType type); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsIntToNumber(int intValue, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsNumberToDouble(EdgeJsValue value, out double doubleValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsNumberToInt(EdgeJsValue value, out int intValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToNumber(EdgeJsValue value, out EdgeJsValue numberValue); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetStringLength(EdgeJsValue sringValue, out int length); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateObject(out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetPrototype(EdgeJsValue obj, out EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetPrototype(EdgeJsValue obj, EdgeJsValue prototypeObject); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetExtensionAllowed(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsPreventExtension(EdgeJsValue obj); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(EdgeJsValue obj, EdgeJsPropertyId propertyId, out EdgeJsValue propertyDescriptor); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetOwnPropertyNames(EdgeJsValue obj, out EdgeJsValue propertyNames); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue value, bool useStrictRules); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsHasProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDeleteProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, bool useStrictRules, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDefineProperty(EdgeJsValue obj, EdgeJsPropertyId propertyId, EdgeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsHasIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetIndexedProperty(EdgeJsValue obj, EdgeJsValue index, EdgeJsValue value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDeleteIndexedProperty(EdgeJsValue obj, EdgeJsValue index); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsStrictEquals(EdgeJsValue obj1, EdgeJsValue obj2, out bool result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsHasExternalData(EdgeJsValue obj, out bool value); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetExternalData(EdgeJsValue obj, out IntPtr externalData); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetExternalData(EdgeJsValue obj, IntPtr externalData); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateArray(uint length, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCallFunction(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConstructObject(EdgeJsValue function, EdgeJsValue[] arguments, ushort argumentCount, out EdgeJsValue result); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateFunction(EdgeJsNativeFunction nativeFunction, IntPtr externalData, out EdgeJsValue function); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateRangeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateReferenceError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateSyntaxError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateTypeError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateURIError(EdgeJsValue message, out EdgeJsValue error); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetAndClearException(out EdgeJsValue exception); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsSetException(EdgeJsValue exception); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsDisableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsEnableRuntimeExecution(EdgeJsRuntime runtime); - [DllImport(DllName.Chakra, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(EdgeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 2448859..88c7676 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -11,296 +11,289 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// internal static class IeNativeMethods { -#if NETSTANDARD - private const CallingConvention DefaultCallingConvention = CallingConvention.Cdecl; -#else - private const CallingConvention DefaultCallingConvention = CallingConvention.StdCall; -#endif - - #region Hosting - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunScript(string script, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsSerializeScript(string script, byte[] buffer, ref uint bufferSize); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsParseSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsRunSerializedScript(string script, byte[] buffer, JsSourceContext sourceContext, string sourceUrl, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsGetPropertyIdFromName(string name, out IeJsPropertyId propertyId); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetPropertyNameFromId(IeJsPropertyId propertyId, out IntPtr buffer); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention, CharSet = CharSet.Unicode)] + [DllImport(DllName.JScript9, CharSet = CharSet.Unicode)] internal static extern JsErrorCode JsPointerToString(string value, UIntPtr stringLength, out IeJsValue stringValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsStringToPointer(IeJsValue value, out IntPtr stringValue, out UIntPtr stringLength); #endregion - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateRuntime(JsRuntimeAttributes attributes, JsRuntimeVersion runtimeVersion, JsThreadServiceCallback threadService, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCollectGarbage(IeJsRuntime handle); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDisposeRuntime(IeJsRuntime handle); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetRuntimeMemoryUsage(IeJsRuntime runtime, out UIntPtr memoryUsage); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetRuntimeMemoryLimit(IeJsRuntime runtime, out UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetRuntimeMemoryLimit(IeJsRuntime runtime, UIntPtr memoryLimit); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetRuntimeMemoryAllocationCallback(IeJsRuntime runtime, IntPtr callbackState, JsMemoryAllocationCallback allocationCallback); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(IeJsRuntime runtime, IntPtr callbackState, JsBeforeCollectCallback beforeCollectCallback); - [DllImport(DllName.JScript9, EntryPoint = "JsAddRef", CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9, EntryPoint = "JsAddRef")] internal static extern JsErrorCode JsContextAddRef(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsAddRef(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, EntryPoint = "JsRelease", CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9, EntryPoint = "JsRelease")] internal static extern JsErrorCode JsContextRelease(IeJsContext reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsRelease(IeJsValue reference, out uint count); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication64 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugApplication32 debugSite, out IeJsContext newContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetCurrentContext(out IeJsContext currentContext); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetCurrentContext(IeJsContext context); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetRuntime(IeJsContext context, out IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication64 debugApplication); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsStartDebugging(IDebugApplication32 debugApplication); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsIdle(out uint nextIdleTick); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetUndefinedValue(out IeJsValue undefinedValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetNullValue(out IeJsValue nullValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetTrueValue(out IeJsValue trueValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetFalseValue(out IeJsValue falseValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsBoolToBoolean(bool value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsBooleanToBool(IeJsValue booleanValue, out bool boolValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToBoolean(IeJsValue value, out IeJsValue booleanValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetValueType(IeJsValue value, out JsValueType type); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDoubleToNumber(double doubleValue, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsIntToNumber(int intValue, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsNumberToDouble(IeJsValue value, out double doubleValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToNumber(IeJsValue value, out IeJsValue numberValue); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetStringLength(IeJsValue sringValue, out int length); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); #if !NETSTANDARD - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [MarshalAs(UnmanagedType.Struct)] out object var); #endif - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateObject(out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetPrototype(IeJsValue obj, out IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetPrototype(IeJsValue obj, IeJsValue prototypeObject); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetExtensionAllowed(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsPreventExtension(IeJsValue obj); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetProperty(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetOwnPropertyDescriptor(IeJsValue obj, IeJsPropertyId propertyId, out IeJsValue propertyDescriptor); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetOwnPropertyNames(IeJsValue obj, out IeJsValue propertyNames); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue value, bool useStrictRules); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsHasProperty(IeJsValue obj, IeJsPropertyId propertyId, out bool hasProperty); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDeleteProperty(IeJsValue obj, IeJsPropertyId propertyId, bool useStrictRules, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDefineProperty(IeJsValue obj, IeJsPropertyId propertyId, IeJsValue propertyDescriptor, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsHasIndexedProperty(IeJsValue obj, IeJsValue index, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetIndexedProperty(IeJsValue obj, IeJsValue index, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetIndexedProperty(IeJsValue obj, IeJsValue index, IeJsValue value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDeleteIndexedProperty(IeJsValue obj, IeJsValue index); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsStrictEquals(IeJsValue obj1, IeJsValue obj2, out bool result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsHasExternalData(IeJsValue obj, out bool value); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetExternalData(IeJsValue obj, out IntPtr externalData); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetExternalData(IeJsValue obj, IntPtr externalData); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateArray(uint length, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCallFunction(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConstructObject(IeJsValue function, IeJsValue[] arguments, ushort argumentCount, out IeJsValue result); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateFunction(IeJsNativeFunction nativeFunction, IntPtr externalData, out IeJsValue function); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateRangeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateReferenceError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateSyntaxError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateTypeError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateURIError(IeJsValue message, out IeJsValue error); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsHasException(out bool hasException); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetAndClearException(out IeJsValue exception); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsSetException(IeJsValue exception); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsDisableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsEnableRuntimeExecution(IeJsRuntime runtime); - [DllImport(DllName.JScript9, CallingConvention = DefaultCallingConvention)] + [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsIsRuntimeExecutionDisabled(IeJsRuntime runtime, out bool isDisabled); } } \ No newline at end of file From 350217ae783755df7ea24328b37cef0a23adc4ed Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 19:44:05 +0300 Subject: [PATCH 151/238] Updated a dependencies in test projects --- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index e3ee61b..a63aeb1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -26,7 +26,7 @@ - + From 58f5e98abd1ac4df526f38fcb242141e7d9a2f5f Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 19:46:39 +0300 Subject: [PATCH 152/238] LICENSE.md -> LICENSE.txt --- LICENSE.md => LICENSE.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename LICENSE.md => LICENSE.txt (100%) diff --git a/LICENSE.md b/LICENSE.txt similarity index 100% rename from LICENSE.md rename to LICENSE.txt From c687263d269c9eff5afc2ed1b7b1eec62a8079ab Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 20:06:38 +0300 Subject: [PATCH 153/238] PackageLicenseUrl -> PackageLicenseFile --- LICENSE.txt | 40 +++++++------------ .../MsieJavaScriptEngine.csproj | 7 +++- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 884ed24..22d2a50 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,5 +1,18 @@ Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -175,29 +188,4 @@ incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 9951b38..43a17ee 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -14,7 +14,7 @@ $(Product) Andrey Taritsyn This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). - https://github.com/Taritsyn/MsieJavaScriptEngine/blob/master/LICENSE.md + LICENSE.txt false https://github.com/Taritsyn/MsieJavaScriptEngine http://i.imgur.com/cbiHK.png @@ -62,6 +62,11 @@ readme.txt true + + $(PackageLicenseFile) + true + false + / true From 632168cd0be4798b8b803136485bd3e9afaf767e Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 22:12:13 +0300 Subject: [PATCH 154/238] Version 3.0.0 --- CHANGELOG.md | 17 ++++++- README.md | 44 +++++++++++++++---- global.json | 2 +- .../MsieJavaScriptEngine.csproj | 18 +++++--- src/MsieJavaScriptEngine/readme.txt | 36 +++++++++++---- .../MsieJavaScriptEngine.Benchmarks.csproj | 1 - .../MsieJavaScriptEngine.Test.Auto.csproj | 1 - ...criptEngine.Test.ChakraActiveScript.csproj | 1 - ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 1 - ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 1 - .../MsieJavaScriptEngine.Test.Classic.csproj | 1 - .../MsieJavaScriptEngine.Test.Common.csproj | 1 - 12 files changed, 92 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 02867ce..1bf35a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,25 @@ Change log ========== +## v3.0.0 - December 24, 2018 + * Format of the error messages was unified + * Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException`, `JsInterruptedException`, `JsScriptException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class. + * In the `JsException` class was added two new properties: `Category` and `Description` + * From the `JsRuntimeException` class was removed one property - `ErrorCode` + * In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack` + * `JsEngineLoadException` class now is inherited from the `JsEngineException` class + * `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails` + * One part of the auxiliary code was removed, and other part moved to an external library - [AdvancedStringBuilder](https://github.com/Taritsyn/AdvancedStringBuilder) + * Added a ability to interrupt execution of the script + * In JsRT modes added a ability to pre-compile scripts + * In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and four new methods: `Interrupt`, `Precompile`, `PrecompileFile` and `PrecompileResource` + * In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB) + * Added support of .NET Standard 2.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes) + ## v3.0.0 RC 2 - December 4, 2018 * Improved performance of debugging in ActiveScript modes * `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class - * One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder + * One part of the auxiliary code was removed, and other part moved to an external library - [AdvancedStringBuilder](https://github.com/Taritsyn/AdvancedStringBuilder) * In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl` ## v3.0.0 RC 1 - September 18, 2018 diff --git a/README.md b/README.md index 1e5e63f..0464f0e 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,13 @@ This library can be installed through NuGet - [http://nuget.org/packages/MsieJav Consider a simple example of usage of the MSIE JavaScript Engine: ```csharp -namespace MsieJavaScriptEngine.Example.Console -{ - using System; +using System; - using MsieJavaScriptEngine; - using MsieJavaScriptEngine.Helpers; +using MsieJavaScriptEngine; +using MsieJavaScriptEngine.Helpers; +namespace MsieJavaScriptEngine.Example.Console +{ class Program { static void Main(string[] args) @@ -56,9 +56,15 @@ namespace MsieJavaScriptEngine.Example.Console Console.WriteLine(); Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); } - catch (JsRuntimeException e) + catch (JsScriptException e) + { + Console.WriteLine("During processing of JavaScript code an error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); + } + catch (JsException e) { - Console.WriteLine("During execution of JavaScript code an error occurred."); + Console.WriteLine("During working of JavaScript engine an unknown error occurred."); Console.WriteLine(); Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); } @@ -71,7 +77,18 @@ namespace MsieJavaScriptEngine.Example.Console First we create an instance of the MsieJsEngine class. Then we evaluate a JavaScript expression by using of the `Evaluate` method and output its result to the console. -In addition, we provide handling of the following exception types: JsEngineLoadException and JsRuntimeException. +In addition, we provide handling of the following exception types: JsEngineLoadException, JsScriptException and JsException. +In the MSIE JavaScript Engine, exceptions have the following hierarchy: + + * JsException + * JsEngineException + * JsEngineLoadException + * JsFatalException + * JsScriptException + * JsCompilationException + * JsRuntimeException + * JsInterruptedException + * JsUsageException Also, when you create an instance of the MsieJsEngine class, then you can pass the JavaScript engine settings via the constructor. Consider in detail properties of the JsEngineSettings class: @@ -98,6 +115,15 @@ Consider in detail properties of the + MaxStackSize + Int32 + 503 808 or 1 007 616 + +

    Maximum stack size in bytes.

    +

    Set a 0 to use the default maximum stack size specified in the header for the executable.

    + + UseEcmaScript5Polyfill Boolean @@ -138,4 +164,4 @@ If you use the MSIE JavaScript Engine in some project, please send me a message * [PowerShell.JS](http://github.com/klumsy/powershellJS) by Karl Prosser * [Serenity Application Platform](http://github.com/volkanceylan/Serenity) by Volkan Ceylan * [SquishIt](http://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Ullrich - * [Strike](http://github.com/SimonCropp/Strike) by Simon Cropp + * [Strike](http://github.com/SimonCropp/Strike) by Simon Cropp \ No newline at end of file diff --git a/global.json b/global.json index 054926a..7e7134f 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.1.500" + "version": "2.2.101" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 43a17ee..54c2731 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine for .NET 3.0.0 - rc2 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 Library @@ -21,10 +20,19 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Improved performance of debugging in ActiveScript modes; -2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; -3. One part of the auxiliary code was removed, and other part moved to an external library - AdvancedStringBuilder; -4. In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl`. + 1. Format of the error messages was unified; +2. Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException`, `JsInterruptedException`, `JsScriptException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class; +3. In the `JsException` class was added two new properties: `Category` and `Description`; +4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; +5. In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack`; +6. `JsEngineLoadException` class now is inherited from the `JsEngineException` class; +7. `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails`; +8. One part of the auxiliary code was removed, and other part moved to an external library - [AdvancedStringBuilder](https://github.com/Taritsyn/AdvancedStringBuilder); +9. Added a ability to interrupt execution of the script; +10. In JsRT modes added a ability to pre-compile scripts; +11. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and four new methods: `Interrupt`, `Precompile`, `PrecompileFile` and `PrecompileResource`; +12. In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB); +13. Added support of .NET Standard 2.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes). en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index e30f0dc..3721763 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 RC 2 + README file for MSIE JavaScript Engine for .NET v3.0.0 -------------------------------------------------------------------------------- @@ -21,14 +21,32 @@ ============= RELEASE NOTES ============= - 1. Improved performance of debugging in ActiveScript modes; - 2. `GetSourceFragmentFromLine` method of `JsErrorHelpers` class has been - replaced by the `GetTextFragmentFromLine` method of `TextHelpers` class; - 3. One part of the auxiliary code was removed, and other part moved to an - external library - AdvancedStringBuilder; - 4. In the `IeNativeMethods` and `EdgeNativeMethods` classes for the - `netstandard` targets was changed a calling convention from `StdCall` to - `Cdecl`. + 1. Format of the error messages was unified; + 2. Created a new exception classes: `JsCompilationException`, + `JsEngineException`, `JsFatalException`, `JsInterruptedException`, + `JsScriptException` and `JsUsageException`. These exceptions are responsible + for handling errors, some of which were previously handled by the + `JsRuntimeException` class; + 3. In the `JsException` class was added two new properties: `Category` and + `Description`; + 4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; + 5. In the `JsRuntimeException` class was added three new properties: `Type`, + `DocumentName` and `CallStack`; + 6. `JsEngineLoadException` class now is inherited from the `JsEngineException` + class; + 7. `Format` method of the `JsErrorHelpers` class was renamed to the + `GenerateErrorDetails`; + 8. One part of the auxiliary code was removed, and other part moved to an + external library - AdvancedStringBuilder; + 9. Added a ability to interrupt execution of the script; + 10. In JsRT modes added a ability to pre-compile scripts; + 11. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property + and four new methods: `Interrupt`, `Precompile`, `PrecompileFile` and + `PrecompileResource`; + 12. In JavaScript engine settings was added one new property - `MaxStackSize` + (default `492` or `984` KB); + 13. Added support of .NET Standard 2.0 (only supported `ChakraIeJsRt` and + `ChakraEdgeJsRt` modes). ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 4aee762..836a8c4 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Benchmarks 3.0.0 - rc2 net46;netcoreapp2.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 26c3eb5..de6b0a2 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.0 - rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 56252fa..c84f41c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.0 - rc2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 4d239ef..3ee42aa 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.0 - rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 85a9043..c291434 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.0 - rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 3c6b8df..26003fb 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.0 - rc2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index a63aeb1..6d63740 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,6 @@ MSIE JavaScript Engine: Common Tests 3.0.0 - rc2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library From b0a8733f7b9c445acf4b69e3a649f78830e8a35c Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 22:49:25 +0300 Subject: [PATCH 155/238] Fixed a license text --- LICENSE.txt | 180 +--------------------------------------------------- 1 file changed, 1 insertion(+), 179 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index 22d2a50..44b36ff 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -10,182 +10,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. - - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS \ No newline at end of file + limitations under the License. \ No newline at end of file From 272d50eebf3ca95c3b8650596556dfe35ddfccf6 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 24 Dec 2018 23:02:45 +0300 Subject: [PATCH 156/238] Once again fixed a license text --- LICENSE.txt | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) diff --git a/LICENSE.txt b/LICENSE.txt index 44b36ff..884ed24 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,5 +1,195 @@ Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at From 1662b939c83afb0a57cc520b5335ea844bc48183 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 14 Jan 2019 22:07:51 +0300 Subject: [PATCH 157/238] ResxToCs was updated to version 1.0.0 Alpha 6 --- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 54c2731..884482a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -47,7 +47,7 @@ - + From b227c68e9df4cc86f4e2121828d001d465d99ba1 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 15 Jan 2019 22:15:14 +0300 Subject: [PATCH 158/238] Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result --- src/MsieJavaScriptEngine/HostObject.cs | 3 +- .../MsieJavaScriptEngine.csproj | 14 +----- src/MsieJavaScriptEngine/readme.txt | 28 +---------- .../InteropTestsBase.cs | 47 +++++++++++++++++++ 4 files changed, 52 insertions(+), 40 deletions(-) diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 195f47d..5a0a6c9 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -33,7 +33,8 @@ private object InvokeDelegate(Delegate del, object[] args) object[] processedArgs = args; - if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0) + if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0 + && del.Method.ReturnType != typeof(void)) { processedArgs = processedArgs.Skip(1).ToArray(); } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 884482a..982ad09 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -20,19 +20,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Format of the error messages was unified; -2. Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException`, `JsInterruptedException`, `JsScriptException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class; -3. In the `JsException` class was added two new properties: `Category` and `Description`; -4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; -5. In the `JsRuntimeException` class was added three new properties: `Type`, `DocumentName` and `CallStack`; -6. `JsEngineLoadException` class now is inherited from the `JsEngineException` class; -7. `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails`; -8. One part of the auxiliary code was removed, and other part moved to an external library - [AdvancedStringBuilder](https://github.com/Taritsyn/AdvancedStringBuilder); -9. Added a ability to interrupt execution of the script; -10. In JsRT modes added a ability to pre-compile scripts; -11. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and four new methods: `Interrupt`, `Precompile`, `PrecompileFile` and `PrecompileResource`; -12. In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB); -13. Added support of .NET Standard 2.0 (only supported `ChakraIeJsRt` and `ChakraEdgeJsRt` modes). + Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 3721763..5e40855 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,32 +21,8 @@ ============= RELEASE NOTES ============= - 1. Format of the error messages was unified; - 2. Created a new exception classes: `JsCompilationException`, - `JsEngineException`, `JsFatalException`, `JsInterruptedException`, - `JsScriptException` and `JsUsageException`. These exceptions are responsible - for handling errors, some of which were previously handled by the - `JsRuntimeException` class; - 3. In the `JsException` class was added two new properties: `Category` and - `Description`; - 4. From the `JsRuntimeException` class was removed one property - `ErrorCode`; - 5. In the `JsRuntimeException` class was added three new properties: `Type`, - `DocumentName` and `CallStack`; - 6. `JsEngineLoadException` class now is inherited from the `JsEngineException` - class; - 7. `Format` method of the `JsErrorHelpers` class was renamed to the - `GenerateErrorDetails`; - 8. One part of the auxiliary code was removed, and other part moved to an - external library - AdvancedStringBuilder; - 9. Added a ability to interrupt execution of the script; - 10. In JsRT modes added a ability to pre-compile scripts; - 11. In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property - and four new methods: `Interrupt`, `Precompile`, `PrecompileFile` and - `PrecompileResource`; - 12. In JavaScript engine settings was added one new property - `MaxStackSize` - (default `492` or `984` KB); - 13. Added support of .NET Standard 2.0 (only supported `ChakraIeJsRt` and - `ChakraEdgeJsRt` modes). + Fixed a error, that occurred in the `Classic` mode during calling an embedded + delegate, which does not return a result. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 19f9377..a2f0eea 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -5,6 +5,7 @@ #endif using System.IO; using System.Linq; +using System.Text; using NUnit.Framework; @@ -540,6 +541,52 @@ public virtual void EmbeddingOfInstanceOfDelegateWithTwoParametersIsCorrect() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void EmbeddingOfInstanceOfDelegateWithoutResultIsCorrect() + { + // Arrange + var logBuilder = new StringBuilder(); + Action log = (string value) => + { + logBuilder.AppendLine(value); + }; + + const string input = @"(function(log, undefined) { + var num = 2, count = 0; + + log('-= Start code execution =-'); + + while (num != Infinity) { + num = num * num; + count++; + } + + log('-= End of code execution =-'); + + return count; +}(log));"; + const int targetOutput = 10; + string targetLogOutput = "-= Start code execution =-" + Environment.NewLine + + "-= End of code execution =-" + Environment.NewLine; + + // Act + int output; + string logOutput; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("log", log); + output = jsEngine.Evaluate(input); + + logOutput = logBuilder.ToString(); + logBuilder.Clear(); + } + + // Assert + Assert.AreEqual(targetOutput, output); + Assert.AreEqual(targetLogOutput, logOutput); + } + #endregion #region Integration From 553258d9f837a7b2a7810e92678ce103c158cf33 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 16 Jan 2019 14:00:56 +0300 Subject: [PATCH 159/238] Added a host objects embedding benchmark --- .../HostObjectsEmbeddingBenchmark.cs | 134 ++++++++++++++++++ .../Interop/ObjectsEmbedding/SomeClass.cs | 34 +++++ .../Interop/ObjectsEmbedding/SomeClassBase.cs | 21 +++ .../ObjectsEmbedding/SomeOtherClass.cs | 21 +++ .../Program.cs | 6 +- 5 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClass.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeOtherClass.cs diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs new file mode 100644 index 0000000..875ad93 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs @@ -0,0 +1,134 @@ +using System; +using System.Text; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Order; + +using MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding; + +namespace MsieJavaScriptEngine.Benchmarks +{ + [MemoryDiagnoser] + [Orderer(SummaryOrderPolicy.Method, MethodOrderPolicy.Declared)] + public class HostObjectsEmbeddingBenchmark + { + private static void EmbedAndUseHostObjects(Func createJsEngine) + { + // Arrange + var someObj = new SomeClass(); + var logBuilder = new StringBuilder(); + Action log = (string value) => + { + logBuilder.AppendLine(value); + }; + + const string input = @"(function(someObj, log, undefined) { + var arg1, arg2, arg3, arg4, interimResult, result; + + log('-= Start code execution =-'); + + someObj.Field1 = false; + someObj.Field2 = 678; + someObj.Field3 = 2.20; + someObj.Field4 = 'QWERTY'; + someObj.Field5.X = 2; + someObj.Field5.Y = 4; + + someObj.Property1 = true; + someObj.Property2 = 711; + someObj.Property3 = 5.5; + someObj.Property4 = 'ЙЦУКЕН'; + someObj.Property5.Field1 = true; + someObj.Property5.Field2 = 611; + someObj.Property5.Field3 = 69.82; + someObj.Property5.Field4 = 'ASDF'; + someObj.Property5.Property1 = false; + someObj.Property5.Property2 = 555; + someObj.Property5.Property3 = 79.99; + someObj.Property5.Property4 = 'ФЫВА'; + + arg1 = someObj.Field1 || someObj.Property1; + arg2 = someObj.Field2 + someObj.Property2 + someObj.Field5.X; + arg3 = someObj.Field3 + someObj.Property3 + someObj.Field5.Y; + arg4 = someObj.Field4 + someObj.Property4; + + interimResult = someObj.DoSomething(arg1, arg2, arg3, arg4); + + arg1 = someObj.Property5.Field1 && someObj.Property5.Property1; + arg2 = interimResult - someObj.Property5.Field2 - someObj.Property5.Property2; + arg3 = someObj.Property5.Field3 / someObj.Property5.Property3; + arg4 = someObj.Property5.Field4 + someObj.Property5.Property4; + + result = someObj.Property5.DoSomething(arg1, arg2, arg3, arg4); + + log('-= End of code execution =-'); + + return result; +}(someObj, log));"; + const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA="; + string targetLogOutput = "-= Start code execution =-" + Environment.NewLine + + "-= End of code execution =-" + Environment.NewLine; + + // Act + string output; + string logOutput; + + using (var jsEngine = createJsEngine()) + { + jsEngine.EmbedHostObject("someObj", someObj); + jsEngine.EmbedHostObject("log", log); + + output = jsEngine.Evaluate(input); + + logOutput = logBuilder.ToString(); + logBuilder.Clear(); + } + + // Assert + Assert.Equal(targetOutput, output); + Assert.Equal(targetLogOutput, logOutput); + } +#if NET46 + + [Benchmark] + public void Classic() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings{ + EngineMode = JsEngineMode.Classic + }); + EmbedAndUseHostObjects(createJsEngine); + } + + [Benchmark] + public void ChakraActiveScript() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript + }); + EmbedAndUseHostObjects(createJsEngine); + } +#endif + + [Benchmark] + public void ChakraIeJsRt() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt + }); + EmbedAndUseHostObjects(createJsEngine); + } + + [Benchmark] + public void ChakraEdgeJsRt() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt + }); + EmbedAndUseHostObjects(createJsEngine); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClass.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClass.cs new file mode 100644 index 0000000..14a20fd --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClass.cs @@ -0,0 +1,34 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding +{ + public class SomeClass : SomeClassBase + { + public Point Field5; + + public SomeOtherClass Property5 { get; set; } + + + public SomeClass() + { + Field5 = new Point(); + + Property5 = new SomeOtherClass(); + } + + + public int DoSomething(bool arg1, int arg2, double arg3, string arg4) + { + int result = Convert.ToInt32(arg1) + + arg2 + + (int)Math.Round(arg3) + + Encoding.UTF8.GetBytes(arg4).Sum(x => x); + ; + + return result; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs new file mode 100644 index 0000000..6f78eb3 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding +{ + public abstract class SomeClassBase + { + public bool Field1; + public int Field2; + public double Field3; + public string Field4; + + public bool Property1 { get; set; } + public int Property2 { get; set; } + public double Property3 { get; set; } + public string Property4 { get; set; } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeOtherClass.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeOtherClass.cs new file mode 100644 index 0000000..31f7c2d --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeOtherClass.cs @@ -0,0 +1,21 @@ +using System; +using System.Globalization; +using System.Text; + +namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding +{ + public class SomeOtherClass : SomeClassBase + { + public string DoSomething(bool arg1, int arg2, double arg3, string arg4) + { + string rawResult = arg1.ToString(CultureInfo.InvariantCulture) + "|" + + arg2.ToString(CultureInfo.InvariantCulture) + "|" + + arg3.ToString(CultureInfo.InvariantCulture) + "|" + + arg4 + ; + string result = Convert.ToBase64String(Encoding.UTF8.GetBytes(rawResult)); + + return result; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Program.cs b/test/MsieJavaScriptEngine.Benchmarks/Program.cs index abd0419..7376ad7 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/Program.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/Program.cs @@ -1,4 +1,6 @@ -using BenchmarkDotNet.Running; +using System.Reflection; + +using BenchmarkDotNet.Running; namespace MsieJavaScriptEngine.Benchmarks { @@ -6,7 +8,7 @@ public static class Program { public static void Main(string[] args) { - BenchmarkRunner.Run(); + BenchmarkSwitcher.FromAssembly(typeof(Program).GetTypeInfo().Assembly).Run(args); } } } \ No newline at end of file From 8a4abb5b420f5db5d4328c199bf30253f209cd65 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 16 Jan 2019 21:45:35 +0300 Subject: [PATCH 160/238] Fixed a error, that occurred during setting a value to field of embedded type --- src/MsieJavaScriptEngine/HostItemBase.cs | 6 ++ .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 6 +- .../Interop/Logging/DefaultLogger.cs | 7 +++ .../Interop/Logging/ILogger.cs | 17 ++++++ .../Interop/Logging/NullLogger.cs | 26 +++++++++ .../Interop/Logging/ThrowExceptionLogger.cs | 57 +++++++++++++++++++ .../Interop/SimpleSingleton.cs | 17 ------ .../InteropTestsBase.cs | 14 +++-- 9 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Logging/DefaultLogger.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ILogger.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Logging/NullLogger.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ThrowExceptionLogger.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index c457df1..9fdff1a 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -87,6 +87,7 @@ protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Bind { BindingFlags processedInvokeAttr = invokeAttr; if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) + || processedInvokeAttr.HasFlag(BindingFlags.SetProperty) || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) && !_properties.Any(p => p.Name == name) && _fields.Any(p => p.Name == name)) @@ -96,6 +97,11 @@ protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Bind processedInvokeAttr &= ~BindingFlags.GetProperty; processedInvokeAttr |= BindingFlags.GetField; } + else if (processedInvokeAttr.HasFlag(BindingFlags.SetProperty)) + { + processedInvokeAttr &= ~BindingFlags.SetProperty; + processedInvokeAttr |= BindingFlags.SetField; + } else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) { processedInvokeAttr &= ~BindingFlags.PutDispProperty; diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 982ad09..59c6df5 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -20,7 +20,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result. + 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; +2. Fixed a error, that occurred during setting a value to field of embedded type. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 5e40855..d1c42fb 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,10 @@ ============= RELEASE NOTES ============= - Fixed a error, that occurred in the `Classic` mode during calling an embedded - delegate, which does not return a result. + 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded + delegate, which does not return a result; + 2. Fixed a error, that occurred during setting a value to field of embedded + type. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/DefaultLogger.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/DefaultLogger.cs new file mode 100644 index 0000000..99ee3bb --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/DefaultLogger.cs @@ -0,0 +1,7 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Logging +{ + public class DefaultLogger + { + public static ILogger Current = new NullLogger(); + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ILogger.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ILogger.cs new file mode 100644 index 0000000..ede5430 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ILogger.cs @@ -0,0 +1,17 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Logging +{ + public interface ILogger + { + void Error(string category, string message, + string filePath = "", int lineNumber = 0, int columnNumber = 0, + string sourceFragment = ""); + + void Warn(string category, string message, + string filePath = "", int lineNumber = 0, int columnNumber = 0, + string sourceFragment = ""); + + void Debug(string category, string message, string filePath = ""); + + void Info(string category, string message, string filePath = ""); + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/NullLogger.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/NullLogger.cs new file mode 100644 index 0000000..c66dab1 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/NullLogger.cs @@ -0,0 +1,26 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop.Logging +{ + public sealed class NullLogger : ILogger + { + public void Error(string category, string message, + string filePath = "", int lineNumber = 0, int columnNumber = 0, + string sourceFragment = "") + { } + + public void Warn(string category, string message, + string filePath = "", int lineNumber = 0, int columnNumber = 0, + string sourceFragment = "") + { } + + public void Debug(string category, string message, string filePath = "") + { } + + public void Info(string category, string message, string filePath = "") + { } + + public override string ToString() + { + return "[null logger]"; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ThrowExceptionLogger.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ThrowExceptionLogger.cs new file mode 100644 index 0000000..9861687 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Logging/ThrowExceptionLogger.cs @@ -0,0 +1,57 @@ +using System; +using System.Text; + +namespace MsieJavaScriptEngine.Test.Common.Interop.Logging +{ + public sealed class ThrowExceptionLogger : ILogger + { + public void Error(string category, string message, string filePath = "", + int lineNumber = 0, int columnNumber = 0, string sourceFragment = "") + { + var errorBuilder = new StringBuilder(); + errorBuilder.AppendLine("Category: " + category); + errorBuilder.AppendLine("Message: " + message); + + if (!string.IsNullOrWhiteSpace(filePath)) + { + errorBuilder.AppendLine("File: " + filePath); + } + + if (lineNumber > 0) + { + errorBuilder.AppendLine("Line number: " + lineNumber); + } + + if (columnNumber > 0) + { + errorBuilder.AppendLine("Column number: " + columnNumber); + } + + if (!string.IsNullOrWhiteSpace(sourceFragment)) + { + errorBuilder.AppendLine("Source fragment:" + Environment.NewLine + sourceFragment); + } + + string errorMessage = errorBuilder.ToString(); + errorBuilder.Clear(); + + throw new InvalidOperationException(errorMessage); + } + + public void Warn(string category, string message, + string filePath = "", int lineNumber = 0, int columnNumber = 0, + string sourceFragment = "") + { } + + public void Debug(string category, string message, string filePath = "") + { } + + public void Info(string category, string message, string filePath = "") + { } + + public override string ToString() + { + return "[throw exception logger]"; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs deleted file mode 100644 index 14d1ed4..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/SimpleSingleton.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MsieJavaScriptEngine.Test.Common.Interop -{ - public class SimpleSingleton - { - public static readonly SimpleSingleton Instance = new SimpleSingleton(); - - - private SimpleSingleton() - { } - - - public override string ToString() - { - return "[simple singleton]"; - } - } -} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index a2f0eea..b254d9f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -14,6 +14,7 @@ #if NETCOREAPP1_0 using MsieJavaScriptEngine.Test.Common.Interop.Drawing; #endif +using MsieJavaScriptEngine.Test.Common.Interop.Logging; namespace MsieJavaScriptEngine.Test.Common { @@ -934,17 +935,22 @@ public virtual void EmbeddingOfCustomValueTypeWithFieldIsCorrect() public virtual void EmbeddingOfCustomReferenceTypeWithFieldIsCorrect() { // Arrange - Type simpleSingletonType = typeof(SimpleSingleton); + Type defaultLoggerType = typeof(DefaultLogger); + Type throwExceptionLoggerType = typeof(ThrowExceptionLogger); + const string updateCode = "DefaultLogger.Current = new ThrowExceptionLogger();"; - const string input = "SimpleSingleton.Instance.ToString()"; - const string targetOutput = "[simple singleton]"; + const string input = "DefaultLogger.Current.ToString()"; + const string targetOutput = "[throw exception logger]"; // Act string output; using (var jsEngine = CreateJsEngine()) { - jsEngine.EmbedHostType("SimpleSingleton", simpleSingletonType); + jsEngine.EmbedHostType("DefaultLogger", defaultLoggerType); + jsEngine.EmbedHostType("ThrowExceptionLogger", throwExceptionLoggerType); + jsEngine.Execute(updateCode); + output = jsEngine.Evaluate(input); } From d3956558396dd64c03f5380fca138bbb28abdcde Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Thu, 17 Jan 2019 11:46:15 +0300 Subject: [PATCH 161/238] Added a host types embedding benchmark --- .../HostTypesEmbeddingBenchmark.cs | 114 ++++++++++++++++++ .../Interop/TypesEmbedding/SomeClass.cs | 34 ++++++ .../Interop/TypesEmbedding/SomeOtherClass.cs | 47 ++++++++ 3 files changed, 195 insertions(+) create mode 100644 test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeClass.cs create mode 100644 test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeOtherClass.cs diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs new file mode 100644 index 0000000..e53b338 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs @@ -0,0 +1,114 @@ +using System; +using System.Drawing; + +using BenchmarkDotNet.Attributes; +using BenchmarkDotNet.Diagnosers; +using BenchmarkDotNet.Order; + +using MsieJavaScriptEngine.Benchmarks.Interop.TypesEmbedding; + +namespace MsieJavaScriptEngine.Benchmarks +{ + [MemoryDiagnoser] + [Orderer(SummaryOrderPolicy.Method, MethodOrderPolicy.Declared)] + public class HostTypesEmbeddingBenchmark + { + private static void EmbedAndUseHostTypes(Func createJsEngine) + { + // Arrange + var someType = typeof(SomeClass); + var pointType = typeof(Point); + var someOtherType = typeof(SomeOtherClass); + + const string input = @"(function(SomeClass, Point, SomeOtherClass, undefined) { + var arg1, arg2, arg3, arg4, interimResult, result; + + SomeClass.Field1 = false; + SomeClass.Field2 = 678; + SomeClass.Field3 = 2.20; + SomeClass.Field4 = 'QWERTY'; + SomeClass.Field5 = new Point(2, 4); + + SomeClass.Property1 = true; + SomeClass.Property2 = 711; + SomeClass.Property3 = 5.5; + SomeClass.Property4 = 'ЙЦУКЕН'; + SomeClass.Property5 = new SomeOtherClass(true, 611, 69.82, 'ASDF', + false, 555, 79.99, 'ФЫВА'); + + arg1 = SomeClass.Field1 || SomeClass.Property1; + arg2 = SomeClass.Field2 + SomeClass.Property2 + SomeClass.Field5.X; + arg3 = SomeClass.Field3 + SomeClass.Property3 + SomeClass.Field5.Y; + arg4 = SomeClass.Field4 + SomeClass.Property4; + + interimResult = SomeClass.DoSomething(arg1, arg2, arg3, arg4); + + arg1 = SomeClass.Property5.Field1 && SomeClass.Property5.Property1; + arg2 = interimResult - SomeClass.Property5.Field2 - SomeClass.Property5.Property2; + arg3 = SomeClass.Property5.Field3 / SomeClass.Property5.Property3; + arg4 = SomeClass.Property5.Field4 + SomeClass.Property5.Property4; + + result = SomeOtherClass.DoSomething(arg1, arg2, arg3, arg4); + + return result; +}(SomeClass, Point, SomeOtherClass));"; + const string targetOutput = "RmFsc2V8MjkyMHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA="; + + // Act + string output; + + using (var jsEngine = createJsEngine()) + { + jsEngine.EmbedHostType("SomeClass", someType); + jsEngine.EmbedHostType("Point", pointType); + jsEngine.EmbedHostType("SomeOtherClass", someOtherType); + + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.Equal(targetOutput, output); + } +#if NET46 + + [Benchmark] + public void Classic() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings{ + EngineMode = JsEngineMode.Classic + }); + EmbedAndUseHostTypes(createJsEngine); + } + + [Benchmark] + public void ChakraActiveScript() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraActiveScript + }); + EmbedAndUseHostTypes(createJsEngine); + } +#endif + + [Benchmark] + public void ChakraIeJsRt() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraIeJsRt + }); + EmbedAndUseHostTypes(createJsEngine); + } + + [Benchmark] + public void ChakraEdgeJsRt() + { + Func createJsEngine = () => new MsieJsEngine(new JsEngineSettings + { + EngineMode = JsEngineMode.ChakraEdgeJsRt + }); + EmbedAndUseHostTypes(createJsEngine); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeClass.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeClass.cs new file mode 100644 index 0000000..e0ac877 --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeClass.cs @@ -0,0 +1,34 @@ +using System; +using System.Drawing; +using System.Linq; +using System.Text; + +namespace MsieJavaScriptEngine.Benchmarks.Interop.TypesEmbedding +{ + public static class SomeClass + { + public static bool Field1; + public static int Field2; + public static double Field3; + public static string Field4; + public static Point Field5; + + public static bool Property1 { get; set; } + public static int Property2 { get; set; } + public static double Property3 { get; set; } + public static string Property4 { get; set; } + public static SomeOtherClass Property5 { get; set; } + + + public static int DoSomething(bool arg1, int arg2, double arg3, string arg4) + { + int result = Convert.ToInt32(arg1) + + arg2 + + (int)Math.Round(arg3) + + Encoding.UTF8.GetBytes(arg4).Sum(x => x); + ; + + return result; + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeOtherClass.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeOtherClass.cs new file mode 100644 index 0000000..0f73fce --- /dev/null +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/TypesEmbedding/SomeOtherClass.cs @@ -0,0 +1,47 @@ +using System; +using System.Globalization; +using System.Text; + +namespace MsieJavaScriptEngine.Benchmarks.Interop.TypesEmbedding +{ + public class SomeOtherClass + { + public bool Field1; + public int Field2; + public double Field3; + public string Field4; + + public bool Property1 { get; set; } + public int Property2 { get; set; } + public double Property3 { get; set; } + public string Property4 { get; set; } + + + public SomeOtherClass(bool field1, int field2, double field3, string field4, + bool property1, int property2, double property3, string property4) + { + Field1 = field1; + Field2 = field2; + Field3 = field3; + Field4 = field4; + + Property1 = property1; + Property2 = property2; + Property3 = property3; + Property4 = property4; + } + + + public static string DoSomething(bool arg1, int arg2, double arg3, string arg4) + { + string rawResult = arg1.ToString(CultureInfo.InvariantCulture) + "|" + + arg2.ToString(CultureInfo.InvariantCulture) + "|" + + arg3.ToString(CultureInfo.InvariantCulture) + "|" + + arg4 + ; + string result = Convert.ToBase64String(Encoding.UTF8.GetBytes(rawResult)); + + return result; + } + } +} \ No newline at end of file From 0e6b776b788cce19526d228095f2884e3502fff4 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 20 Jan 2019 21:15:41 +0300 Subject: [PATCH 162/238] In version for .NET Core improved a performance of the embedding of objects and types --- .../JsRt/ChakraJsRtJsEngineBase.cs | 64 -- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 669 +----------------- .../JsRt/Edge/EdgeJsValue.cs | 2 +- .../JsRt/Edge/EdgeNativeMethods.cs | 2 +- .../JsRt/Edge/EdgeTypeMapper.cs | 642 +++++++++++++++++ .../JsRt/Embedding/EmbeddedItem.cs | 125 ++++ .../JsRt/Embedding/EmbeddedObject.cs | 48 ++ .../JsRt/Embedding/EmbeddedObjectKey.cs | 165 +++++ .../JsRt/Embedding/EmbeddedType.cs | 48 ++ .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 667 +---------------- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 2 +- .../JsRt/Ie/IeNativeMethods.cs | 2 +- .../JsRt/Ie/IeTypeMapper.cs | 638 +++++++++++++++++ ...alizeCallback.cs => JsFinalizeCallback.cs} | 2 +- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 320 +++++++++ .../MsieJavaScriptEngine.csproj | 4 +- .../Resources/NetCoreStrings.Designer.cs | 8 + .../Resources/NetCoreStrings.resx | 3 + .../Resources/NetCoreStrings.ru-ru.resx | 3 + src/MsieJavaScriptEngine/readme.txt | 4 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 1 + ...criptEngine.Test.ChakraActiveScript.csproj | 1 + ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 1 + ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 1 + .../MsieJavaScriptEngine.Test.Classic.csproj | 1 + .../MsieJavaScriptEngine.Test.Common.csproj | 1 + 26 files changed, 2053 insertions(+), 1371 deletions(-) create mode 100644 src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs rename src/MsieJavaScriptEngine/JsRt/{JsObjectFinalizeCallback.cs => JsFinalizeCallback.cs} (78%) create mode 100644 src/MsieJavaScriptEngine/JsRt/TypeMapper.cs diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 54605f9..9f67537 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -1,8 +1,4 @@ using System; -#if NETSTANDARD -using System.Collections.Generic; -using System.Runtime.InteropServices; -#endif using MsieJavaScriptEngine.Utilities; @@ -22,18 +18,6 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// Flag indicating whether debugging started /// private StatedFlag _debuggingStartedFlag; -#if NETSTANDARD - - /// - /// Set of external objects - /// - protected HashSet _externalObjects = new HashSet(); - - /// - /// Callback for finalization of external object - /// - protected JsObjectFinalizeCallback _externalObjectFinalizeCallback; -#endif /// /// Script dispatcher @@ -52,9 +36,6 @@ protected ChakraJsRtJsEngineBase(JsEngineSettings settings) _dispatcher = new ScriptDispatcher(); #else _dispatcher = new ScriptDispatcher(settings.MaxStackSize); -#endif -#if NETSTANDARD - _externalObjectFinalizeCallback = ExternalObjectFinalizeCallback; #endif } @@ -71,50 +52,5 @@ protected void StartDebugging() } protected abstract void InnerStartDebugging(); -#if NETSTANDARD - - private void ExternalObjectFinalizeCallback(IntPtr data) - { - if (data == IntPtr.Zero) - { - return; - } - - GCHandle handle = GCHandle.FromIntPtr(data); - object obj = handle.Target; - - if (obj != null && _externalObjects != null) - { - _externalObjects.Remove(obj); - } - - handle.Free(); - } -#endif - - #region IDisposable implementation - - /// - /// Destroys object - /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class - protected virtual void Dispose(bool disposing) - { -#if NETSTANDARD - if (disposing) - { - if (_externalObjects != null) - { - _externalObjects.Clear(); - _externalObjects = null; - } - - _externalObjectFinalizeCallback = null; - } -#endif - } - - #endregion } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index b22134c..d707ae2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1,18 +1,10 @@ using System; -#if NETSTANDARD -using System.Collections.Generic; -#endif using System.Linq; -#if NETSTANDARD -using System.Reflection; -using System.Runtime.InteropServices; -#endif using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; -using MsieJavaScriptEngine.Utilities; using WrapperCompilationException = MsieJavaScriptEngine.JsCompilationException; using WrapperEngineException = MsieJavaScriptEngine.JsEngineException; @@ -47,6 +39,11 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// private EdgeJsContext _jsContext; + /// + /// Type mapper + /// + private EdgeTypeMapper _typeMapper; + /// /// Flag indicating whether this JS engine is supported /// @@ -56,13 +53,6 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// Support synchronizer /// private static readonly object _supportSynchronizer = new object(); -#if NETSTANDARD - - /// - /// List of native function callbacks - /// - private HashSet _nativeFunctions = new HashSet(); -#endif /// @@ -72,6 +62,8 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) : base(settings) { + _typeMapper = new EdgeTypeMapper(); + try { _dispatcher.Invoke(() => @@ -231,623 +223,6 @@ private EdgeJsScope CreateJsScope() #region Mapping - /// - /// Makes a mapping of value from the host type to a script type - /// - /// The source value - /// The mapped value - private EdgeJsValue MapToScriptType(object value) - { - if (value == null) - { - return EdgeJsValue.Null; - } - - if (value is Undefined) - { - return EdgeJsValue.Undefined; - } - - var typeCode = value.GetType().GetTypeCode(); - - switch (typeCode) - { - case TypeCode.Boolean: - return (bool)value ? EdgeJsValue.True : EdgeJsValue.False; - - case TypeCode.SByte: - case TypeCode.Byte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - return EdgeJsValue.FromInt32(Convert.ToInt32(value)); - - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return EdgeJsValue.FromDouble(Convert.ToDouble(value)); - - case TypeCode.Char: - case TypeCode.String: - return EdgeJsValue.FromString((string)value); - - default: -#if NETSTANDARD - return FromObject(value); -#else - object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? - new HostObject(value, _settings.EngineMode) : value; - return EdgeJsValue.FromObject(processedValue); -#endif - } - } - - /// - /// Makes a mapping of array items from the host type to a script type - /// - /// The source array - /// The mapped array - private EdgeJsValue[] MapToScriptType(object[] args) - { - return args.Select(MapToScriptType).ToArray(); - } - - /// - /// Makes a mapping of value from the script type to a host type - /// - /// The source value - /// The mapped value - private object MapToHostType(EdgeJsValue value) - { - JsValueType valueType = value.ValueType; - EdgeJsValue processedValue; - object result; - - switch (valueType) - { - case JsValueType.Null: - result = null; - break; - case JsValueType.Undefined: - result = Undefined.Value; - break; - case JsValueType.Boolean: - processedValue = value.ConvertToBoolean(); - result = processedValue.ToBoolean(); - break; - case JsValueType.Number: - processedValue = value.ConvertToNumber(); - result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); - break; - case JsValueType.String: - processedValue = value.ConvertToString(); - result = processedValue.ToString(); - break; - case JsValueType.Object: - case JsValueType.Function: - case JsValueType.Error: - case JsValueType.Array: -#if NETSTANDARD - result = ToObject(value); -#else - processedValue = value.ConvertToObject(); - object obj = processedValue.ToObject(); - - if (!TypeConverter.IsPrimitiveType(obj.GetType())) - { - var hostObj = obj as HostObject; - result = hostObj != null ? hostObj.Target : obj; - } - else - { - result = obj; - } -#endif - break; - default: - throw new ArgumentOutOfRangeException(); - } - - return result; - } - - /// - /// Makes a mapping of array items from the script type to a host type - /// - /// The source array - /// The mapped array - private object[] MapToHostType(EdgeJsValue[] args) - { - return args.Select(MapToHostType).ToArray(); - } -#if NETSTANDARD - - private EdgeJsValue FromObject(object value) - { - var del = value as Delegate; - EdgeJsValue objValue = del != null ? CreateFunctionFromDelegate(del) : CreateExternalObjectFromObject(value); - - return objValue; - } - - private object ToObject(EdgeJsValue value) - { - object result = value.HasExternalData ? - GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); - - return result; - } - - private EdgeJsValue CreateExternalObjectFromObject(object value) - { - GCHandle handle = GCHandle.Alloc(value); - _externalObjects.Add(value); - - EdgeJsValue objValue = EdgeJsValue.CreateExternalObject( - GCHandle.ToIntPtr(handle), _externalObjectFinalizeCallback); - Type type = value.GetType(); - - ProjectFields(objValue, type, true); - ProjectProperties(objValue, type, true); - ProjectMethods(objValue, type, true); - FreezeObject(objValue); - - return objValue; - } - - private EdgeJsValue CreateObjectFromType(Type type) - { - EdgeJsValue typeValue = CreateConstructor(type); - - ProjectFields(typeValue, type, false); - ProjectProperties(typeValue, type, false); - ProjectMethods(typeValue, type, false); - FreezeObject(typeValue); - - return typeValue; - } - - private void FreezeObject(EdgeJsValue objValue) - { - EdgeJsValue freezeMethodValue = EdgeJsValue.GlobalObject - .GetProperty("Object") - .GetProperty("freeze") - ; - freezeMethodValue.CallFunction(objValue); - } - - private EdgeJsValue CreateFunctionFromDelegate(Delegate value) - { - EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - ParameterInfo[] parameters = value.GetMethodInfo().GetParameters(); - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); - - object result; - - try - { - result = value.DynamicInvoke(processedArgs); - } - catch (Exception e) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - EdgeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - EdgeJsValue functionValue = EdgeJsValue.CreateFunction(nativeFunction); - - return functionValue; - } - - private EdgeJsValue CreateConstructor(Type type) - { - TypeInfo typeInfo = type.GetTypeInfo(); - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); - ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); - - EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue resultValue; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - object result; - - if (processedArgs.Length == 0 && typeInfo.IsValueType) - { - result = Activator.CreateInstance(type); - resultValue = MapToScriptType(result); - - return resultValue; - } - - if (constructors.Length == 0) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( - constructors, processedArgs); - if (bestFitConstructor == null) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); - - try - { - result = bestFitConstructor.Invoke(processedArgs); - } - catch (Exception e) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - EdgeJsValue constructorValue = EdgeJsValue.CreateFunction(nativeFunction); - - return constructorValue; - } - - private void ProjectFields(EdgeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - FieldInfo[] fields = type.GetFields(defaultBindingFlags); - - foreach (FieldInfo field in fields) - { - string fieldName = field.Name; - - EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); - descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); - - EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue thisValue = args[0]; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object result; - - try - { - result = field.GetValue(thisObj); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) - ; - - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - EdgeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeGetFunction); - - EdgeJsValue getMethodValue = EdgeJsValue.CreateFunction(nativeGetFunction); - descriptorValue.SetProperty("get", getMethodValue, true); - - EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue thisValue = args[0]; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object value = MapToHostType(args.Skip(1).First()); - ReflectionHelpers.FixFieldValueType(ref value, field); - - try - { - field.SetValue(thisObj, value); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) - ; - - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - return undefinedValue; - }; - _nativeFunctions.Add(nativeSetFunction); - - EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeSetFunction); - descriptorValue.SetProperty("set", setMethodValue, true); - - target.DefineProperty(fieldName, descriptorValue); - } - } - - private void ProjectProperties(EdgeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - PropertyInfo[] properties = type.GetProperties(defaultBindingFlags); - - foreach (PropertyInfo property in properties) - { - string propertyName = property.Name; - - EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); - descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); - - if (property.GetGetMethod() != null) - { - EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue thisValue = args[0]; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object result; - - try - { - result = property.GetValue(thisObj, new object[0]); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) - ; - - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - EdgeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - EdgeJsValue getMethodValue = EdgeJsValue.CreateFunction(nativeFunction); - descriptorValue.SetProperty("get", getMethodValue, true); - } - - if (property.GetSetMethod() != null) - { - EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue thisValue = args[0]; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object value = MapToHostType(args.Skip(1).First()); - ReflectionHelpers.FixPropertyValueType(ref value, property); - - try - { - property.SetValue(thisObj, value, new object[0]); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) - ; - - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - return undefinedValue; - }; - _nativeFunctions.Add(nativeFunction); - - EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeFunction); - descriptorValue.SetProperty("set", setMethodValue, true); - } - - target.DefineProperty(propertyName, descriptorValue); - } - } - - private void ProjectMethods(EdgeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - MethodInfo[] methods = type.GetMethods(defaultBindingFlags); - IEnumerable> methodGroups = methods.GroupBy(m => m.Name); - - foreach (IGrouping methodGroup in methodGroups) - { - string methodName = methodGroup.Key; - MethodInfo[] methodCandidates = methodGroup.ToArray(); - - EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - EdgeJsValue thisValue = args[0]; - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - - var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( - methodCandidates, processedArgs); - if (bestFitMethod == null) - { - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); - - object result; - - try - { - result = bestFitMethod.Invoke(thisObj, processedArgs); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) - ; - - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - EdgeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - EdgeJsValue methodValue = EdgeJsValue.CreateFunction(nativeFunction); - target.SetProperty(methodName, methodValue, true); - } - } -#endif - private WrapperException WrapJsException(OriginalException originalException, string defaultDocumentName = null) { @@ -1095,7 +470,7 @@ public override object Evaluate(string expression, string documentName) EdgeJsValue resultValue = EdgeJsContext.RunScript(expression, _jsSourceContext++, documentName); - return MapToHostType(resultValue); + return _typeMapper.MapToHostType(resultValue); } catch (OriginalException e) { @@ -1173,7 +548,7 @@ public override object CallFunction(string functionName, params object[] args) if (args.Length > 0) { - EdgeJsValue[] processedArgs = MapToScriptType(args); + EdgeJsValue[] processedArgs = _typeMapper.MapToScriptType(args); foreach (EdgeJsValue processedArg in processedArgs) { @@ -1202,7 +577,7 @@ public override object CallFunction(string functionName, params object[] args) resultValue = functionValue.CallFunction(globalObj); } - return MapToHostType(resultValue); + return _typeMapper.MapToHostType(resultValue); } catch (OriginalException e) { @@ -1254,7 +629,7 @@ public override object GetVariableValue(string variableName) { EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableName); - return MapToHostType(variableValue); + return _typeMapper.MapToHostType(variableValue); } catch (OriginalException e) { @@ -1274,7 +649,7 @@ public override void SetVariableValue(string variableName, object value) { try { - EdgeJsValue inputValue = MapToScriptType(value); + EdgeJsValue inputValue = _typeMapper.MapToScriptType(value); AddReferenceToValue(inputValue); try @@ -1326,7 +701,7 @@ public override void EmbedHostObject(string itemName, object value) { try { - EdgeJsValue processedValue = MapToScriptType(value); + EdgeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); } catch (OriginalException e) @@ -1345,11 +720,7 @@ public override void EmbedHostType(string itemName, Type type) { try { -#if NETSTANDARD - EdgeJsValue typeValue = CreateObjectFromType(type); -#else - EdgeJsValue typeValue = EdgeJsValue.FromObject(new HostType(type, _settings.EngineMode)); -#endif + EdgeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); } catch (OriginalException e) @@ -1388,7 +759,7 @@ public override void Dispose() /// /// Flag, allowing destruction of /// managed objects contained in fields of class - protected override void Dispose(bool disposing) + private void Dispose(bool disposing) { if (_disposedFlag.Set()) { @@ -1401,21 +772,17 @@ protected override void Dispose(bool disposing) _dispatcher.Dispose(); _dispatcher = null; } -#if NETSTANDARD - if (_nativeFunctions != null) + if (_typeMapper != null) { - _nativeFunctions.Clear(); - _nativeFunctions = null; + _typeMapper.Dispose(); + _typeMapper = null; } -#endif } else { DisposeUnmanagedResources(); } - - base.Dispose(disposing); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index f2979a8..2f819a2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -347,7 +347,7 @@ public static EdgeJsValue CreateObject() /// External data that the object will represent. May be null /// The callback for when the object is finalized. May be null. /// The new Object - public static EdgeJsValue CreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizer) + public static EdgeJsValue CreateExternalObject(IntPtr data, JsFinalizeCallback finalizer) { EdgeJsValue reference; EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsCreateExternalObject(data, finalizer, out reference)); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 9c030a5..e173780 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -167,7 +167,7 @@ internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, - JsObjectFinalizeCallback finalizeCallback, out EdgeJsValue obj); + JsFinalizeCallback finalizeCallback, out EdgeJsValue obj); [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToObject(EdgeJsValue value, out EdgeJsValue obj); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs new file mode 100644 index 0000000..9abc471 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -0,0 +1,642 @@ +using System; +#if NETSTANDARD +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +#endif + +using MsieJavaScriptEngine.Extensions; +using MsieJavaScriptEngine.Helpers; +#if NETSTANDARD +using MsieJavaScriptEngine.JsRt.Embedding; +using MsieJavaScriptEngine.Resources; +#endif +#if !NETSTANDARD +using MsieJavaScriptEngine.Utilities; +#endif + +namespace MsieJavaScriptEngine.JsRt.Edge +{ +#if NETSTANDARD + using EdgeEmbeddedItem = EmbeddedItem; + using EdgeEmbeddedObject = EmbeddedObject; + using EdgeEmbeddedType = EmbeddedType; + +#endif + /// + /// “Edge” type mapper + /// + internal sealed class EdgeTypeMapper : TypeMapper + { + /// + /// Constructs an instance of the “Edge” type mapper + /// + public EdgeTypeMapper() +#if !NETSTANDARD + : base(JsEngineMode.ChakraEdgeJsRt) +#endif + { } + + +#if !NETSTANDARD + /// + /// Creates a JavaScript value from an host object if the it does not already exist + /// + /// Instance of host type + /// JavaScript value created from an host object + public override EdgeJsValue GetOrCreateScriptObject(object obj) + { + var wrappedObj = new HostObject(obj, _engineMode); + EdgeJsValue objValue = EdgeJsValue.FromObject(wrappedObj); + + return objValue; + } + + /// + /// Creates a JavaScript value from an host type if the it does not already exist + /// + /// Host type + /// JavaScript value created from an host type + public override EdgeJsValue GetOrCreateScriptType(Type type) + { + var wrappedType = new HostType(type, _engineMode); + EdgeJsValue typeValue = EdgeJsValue.FromObject(wrappedType); + + return typeValue; + } +#endif + /// + /// Makes a mapping of value from the host type to a script type + /// + /// The source value + /// The mapped value + public override EdgeJsValue MapToScriptType(object value) + { + if (value == null) + { + return EdgeJsValue.Null; + } + + if (value is Undefined) + { + return EdgeJsValue.Undefined; + } + + var typeCode = value.GetType().GetTypeCode(); + + switch (typeCode) + { + case TypeCode.Boolean: + return (bool)value ? EdgeJsValue.True : EdgeJsValue.False; + + case TypeCode.SByte: + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + return EdgeJsValue.FromInt32(Convert.ToInt32(value)); + + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return EdgeJsValue.FromDouble(Convert.ToDouble(value)); + + case TypeCode.Char: + case TypeCode.String: + return EdgeJsValue.FromString((string)value); + + default: + return GetOrCreateScriptObject(value); + } + } + + /// + /// Makes a mapping of value from the script type to a host type + /// + /// The source value + /// The mapped value + public override object MapToHostType(EdgeJsValue value) + { + JsValueType valueType = value.ValueType; + EdgeJsValue processedValue; + object result; + + switch (valueType) + { + case JsValueType.Null: + result = null; + break; + case JsValueType.Undefined: + result = Undefined.Value; + break; + case JsValueType.Boolean: + processedValue = value.ConvertToBoolean(); + result = processedValue.ToBoolean(); + break; + case JsValueType.Number: + processedValue = value.ConvertToNumber(); + result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); + break; + case JsValueType.String: + processedValue = value.ConvertToString(); + result = processedValue.ToString(); + break; + case JsValueType.Object: + case JsValueType.Function: + case JsValueType.Error: + case JsValueType.Array: +#if NETSTANDARD + result = value.HasExternalData ? + GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); +#else + processedValue = value.ConvertToObject(); + object obj = processedValue.ToObject(); + var hostObj = obj as HostObject; + result = hostObj != null ? hostObj.Target : obj; +#endif + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return result; + } +#if NETSTANDARD + + protected override EdgeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) + { + var del = obj as Delegate; + EdgeEmbeddedObject embeddedObject = del != null ? + CreateEmbeddedFunction(del) : CreateEmbeddedObject(obj); + + return embeddedObject; + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private EdgeEmbeddedObject CreateEmbeddedObject(object obj) + { + GCHandle objHandle = GCHandle.Alloc(obj); + IntPtr objPtr = GCHandle.ToIntPtr(objHandle); + EdgeJsValue objValue = EdgeJsValue.CreateExternalObject(objPtr, _embeddedObjectFinalizeCallback); + + var embeddedObject = new EdgeEmbeddedObject(obj, objValue); + + ProjectFields(embeddedObject); + ProjectProperties(embeddedObject); + ProjectMethods(embeddedObject); + FreezeObject(objValue); + + return embeddedObject; + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) + { + EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + object[] processedArgs = GetHostItemMemberArguments(args); + MethodInfo method = del.GetMethodInfo(); + ParameterInfo[] parameters = method.GetParameters(); + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); + + object result; + + try + { + result = del.DynamicInvoke(processedArgs); + } + catch (Exception e) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + EdgeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + + GCHandle delHandle = GCHandle.Alloc(del); + IntPtr delPtr = GCHandle.ToIntPtr(delHandle); + EdgeJsValue prototypeValue = EdgeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); + + EdgeJsValue functionValue = EdgeJsValue.CreateFunction(nativeFunction); + functionValue.Prototype = prototypeValue; + + var embeddedObject = new EdgeEmbeddedObject(del, functionValue, + new List { nativeFunction }); + + return embeddedObject; + } + + protected override EdgeEmbeddedType CreateEmbeddedType(Type type) + { + TypeInfo typeInfo = type.GetTypeInfo(); + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); + ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); + + EdgeJsNativeFunction nativeConstructorFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + object result; + EdgeJsValue resultValue; + object[] processedArgs = GetHostItemMemberArguments(args); + + if (processedArgs.Length == 0 && typeInfo.IsValueType) + { + result = Activator.CreateInstance(type); + resultValue = MapToScriptType(result); + + return resultValue; + } + + if (constructors.Length == 0) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( + constructors, processedArgs); + if (bestFitConstructor == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( + string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); + + try + { + result = bestFitConstructor.Invoke(processedArgs); + } + catch (Exception e) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + resultValue = MapToScriptType(result); + + return resultValue; + }; + + string embeddedTypeKey = type.AssemblyQualifiedName; + GCHandle embeddedTypeKeyHandle = GCHandle.Alloc(embeddedTypeKey); + IntPtr embeddedTypeKeyPtr = GCHandle.ToIntPtr(embeddedTypeKeyHandle); + EdgeJsValue prototypeValue = EdgeJsValue.CreateExternalObject(embeddedTypeKeyPtr, + _embeddedTypeFinalizeCallback); + + EdgeJsValue typeValue = EdgeJsValue.CreateFunction(nativeConstructorFunction); + typeValue.Prototype = prototypeValue; + + var embeddedType = new EdgeEmbeddedType(type, typeValue, + new List { nativeConstructorFunction }); + + ProjectFields(embeddedType); + ProjectProperties(embeddedType); + ProjectMethods(embeddedType); + FreezeObject(typeValue); + + return embeddedType; + } + + private void ProjectFields(EdgeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + EdgeJsValue typeValue = externalItem.ScriptValue; + bool instance = externalItem.IsInstance; + IList nativeFunctions = externalItem.NativeFunctions; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + FieldInfo[] fields = type.GetFields(defaultBindingFlags); + + foreach (FieldInfo field in fields) + { + string fieldName = field.Name; + + EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); + + EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object result; + + try + { + result = field.GetValue(obj); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) + ; + + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + EdgeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeGetFunction); + + EdgeJsValue getMethodValue = EdgeJsValue.CreateFunction(nativeGetFunction); + descriptorValue.SetProperty("get", getMethodValue, true); + + EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object value = MapToHostType(args[1]); + ReflectionHelpers.FixFieldValueType(ref value, field); + + try + { + field.SetValue(obj, value); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) + ; + + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + return EdgeJsValue.Undefined; + }; + nativeFunctions.Add(nativeSetFunction); + + EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + + typeValue.DefineProperty(fieldName, descriptorValue); + } + } + + private void ProjectProperties(EdgeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + EdgeJsValue typeValue = externalItem.ScriptValue; + IList nativeFunctions = externalItem.NativeFunctions; + bool instance = externalItem.IsInstance; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + PropertyInfo[] properties = type.GetProperties(defaultBindingFlags); + + foreach (PropertyInfo property in properties) + { + string propertyName = property.Name; + + EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); + + if (property.GetGetMethod() != null) + { + EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object result; + + try + { + result = property.GetValue(obj, new object[0]); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) + ; + + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + EdgeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeGetFunction); + + EdgeJsValue getMethodValue = EdgeJsValue.CreateFunction(nativeGetFunction); + descriptorValue.SetProperty("get", getMethodValue, true); + } + + if (property.GetSetMethod() != null) + { + EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object value = MapToHostType(args[1]); + ReflectionHelpers.FixPropertyValueType(ref value, property); + + try + { + property.SetValue(obj, value, new object[0]); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) + ; + + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + return EdgeJsValue.Undefined; + }; + nativeFunctions.Add(nativeSetFunction); + + EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + } + + typeValue.DefineProperty(propertyName, descriptorValue); + } + } + + private void ProjectMethods(EdgeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + EdgeJsValue typeValue = externalItem.ScriptValue; + IList nativeFunctions = externalItem.NativeFunctions; + bool instance = externalItem.IsInstance; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + IEnumerable methods = type.GetMethods(defaultBindingFlags) + .Where(m => !(m.Attributes.HasFlag(MethodAttributes.SpecialName) + && (m.Name.StartsWith("get_") || m.Name.StartsWith("set_")))) + ; + IEnumerable> methodGroups = methods.GroupBy(m => m.Name); + + foreach (IGrouping methodGroup in methodGroups) + { + string methodName = methodGroup.Key; + MethodInfo[] methodCandidates = methodGroup.ToArray(); + + EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object[] processedArgs = GetHostItemMemberArguments(args); + + var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( + methodCandidates, processedArgs); + if (bestFitMethod == null) + { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( + string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); + + object result; + + try + { + result = bestFitMethod.Invoke(obj, processedArgs); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) + ; + + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + EdgeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + EdgeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeFunction); + + EdgeJsValue methodValue = EdgeJsValue.CreateFunction(nativeFunction); + typeValue.SetProperty(methodName, methodValue, true); + } + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private void FreezeObject(EdgeJsValue objValue) + { + EdgeJsValue freezeMethodValue = EdgeJsValue.GlobalObject + .GetProperty("Object") + .GetProperty("freeze") + ; + freezeMethodValue.CallFunction(objValue); + } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs new file mode 100644 index 0000000..71c8699 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs @@ -0,0 +1,125 @@ +#if NETSTANDARD +using System; +using System.Collections.Generic; + +using MsieJavaScriptEngine.Utilities; + +namespace MsieJavaScriptEngine.JsRt.Embedding +{ + /// + /// Embedded item + /// + /// The type of the JavaScript value + /// The type of the native function + internal abstract class EmbeddedItem : IDisposable + where TValue : struct + where TFunction : Delegate + { + /// + /// Host type + /// + private Type _hostType; + + /// + /// Instance of host type + /// + private object _hostObject; + + /// + /// JavaScript value created from an host item + /// + private readonly TValue _scriptValue; + + /// + /// List of native functions, that used to access to members of host item + /// + private IList _nativeFunctions; + + /// + /// Flag indicating whether this object is disposed + /// + private readonly InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); + + /// + /// Gets a host type + /// + public Type HostType + { + get { return _hostType; } + } + + /// + /// Gets a instance of host type + /// + public object HostObject + { + get { return _hostObject; } + } + + /// + /// Gets a JavaScript value created from an host item + /// + public TValue ScriptValue + { + get { return _scriptValue; } + } + + /// + /// Gets a list of native functions, that used to access to members of host item + /// + public IList NativeFunctions + { + get { return _nativeFunctions; } + } + + /// + /// Gets a value that indicates if the host item is an instance + /// + public abstract bool IsInstance + { + get; + } + + + /// + /// Constructs an instance of the embedded item + /// + /// Host type + /// Instance of host type + /// JavaScript value created from an host item + /// List of native functions, that used to access to members of host item + protected EmbeddedItem(Type hostType, object hostObject, TValue scriptValue, + IList nativeFunctions) + { + _hostType = hostType; + _hostObject = hostObject; + _scriptValue = scriptValue; + _nativeFunctions = nativeFunctions; + } + + + #region IDisposable implementation + + /// + /// Disposes the embedded item + /// + public void Dispose() + { + if (_disposedFlag.Set()) + { + _hostType = null; + _hostObject = null; + + IList nativeFunctions = _nativeFunctions; + if (nativeFunctions != null) + { + nativeFunctions.Clear(); + _nativeFunctions = null; + } + } + } + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs new file mode 100644 index 0000000..ee0bf5a --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs @@ -0,0 +1,48 @@ +#if NETSTANDARD +using System; +using System.Collections.Generic; + +namespace MsieJavaScriptEngine.JsRt.Embedding +{ + /// + /// Embedded object + /// + /// The type of the JavaScript value + /// The type of the native function + internal sealed class EmbeddedObject : EmbeddedItem + where TValue : struct + where TFunction : Delegate + { + /// + /// Constructs an instance of the embedded object + /// + /// Instance of host type + /// JavaScript value created from an host object + public EmbeddedObject(object hostObject, TValue scriptValue) + : base(hostObject.GetType(), hostObject, scriptValue, new List()) + { } + + /// + /// Constructs an instance of the embedded object + /// + /// Instance of host type + /// JavaScript value created from an host object + /// List of native functions, that used to access to members of host object + public EmbeddedObject(object hostObject, TValue scriptValue, IList nativeFunctions) + : base(hostObject.GetType(), hostObject, scriptValue, nativeFunctions) + { } + + #region EmbeddedItem overrides + + /// + /// Gets a value that indicates if the host item is an instance + /// + public override bool IsInstance + { + get { return true; } + } + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs new file mode 100644 index 0000000..9eb2009 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs @@ -0,0 +1,165 @@ +#if NETSTANDARD +using System; +using System.Collections; +using System.Collections.Generic; + +using MsieJavaScriptEngine.Resources; + +namespace MsieJavaScriptEngine.JsRt.Embedding +{ + /// + /// Key for storage of embedded objects + /// + internal struct EmbeddedObjectKey : IEquatable, IStructuralEquatable, + IComparable, IComparable, IStructuralComparable + { + /// + /// Name of host type + /// + public readonly string HostTypeName; + + /// + /// Instance of host type + /// + public readonly object HostObject; + + + /// + /// Constructs an instance of the key for storage of embedded objects + /// + /// Instance of host type + public EmbeddedObjectKey(object hostObject) + { + HostTypeName = hostObject.GetType().AssemblyQualifiedName; + HostObject = hostObject; + } + + + private static int CombineHashCodes(int h1, int h2) + { + return ((h1 << 5) + h1) ^ h2; + } + + #region IEquatable implementation + + public bool Equals(EmbeddedObjectKey other) + { + return EqualityComparer.Default.Equals(HostTypeName, other.HostTypeName) + && EqualityComparer.Default.Equals(HostObject, other.HostObject); + } + + #endregion + + #region IStructuralEquatable implementation + + bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer) + { + if (other == null || !(other is EmbeddedObjectKey)) + { + return false; + } + + var embeddedObjectKey = (EmbeddedObjectKey)other; + + return comparer.Equals(HostTypeName, embeddedObjectKey.HostTypeName) + && comparer.Equals(HostObject, embeddedObjectKey.HostObject); + } + + int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) + { + return CombineHashCodes(comparer.GetHashCode(HostTypeName), comparer.GetHashCode(HostObject)); + } + + #endregion + + #region IComparable implementation + + int IComparable.CompareTo(object other) + { + if (other == null) + { + return 1; + } + + if (!(other is EmbeddedObjectKey)) + { + throw new ArgumentException( + string.Format(NetCoreStrings.Common_ArgumentHasIncorrectType, nameof(other), + other.GetType().Name), + nameof(other) + ); + } + + return CompareTo((EmbeddedObjectKey)other); + } + + #endregion + + #region IComparable implementation + + public int CompareTo(EmbeddedObjectKey other) + { + int c = Comparer.Default.Compare(HostTypeName, other.HostTypeName); + if (c != 0) + { + return c; + } + + return Comparer.Default.Compare(HostObject, other.HostObject); + } + + #endregion + + #region IStructuralComparable implementation + + int IStructuralComparable.CompareTo(object other, IComparer comparer) + { + if (other == null) + { + return 1; + } + + if (!(other is EmbeddedObjectKey)) + { + throw new ArgumentException( + string.Format(NetCoreStrings.Common_ArgumentHasIncorrectType, nameof(other), + other.GetType().Name), + nameof(other) + ); + } + + var embeddedObjectKey = (EmbeddedObjectKey)other; + + int c = comparer.Compare(HostTypeName, embeddedObjectKey.HostTypeName); + if (c != 0) + { + return c; + } + + return comparer.Compare(HostObject, embeddedObjectKey.HostObject); + } + + #endregion + + #region Object overrides + + public override bool Equals(object obj) + { + return obj is EmbeddedObjectKey && Equals((EmbeddedObjectKey)obj); + } + + public override int GetHashCode() + { + return CombineHashCodes(EqualityComparer.Default.GetHashCode(HostTypeName), + EqualityComparer.Default.GetHashCode(HostObject)); + } + + public override string ToString() + { + return "(" + HostTypeName?.ToString() + ", " + HostObject?.ToString() + ")"; + } + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs new file mode 100644 index 0000000..f29a1c1 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs @@ -0,0 +1,48 @@ +#if NETSTANDARD +using System; +using System.Collections.Generic; + +namespace MsieJavaScriptEngine.JsRt.Embedding +{ + /// + /// Embedded type + /// + /// The type of the JavaScript value + /// The type of the native function + internal sealed class EmbeddedType : EmbeddedItem + where TValue : struct + where TFunction : Delegate + { + /// + /// Constructs an instance of the embedded type + /// + /// Host type + /// JavaScript value created from an host type + public EmbeddedType(Type hostType, TValue scriptValue) + : base(hostType, null, scriptValue, new List()) + { } + + /// + /// Constructs an instance of the embedded type + /// + /// Host type + /// JavaScript value created from an host type + /// List of native functions, that used to access to members of type + public EmbeddedType(Type hostType, TValue scriptValue, IList nativeFunctions) + : base(hostType, null, scriptValue, nativeFunctions) + { } + + #region EmbeddedItem overrides + + /// + /// Gets a value that indicates if the host item is an instance + /// + public override bool IsInstance + { + get { return false; } + } + + #endregion + } +} +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index ac95080..719fac1 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1,12 +1,5 @@ using System; -#if NETSTANDARD -using System.Collections.Generic; -#endif using System.Linq; -#if NETSTANDARD -using System.Reflection; -using System.Runtime.InteropServices; -#endif using System.Text; using AdvancedStringBuilder; @@ -56,6 +49,11 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// private IeJsContext _jsContext; + /// + /// Type mapper + /// + private IeTypeMapper _typeMapper; + /// /// Flag indicating whether this JS engine is supported /// @@ -65,13 +63,6 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// Support synchronizer /// private static readonly object _supportSynchronizer = new object(); -#if NETSTANDARD - - /// - /// List of native function callbacks - /// - private HashSet _nativeFunctions = new HashSet(); -#endif /// @@ -81,6 +72,8 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraIeJsRtJsEngine(JsEngineSettings settings) : base(settings) { + _typeMapper = new IeTypeMapper(); + try { _dispatcher.Invoke(() => @@ -265,622 +258,6 @@ private IeJsScope CreateJsScope() #region Mapping - /// - /// Makes a mapping of value from the host type to a script type - /// - /// The source value - /// The mapped value - private IeJsValue MapToScriptType(object value) - { - if (value == null) - { - return IeJsValue.Null; - } - - if (value is Undefined) - { - return IeJsValue.Undefined; - } - - var typeCode = value.GetType().GetTypeCode(); - - switch (typeCode) - { - case TypeCode.Boolean: - return (bool)value ? IeJsValue.True : IeJsValue.False; - - case TypeCode.SByte: - case TypeCode.Byte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - return IeJsValue.FromInt32(Convert.ToInt32(value)); - - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return IeJsValue.FromDouble(Convert.ToDouble(value)); - - case TypeCode.Char: - case TypeCode.String: - return IeJsValue.FromString((string)value); - - default: -#if NETSTANDARD - return FromObject(value); -#else - object processedValue = !TypeConverter.IsPrimitiveType(typeCode) ? - new HostObject(value, _settings.EngineMode) : value; - return IeJsValue.FromObject(processedValue); -#endif - } - } - - /// - /// Makes a mapping of array items from the host type to a script type - /// - /// The source array - /// The mapped array - private IeJsValue[] MapToScriptType(object[] args) - { - return args.Select(MapToScriptType).ToArray(); - } - - /// - /// Makes a mapping of value from the script type to a host type - /// - /// The source value - /// The mapped value - private object MapToHostType(IeJsValue value) - { - JsValueType valueType = value.ValueType; - IeJsValue processedValue; - object result; - - switch (valueType) - { - case JsValueType.Null: - result = null; - break; - case JsValueType.Undefined: - result = Undefined.Value; - break; - case JsValueType.Boolean: - processedValue = value.ConvertToBoolean(); - result = processedValue.ToBoolean(); - break; - case JsValueType.Number: - processedValue = value.ConvertToNumber(); - result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); - break; - case JsValueType.String: - processedValue = value.ConvertToString(); - result = processedValue.ToString(); - break; - case JsValueType.Object: - case JsValueType.Function: - case JsValueType.Error: - case JsValueType.Array: -#if NETSTANDARD - result = ToObject(value); -#else - processedValue = value.ConvertToObject(); - object obj = processedValue.ToObject(); - - if (!TypeConverter.IsPrimitiveType(obj.GetType())) - { - var hostObj = obj as HostObject; - result = hostObj != null ? hostObj.Target : obj; - } - else - { - result = obj; - } -#endif - break; - default: - throw new ArgumentOutOfRangeException(); - } - - return result; - } - - /// - /// Makes a mapping of array itemp from the script type to a host type - /// - /// The source array - /// The mapped array - private object[] MapToHostType(IeJsValue[] args) - { - return args.Select(MapToHostType).ToArray(); - } -#if NETSTANDARD - - private IeJsValue FromObject(object value) - { - var del = value as Delegate; - IeJsValue objValue = del != null ? CreateFunctionFromDelegate(del) : CreateExternalObjectFromObject(value); - - return objValue; - } - - private object ToObject(IeJsValue value) - { - object result = value.HasExternalData ? - GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); - - return result; - } - - private IeJsValue CreateExternalObjectFromObject(object value) - { - GCHandle handle = GCHandle.Alloc(value); - _externalObjects.Add(value); - - IeJsValue objValue = IeJsValue.CreateExternalObject( - GCHandle.ToIntPtr(handle), _externalObjectFinalizeCallback); - Type type = value.GetType(); - - ProjectFields(objValue, type, true); - ProjectProperties(objValue, type, true); - ProjectMethods(objValue, type, true); - FreezeObject(objValue); - - return objValue; - } - - private IeJsValue CreateObjectFromType(Type type) - { - IeJsValue typeValue = CreateConstructor(type); - - ProjectFields(typeValue, type, false); - ProjectProperties(typeValue, type, false); - ProjectMethods(typeValue, type, false); - FreezeObject(typeValue); - - return typeValue; - } - - private void FreezeObject(IeJsValue objValue) - { - IeJsValue objectValue = IeJsValue.GlobalObject.GetProperty("Object"); - IeJsValue freezeMethodValue = objectValue.GetProperty("freeze"); - - freezeMethodValue.CallFunction(objectValue, objValue); - } - - private IeJsValue CreateFunctionFromDelegate(Delegate value) - { - IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - ParameterInfo[] parameters = value.GetMethodInfo().GetParameters(); - IeJsValue undefinedValue = IeJsValue.Undefined; - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); - - object result; - - try - { - result = value.DynamicInvoke(processedArgs); - } - catch (Exception e) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - IeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - IeJsValue functionValue = IeJsValue.CreateFunction(nativeFunction); - - return functionValue; - } - - private IeJsValue CreateConstructor(Type type) - { - TypeInfo typeInfo = type.GetTypeInfo(); - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); - ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); - - IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue resultValue; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - object result; - - if (processedArgs.Length == 0 && typeInfo.IsValueType) - { - result = Activator.CreateInstance(type); - resultValue = MapToScriptType(result); - - return resultValue; - } - - if (constructors.Length == 0) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( - constructors, processedArgs); - if (bestFitConstructor == null) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); - - try - { - result = bestFitConstructor.Invoke(processedArgs); - } - catch (Exception e) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - IeJsValue constructorValue = IeJsValue.CreateFunction(nativeFunction); - - return constructorValue; - } - - private void ProjectFields(IeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - FieldInfo[] fields = type.GetFields(defaultBindingFlags); - - foreach (FieldInfo field in fields) - { - string fieldName = field.Name; - - IeJsValue descriptorValue = IeJsValue.CreateObject(); - descriptorValue.SetProperty("enumerable", IeJsValue.True, true); - - IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue thisValue = args[0]; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object result; - - try - { - result = field.GetValue(thisObj); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) - ; - - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - IeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeGetFunction); - - IeJsValue getMethodValue = IeJsValue.CreateFunction(nativeGetFunction); - descriptorValue.SetProperty("get", getMethodValue, true); - - IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue thisValue = args[0]; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object value = MapToHostType(args.Skip(1).First()); - ReflectionHelpers.FixFieldValueType(ref value, field); - - try - { - field.SetValue(thisObj, value); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) - ; - - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - return undefinedValue; - }; - _nativeFunctions.Add(nativeSetFunction); - - IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeSetFunction); - descriptorValue.SetProperty("set", setMethodValue, true); - - target.DefineProperty(fieldName, descriptorValue); - } - } - - private void ProjectProperties(IeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - PropertyInfo[] properties = type.GetProperties(defaultBindingFlags); - - foreach (PropertyInfo property in properties) - { - string propertyName = property.Name; - - IeJsValue descriptorValue = IeJsValue.CreateObject(); - descriptorValue.SetProperty("enumerable", IeJsValue.True, true); - - if (property.GetGetMethod() != null) - { - IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue thisValue = args[0]; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object result; - - try - { - result = property.GetValue(thisObj, new object[0]); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) - ; - - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - IeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - IeJsValue getMethodValue = IeJsValue.CreateFunction(nativeFunction); - descriptorValue.SetProperty("get", getMethodValue, true); - } - - if (property.GetSetMethod() != null) - { - IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue thisValue = args[0]; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object value = MapToHostType(args.Skip(1).First()); - ReflectionHelpers.FixPropertyValueType(ref value, property); - - try - { - property.SetValue(thisObj, value, new object[0]); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) - ; - - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - return undefinedValue; - }; - _nativeFunctions.Add(nativeFunction); - - IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeFunction); - descriptorValue.SetProperty("set", setMethodValue, true); - } - - target.DefineProperty(propertyName, descriptorValue); - } - } - - private void ProjectMethods(IeJsValue target, Type type, bool instance) - { - string typeName = type.FullName; - BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - MethodInfo[] methods = type.GetMethods(defaultBindingFlags); - IEnumerable> methodGroups = methods.GroupBy(m => m.Name); - - foreach (IGrouping methodGroup in methodGroups) - { - string methodName = methodGroup.Key; - MethodInfo[] methodCandidates = methodGroup.ToArray(); - - IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => - { - IeJsValue thisValue = args[0]; - IeJsValue undefinedValue = IeJsValue.Undefined; - - object thisObj = null; - - if (instance) - { - if (!thisValue.HasExternalData) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - thisObj = MapToHostType(thisValue); - } - - object[] processedArgs = MapToHostType(args.Skip(1).ToArray()); - - var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( - methodCandidates, processedArgs); - if (bestFitMethod == null) - { - IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); - - object result; - - try - { - result = bestFitMethod.Invoke(thisObj, processedArgs); - } - catch (Exception e) - { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) - ; - - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; - } - - IeJsValue resultValue = MapToScriptType(result); - - return resultValue; - }; - _nativeFunctions.Add(nativeFunction); - - IeJsValue methodValue = IeJsValue.CreateFunction(nativeFunction); - target.SetProperty(methodName, methodValue, true); - } - } -#endif - private WrapperException WrapJsException(OriginalException originalException, string defaultDocumentName = null) { @@ -1163,7 +540,7 @@ public override object Evaluate(string expression, string documentName) IeJsValue resultValue = IeJsContext.RunScript(expression, _jsSourceContext++, documentName); - return MapToHostType(resultValue); + return _typeMapper.MapToHostType(resultValue); } catch (OriginalException e) { @@ -1241,7 +618,7 @@ public override object CallFunction(string functionName, params object[] args) if (args.Length > 0) { - IeJsValue[] processedArgs = MapToScriptType(args); + IeJsValue[] processedArgs = _typeMapper.MapToScriptType(args); foreach (IeJsValue processedArg in processedArgs) { @@ -1270,7 +647,7 @@ public override object CallFunction(string functionName, params object[] args) resultValue = functionValue.CallFunction(globalObj); } - return MapToHostType(resultValue); + return _typeMapper.MapToHostType(resultValue); } catch (OriginalException e) { @@ -1322,7 +699,7 @@ public override object GetVariableValue(string variableName) { IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableName); - return MapToHostType(variableValue); + return _typeMapper.MapToHostType(variableValue); } catch (OriginalException e) { @@ -1342,7 +719,7 @@ public override void SetVariableValue(string variableName, object value) { try { - IeJsValue inputValue = MapToScriptType(value); + IeJsValue inputValue = _typeMapper.MapToScriptType(value); AddReferenceToValue(inputValue); try @@ -1394,7 +771,7 @@ public override void EmbedHostObject(string itemName, object value) { try { - IeJsValue processedValue = MapToScriptType(value); + IeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); } catch (OriginalException e) @@ -1413,11 +790,7 @@ public override void EmbedHostType(string itemName, Type type) { try { -#if NETSTANDARD - IeJsValue typeValue = CreateObjectFromType(type); -#else - IeJsValue typeValue = IeJsValue.FromObject(new HostType(type, _settings.EngineMode)); -#endif + IeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); } catch (OriginalException e) @@ -1456,7 +829,7 @@ public override void Dispose() /// /// Flag, allowing destruction of /// managed objects contained in fields of class - protected override void Dispose(bool disposing) + private void Dispose(bool disposing) { if (_disposedFlag.Set()) { @@ -1469,21 +842,17 @@ protected override void Dispose(bool disposing) _dispatcher.Dispose(); _dispatcher = null; } -#if NETSTANDARD - if (_nativeFunctions != null) + if (_typeMapper != null) { - _nativeFunctions.Clear(); - _nativeFunctions = null; + _typeMapper.Dispose(); + _typeMapper = null; } -#endif } else { DisposeUnmanagedResources(); } - - base.Dispose(disposing); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index d1dcf29..0186763 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -347,7 +347,7 @@ public static IeJsValue CreateObject() /// External data that the object will represent. May be null. /// A callback for when the object is finalized. May be null. /// The new Object - public static IeJsValue CreateExternalObject(IntPtr data, JsObjectFinalizeCallback finalizer) + public static IeJsValue CreateExternalObject(IntPtr data, JsFinalizeCallback finalizer) { IeJsValue reference; IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsCreateExternalObject(data, finalizer, out reference)); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 88c7676..14a6f9d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -173,7 +173,7 @@ internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsCreateExternalObject(IntPtr data, - JsObjectFinalizeCallback finalizeCallback, out IeJsValue obj); + JsFinalizeCallback finalizeCallback, out IeJsValue obj); [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToObject(IeJsValue value, out IeJsValue obj); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs new file mode 100644 index 0000000..eac848a --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -0,0 +1,638 @@ +using System; +#if NETSTANDARD +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +#endif + +using MsieJavaScriptEngine.Extensions; +using MsieJavaScriptEngine.Helpers; +#if NETSTANDARD +using MsieJavaScriptEngine.JsRt.Embedding; +using MsieJavaScriptEngine.Resources; +#endif + +namespace MsieJavaScriptEngine.JsRt.Ie +{ +#if NETSTANDARD + using IeEmbeddedObject = EmbeddedObject; + using IeEmbeddedType = EmbeddedType; + using IeEmbeddedItem = EmbeddedItem; + +#endif + /// + /// “IE” type mapper + /// + internal sealed class IeTypeMapper : TypeMapper + { + /// + /// Constructs an instance of the “IE” type mapper + /// + public IeTypeMapper() +#if !NETSTANDARD + : base(JsEngineMode.ChakraIeJsRt) +#endif + { } + + +#if !NETSTANDARD + /// + /// Creates a JavaScript value from an host object if the it does not already exist + /// + /// Instance of host type + /// JavaScript value created from an host object + public override IeJsValue GetOrCreateScriptObject(object obj) + { + var wrappedObj = new HostObject(obj, _engineMode); + IeJsValue objValue = IeJsValue.FromObject(wrappedObj); + + return objValue; + } + + /// + /// Creates a JavaScript value from an host type if the it does not already exist + /// + /// Host type + /// JavaScript value created from an host type + public override IeJsValue GetOrCreateScriptType(Type type) + { + var wrappedType = new HostType(type, _engineMode); + IeJsValue typeValue = IeJsValue.FromObject(wrappedType); + + return typeValue; + } +#endif + /// + /// Makes a mapping of value from the host type to a script type + /// + /// The source value + /// The mapped value + public override IeJsValue MapToScriptType(object value) + { + if (value == null) + { + return IeJsValue.Null; + } + + if (value is Undefined) + { + return IeJsValue.Undefined; + } + + var typeCode = value.GetType().GetTypeCode(); + + switch (typeCode) + { + case TypeCode.Boolean: + return (bool)value ? IeJsValue.True : IeJsValue.False; + + case TypeCode.SByte: + case TypeCode.Byte: + case TypeCode.Int16: + case TypeCode.UInt16: + case TypeCode.Int32: + case TypeCode.UInt32: + case TypeCode.Int64: + case TypeCode.UInt64: + return IeJsValue.FromInt32(Convert.ToInt32(value)); + + case TypeCode.Single: + case TypeCode.Double: + case TypeCode.Decimal: + return IeJsValue.FromDouble(Convert.ToDouble(value)); + + case TypeCode.Char: + case TypeCode.String: + return IeJsValue.FromString((string)value); + + default: + return GetOrCreateScriptObject(value); + } + } + + /// + /// Makes a mapping of value from the script type to a host type + /// + /// The source value + /// The mapped value + public override object MapToHostType(IeJsValue value) + { + JsValueType valueType = value.ValueType; + IeJsValue processedValue; + object result; + + switch (valueType) + { + case JsValueType.Null: + result = null; + break; + case JsValueType.Undefined: + result = Undefined.Value; + break; + case JsValueType.Boolean: + processedValue = value.ConvertToBoolean(); + result = processedValue.ToBoolean(); + break; + case JsValueType.Number: + processedValue = value.ConvertToNumber(); + result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); + break; + case JsValueType.String: + processedValue = value.ConvertToString(); + result = processedValue.ToString(); + break; + case JsValueType.Object: + case JsValueType.Function: + case JsValueType.Error: + case JsValueType.Array: +#if NETSTANDARD + result = value.HasExternalData ? + GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); +#else + processedValue = value.ConvertToObject(); + object obj = processedValue.ToObject(); + var hostObj = obj as HostObject; + result = hostObj != null ? hostObj.Target : obj; +#endif + break; + default: + throw new ArgumentOutOfRangeException(); + } + + return result; + } +#if NETSTANDARD + + protected override IeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) + { + var del = obj as Delegate; + IeEmbeddedObject embeddedObject = del != null ? + CreateEmbeddedFunction(del) : CreateEmbeddedObject(obj); + + return embeddedObject; + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private IeEmbeddedObject CreateEmbeddedObject(object obj) + { + GCHandle objHandle = GCHandle.Alloc(obj); + IntPtr objPtr = GCHandle.ToIntPtr(objHandle); + IeJsValue objValue = IeJsValue.CreateExternalObject(objPtr, _embeddedObjectFinalizeCallback); + + var embeddedObject = new IeEmbeddedObject(obj, objValue); + + ProjectFields(embeddedObject); + ProjectProperties(embeddedObject); + ProjectMethods(embeddedObject); + FreezeObject(objValue); + + return embeddedObject; + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) + { + IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + object[] processedArgs = GetHostItemMemberArguments(args); + MethodInfo method = del.GetMethodInfo(); + ParameterInfo[] parameters = method.GetParameters(); + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); + + object result; + + try + { + result = del.DynamicInvoke(processedArgs); + } + catch (Exception e) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + IeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + + GCHandle delHandle = GCHandle.Alloc(del); + IntPtr delPtr = GCHandle.ToIntPtr(delHandle); + IeJsValue prototypeValue = IeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); + + IeJsValue functionValue = IeJsValue.CreateFunction(nativeFunction); + functionValue.Prototype = prototypeValue; + + var embeddedObject = new IeEmbeddedObject(del, functionValue, + new List { nativeFunction }); + + return embeddedObject; + } + + protected override IeEmbeddedType CreateEmbeddedType(Type type) + { + TypeInfo typeInfo = type.GetTypeInfo(); + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); + ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); + + IeJsNativeFunction nativeConstructorFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + object result; + IeJsValue resultValue; + object[] processedArgs = GetHostItemMemberArguments(args); + + if (processedArgs.Length == 0 && typeInfo.IsValueType) + { + result = Activator.CreateInstance(type); + resultValue = MapToScriptType(result); + + return resultValue; + } + + if (constructors.Length == 0) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( + constructors, processedArgs); + if (bestFitConstructor == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( + string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); + + try + { + result = bestFitConstructor.Invoke(processedArgs); + } + catch (Exception e) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError( + string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + resultValue = MapToScriptType(result); + + return resultValue; + }; + + string embeddedTypeKey = type.AssemblyQualifiedName; + GCHandle embeddedTypeKeyHandle = GCHandle.Alloc(embeddedTypeKey); + IntPtr embeddedTypeKeyPtr = GCHandle.ToIntPtr(embeddedTypeKeyHandle); + IeJsValue prototypeValue = IeJsValue.CreateExternalObject(embeddedTypeKeyPtr, + _embeddedTypeFinalizeCallback); + + IeJsValue typeValue = IeJsValue.CreateFunction(nativeConstructorFunction); + typeValue.Prototype = prototypeValue; + + var embeddedType = new IeEmbeddedType(type, typeValue, + new List { nativeConstructorFunction }); + + ProjectFields(embeddedType); + ProjectProperties(embeddedType); + ProjectMethods(embeddedType); + FreezeObject(typeValue); + + return embeddedType; + } + + private void ProjectFields(IeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + IeJsValue typeValue = externalItem.ScriptValue; + bool instance = externalItem.IsInstance; + IList nativeFunctions = externalItem.NativeFunctions; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + FieldInfo[] fields = type.GetFields(defaultBindingFlags); + + foreach (FieldInfo field in fields) + { + string fieldName = field.Name; + + IeJsValue descriptorValue = IeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", IeJsValue.True, true); + + IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object result; + + try + { + result = field.GetValue(obj); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) + ; + + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + IeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeGetFunction); + + IeJsValue getMethodValue = IeJsValue.CreateFunction(nativeGetFunction); + descriptorValue.SetProperty("get", getMethodValue, true); + + IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object value = MapToHostType(args[1]); + ReflectionHelpers.FixFieldValueType(ref value, field); + + try + { + field.SetValue(obj, value); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) + ; + + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + return IeJsValue.Undefined; + }; + nativeFunctions.Add(nativeSetFunction); + + IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + + typeValue.DefineProperty(fieldName, descriptorValue); + } + } + + private void ProjectProperties(IeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + IeJsValue typeValue = externalItem.ScriptValue; + IList nativeFunctions = externalItem.NativeFunctions; + bool instance = externalItem.IsInstance; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + PropertyInfo[] properties = type.GetProperties(defaultBindingFlags); + + foreach (PropertyInfo property in properties) + { + string propertyName = property.Name; + + IeJsValue descriptorValue = IeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", IeJsValue.True, true); + + if (property.GetGetMethod() != null) + { + IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object result; + + try + { + result = property.GetValue(obj, new object[0]); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) + ; + + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + IeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeGetFunction); + + IeJsValue getMethodValue = IeJsValue.CreateFunction(nativeGetFunction); + descriptorValue.SetProperty("get", getMethodValue, true); + } + + if (property.GetSetMethod() != null) + { + IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object value = MapToHostType(args[1]); + ReflectionHelpers.FixPropertyValueType(ref value, property); + + try + { + property.SetValue(obj, value, new object[0]); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) + ; + + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + return IeJsValue.Undefined; + }; + nativeFunctions.Add(nativeSetFunction); + + IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + } + + typeValue.DefineProperty(propertyName, descriptorValue); + } + } + + private void ProjectMethods(IeEmbeddedItem externalItem) + { + Type type = externalItem.HostType; + object obj = externalItem.HostObject; + IeJsValue typeValue = externalItem.ScriptValue; + IList nativeFunctions = externalItem.NativeFunctions; + bool instance = externalItem.IsInstance; + + string typeName = type.FullName; + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + IEnumerable methods = type.GetMethods(defaultBindingFlags) + .Where(m => !(m.Attributes.HasFlag(MethodAttributes.SpecialName) + && (m.Name.StartsWith("get_") || m.Name.StartsWith("set_")))) + ; + IEnumerable> methodGroups = methods.GroupBy(m => m.Name); + + foreach (IGrouping methodGroup in methodGroups) + { + string methodName = methodGroup.Key; + MethodInfo[] methodCandidates = methodGroup.ToArray(); + + IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => + { + if (instance && obj == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( + string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + object[] processedArgs = GetHostItemMemberArguments(args); + + var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( + methodCandidates, processedArgs); + if (bestFitMethod == null) + { + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( + string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); + + object result; + + try + { + result = bestFitMethod.Invoke(obj, processedArgs); + } + catch (Exception e) + { + string errorMessage = instance ? + string.Format( + NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) + : + string.Format( + NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) + ; + + IeJsValue undefinedValue = IeJsValue.Undefined; + IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + IeJsErrorHelpers.SetException(errorValue); + + return undefinedValue; + } + + IeJsValue resultValue = MapToScriptType(result); + + return resultValue; + }; + nativeFunctions.Add(nativeFunction); + + IeJsValue methodValue = IeJsValue.CreateFunction(nativeFunction); + typeValue.SetProperty(methodName, methodValue, true); + } + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private void FreezeObject(IeJsValue objValue) + { + IeJsValue objectValue = IeJsValue.GlobalObject.GetProperty("Object"); + IeJsValue freezeMethodValue = objectValue.GetProperty("freeze"); + + freezeMethodValue.CallFunction(objectValue, objValue); + } +#endif + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsFinalizeCallback.cs similarity index 78% rename from src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs rename to src/MsieJavaScriptEngine/JsRt/JsFinalizeCallback.cs index 56b3c77..df3d031 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsObjectFinalizeCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsFinalizeCallback.cs @@ -6,5 +6,5 @@ namespace MsieJavaScriptEngine.JsRt /// The finalization callback /// /// The external data that was passed in when creating the object being finalized - internal delegate void JsObjectFinalizeCallback(IntPtr data); + internal delegate void JsFinalizeCallback(IntPtr data); } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs new file mode 100644 index 0000000..23ec121 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -0,0 +1,320 @@ +using System; +#if NETSTANDARD +using System.Collections.Concurrent; +#endif +using System.Linq; +#if NETSTANDARD +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +#endif +#if NETSTANDARD + +using MsieJavaScriptEngine.JsRt.Embedding; +using MsieJavaScriptEngine.Utilities; +#endif + +namespace MsieJavaScriptEngine.JsRt +{ + /// + /// Type mapper + /// + /// The type of the JavaScript value + /// The type of the native function + internal abstract class TypeMapper : IDisposable + where TValue : struct + where TFunction : Delegate + { +#if NETSTANDARD + /// + /// Storage for lazy-initialized embedded objects + /// + private ConcurrentDictionary>> _lazyEmbeddedObjects; + + /// + /// Callback for finalization of embedded object + /// + protected JsFinalizeCallback _embeddedObjectFinalizeCallback; + + /// + /// Synchronizer of embedded object storage's initialization + /// + private readonly object _embeddedObjectStorageInitializationSynchronizer = new object(); + + /// + /// Flag indicating whether the embedded object storage is initialized + /// + private bool _embeddedObjectStorageInitialized; + + /// + /// Storage for lazy-initialized embedded types + /// + private ConcurrentDictionary>> _lazyEmbeddedTypes; + + /// + /// Callback for finalization of embedded type + /// + protected JsFinalizeCallback _embeddedTypeFinalizeCallback; + + /// + /// Synchronizer of embedded type storage's initialization + /// + private readonly object _embeddedTypeStorageInitializationSynchronizer = new object(); + + /// + /// Flag indicating whether the embedded type storage is initialized + /// + private bool _embeddedTypeStorageInitialized; + + /// + /// Flag indicating whether this object is disposed + /// + private readonly InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); +#else + /// + /// JS engine mode + /// + protected readonly JsEngineMode _engineMode; + + + /// + /// Constructs an instance of type mapper + /// + /// JS engine mode + protected TypeMapper(JsEngineMode engineMode) + { + _engineMode = engineMode; + } +#endif + + + /// + /// Creates a JavaScript value from an host object if the it does not already exist + /// + /// Instance of host type + /// JavaScript value created from an host object +#if NETSTANDARD + public virtual TValue GetOrCreateScriptObject(object obj) + { + + if (!_embeddedObjectStorageInitialized) + { + lock (_embeddedObjectStorageInitializationSynchronizer) + { + if (!_embeddedObjectStorageInitialized) + { + _lazyEmbeddedObjects = new ConcurrentDictionary>>(); + _embeddedObjectFinalizeCallback = EmbeddedObjectFinalizeCallback; + + _embeddedObjectStorageInitialized = true; + } + } + } + + var embeddedObjectKey = new EmbeddedObjectKey(obj); + EmbeddedObject embeddedObject = _lazyEmbeddedObjects.GetOrAdd( + embeddedObjectKey, + key => new Lazy>(() => CreateEmbeddedObjectOrFunction(obj)) + ).Value; + + return embeddedObject.ScriptValue; + } +#else + public abstract TValue GetOrCreateScriptObject(object obj); +#endif + + /// + /// Creates a JavaScript value from an host type if the it does not already exist + /// + /// Host type + /// JavaScript value created from an host type +#if NETSTANDARD + public virtual TValue GetOrCreateScriptType(Type type) + { + if (!_embeddedTypeStorageInitialized) + { + lock (_embeddedTypeStorageInitializationSynchronizer) + { + if (!_embeddedTypeStorageInitialized) + { + _lazyEmbeddedTypes = new ConcurrentDictionary>>(); + _embeddedTypeFinalizeCallback = EmbeddedTypeFinalizeCallback; + + _embeddedTypeStorageInitialized = true; + } + } + } + + string embeddedTypeKey = type.AssemblyQualifiedName; + EmbeddedType embeddedType = _lazyEmbeddedTypes.GetOrAdd( + embeddedTypeKey, + key => new Lazy>(() => CreateEmbeddedType(type)) + ).Value; + + return embeddedType.ScriptValue; + } +#else + public abstract TValue GetOrCreateScriptType(Type type); +#endif + + /// + /// Makes a mapping of value from the host type to a script type + /// + /// The source value + /// The mapped value + public abstract TValue MapToScriptType(object value); + + /// + /// Makes a mapping of array items from the host type to a script type + /// + /// The source array + /// The mapped array + public virtual TValue[] MapToScriptType(object[] args) + { + return args.Select(MapToScriptType).ToArray(); + } + + /// + /// Makes a mapping of value from the script type to a host type + /// + /// The source value + /// The mapped value + public abstract object MapToHostType(TValue value); + + /// + /// Makes a mapping of array items from the script type to a host type + /// + /// The source array + /// The mapped array + public virtual object[] MapToHostType(TValue[] args) + { + return args.Select(MapToHostType).ToArray(); + } +#if NETSTANDARD + + protected abstract EmbeddedObject CreateEmbeddedObjectOrFunction(object obj); + + private void EmbeddedObjectFinalizeCallback(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return; + } + + GCHandle objHandle = GCHandle.FromIntPtr(ptr); + object obj = objHandle.Target; + var lazyEmbeddedObjects = _lazyEmbeddedObjects; + + if (obj != null && lazyEmbeddedObjects != null) + { + var embeddedObjectKey = new EmbeddedObjectKey(obj); + Lazy> lazyEmbeddedObject; + + if (lazyEmbeddedObjects.TryRemove(embeddedObjectKey, out lazyEmbeddedObject)) + { + lazyEmbeddedObject.Value?.Dispose(); + } + } + + objHandle.Free(); + } + + protected abstract EmbeddedType CreateEmbeddedType(Type type); + + private void EmbeddedTypeFinalizeCallback(IntPtr ptr) + { + if (ptr == IntPtr.Zero) + { + return; + } + + GCHandle embeddedTypeKeyHandle = GCHandle.FromIntPtr(ptr); + var embeddedTypeKey = (string)embeddedTypeKeyHandle.Target; + var lazyEmbeddedTypes = _lazyEmbeddedTypes; + + if (!string.IsNullOrEmpty(embeddedTypeKey) && lazyEmbeddedTypes != null) + { + Lazy> lazyEmbeddedType; + + if (lazyEmbeddedTypes.TryRemove(embeddedTypeKey, out lazyEmbeddedType)) + { + lazyEmbeddedType.Value?.Dispose(); + } + } + + embeddedTypeKeyHandle.Free(); + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + protected object[] GetHostItemMemberArguments(TValue[] args) + { + object[] processedArgs = args.Length > 1 ? + MapToHostType(args.Skip(1).ToArray()) : new object[0]; + + return processedArgs; + } +#endif + + #region IDisposable implementation + + /// + /// Disposes a type mapper + /// + public virtual void Dispose() + { +#if NETSTANDARD + if (_disposedFlag.Set()) + { + var lazyEmbeddedObjects = _lazyEmbeddedObjects; + if (lazyEmbeddedObjects != null) + { + if (lazyEmbeddedObjects.Count > 0) + { + foreach (EmbeddedObjectKey key in lazyEmbeddedObjects.Keys) + { + Lazy> lazyEmbeddedObject; + + if (lazyEmbeddedObjects.TryGetValue(key, out lazyEmbeddedObject)) + { + lazyEmbeddedObject.Value?.Dispose(); + } + } + + lazyEmbeddedObjects.Clear(); + } + + _lazyEmbeddedObjects = null; + } + + _embeddedObjectFinalizeCallback = null; + + var lazyEmbeddedTypes = _lazyEmbeddedTypes; + if (lazyEmbeddedTypes != null) + { + if (lazyEmbeddedTypes.Count > 0) + { + foreach (string key in lazyEmbeddedTypes.Keys) + { + Lazy> lazyEmbeddedType; + + if (lazyEmbeddedTypes.TryGetValue(key, out lazyEmbeddedType)) + { + lazyEmbeddedType.Value?.Dispose(); + } + } + + lazyEmbeddedTypes.Clear(); + } + + _lazyEmbeddedTypes = null; + } + + _embeddedTypeFinalizeCallback = null; + } +#endif + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 59c6df5..6f841f1 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -5,6 +5,7 @@ 3.0.0 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 + 7.3 Library true $(NoWarn);CS1591;NU5125 @@ -21,7 +22,8 @@ git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; -2. Fixed a error, that occurred during setting a value to field of embedded type. +2. Fixed a error, that occurred during setting a value to field of embedded type; +3. In version for .NET Core improved a performance of the embedding of objects and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index e2e4c78..8941c62 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -57,6 +57,14 @@ internal static CultureInfo Culture } } + /// + /// Looks up a localized string similar to "The parameter '{0}' must have a `{1}` type." + /// + internal static string Common_ArgumentHasIncorrectType + { + get { return GetString("Common_ArgumentHasIncorrectType"); } + } + /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." /// diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx index f3cfa54..6b88f7b 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + The parameter '{0}' must have a `{1}` type. + Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx index 7938acc..a7d1b9c 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Параметр с именем "{0}" должен иметь тип `{1}`! + Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index d1c42fb..8f694f6 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -24,7 +24,9 @@ 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; 2. Fixed a error, that occurred during setting a value to field of embedded - type. + type; + 3. In version for .NET Core improved a performance of the embedding of objects + and types. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index de6b0a2..fe29400 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -7,6 +7,7 @@ 1.0.13 Library true + true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index c84f41c..f75f4f0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -6,6 +6,7 @@ net40;net451 Library true + true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 3ee42aa..0ee9335 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -7,6 +7,7 @@ 1.0.13 Library true + true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index c291434..eeacba9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -7,6 +7,7 @@ 1.0.13 Library true + true false diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 26003fb..ec47c0c 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -6,6 +6,7 @@ net40;net451 Library true + true false diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 6d63740..f4835d9 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -7,6 +7,7 @@ 1.0.13 Library true + true false From a4537d1cdcb65b52f64140ed743124df5d32a956 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 22 Jan 2019 21:17:04 +0300 Subject: [PATCH 163/238] In version for .NET Framework improved a performance of the embedding of objects and types --- .../Helpers/ReflectionHelpers.cs | 26 ++++++++-- src/MsieJavaScriptEngine/HostItemBase.cs | 50 +++++++++---------- src/MsieJavaScriptEngine/HostObject.cs | 46 +++++++++-------- src/MsieJavaScriptEngine/HostType.cs | 6 ++- .../JsRt/Edge/EdgeTypeMapper.cs | 4 +- .../JsRt/Ie/IeTypeMapper.cs | 4 +- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 +- 8 files changed, 81 insertions(+), 60 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 3ecbcc7..32bedd4 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,10 +1,13 @@ -#if NETSTANDARD -using System; +using System; +#if NETSTANDARD using System.Collections.Generic; using System.Linq; +#endif using System.Reflection; +#if NETSTANDARD using MsieJavaScriptEngine.Utilities; +#endif namespace MsieJavaScriptEngine.Helpers { @@ -28,6 +31,21 @@ public static BindingFlags GetDefaultBindingFlags(bool instance) return bindingFlags; } + public static bool IsFullyFledgedMethod(MethodInfo method) + { + if (!method.Attributes.HasFlag(MethodAttributes.SpecialName)) + { + return true; + } + + string name = method.Name; + bool isFullyFledged = !(name.StartsWith("get_", StringComparison.Ordinal) + || name.StartsWith("set_", StringComparison.Ordinal)); + + return isFullyFledged; + } +#if NETSTANDARD + public static void FixFieldValueType(ref object value, FieldInfo field) { Type valueType = value.GetType(); @@ -208,6 +226,6 @@ public ushort CompatibilityScore set; } } +#endif } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index 9fdff1a..b28fee3 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -1,9 +1,10 @@ #if !NETSTANDARD using System; using System.Globalization; -using System.Linq; using System.Reflection; +using MsieJavaScriptEngine.Helpers; + namespace MsieJavaScriptEngine { /// @@ -22,7 +23,7 @@ internal abstract class HostItemBase : IReflect protected readonly object _target; /// - /// JavaScript engine mode + /// JS engine mode /// protected readonly JsEngineMode _engineMode; @@ -31,6 +32,11 @@ internal abstract class HostItemBase : IReflect /// private readonly FieldInfo[] _fields; + /// + /// List of field names + /// + private string[] _fieldNames; + /// /// List of properties /// @@ -63,19 +69,18 @@ protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool i _target = target; _engineMode = engineMode; - BindingFlags bindingFlags = BindingFlags.Public; - if (instance) - { - bindingFlags |= BindingFlags.Instance; - } - else - { - bindingFlags |= BindingFlags.Static; - } - - _fields = _type.GetFields(bindingFlags); - _properties = _type.GetProperties(bindingFlags); - _methods = _type.GetMethods(bindingFlags); + BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); + FieldInfo[] fields = _type.GetFields(defaultBindingFlags); + string[] fieldNames = fields.Length > 0 ? Array.ConvertAll(fields, f => f.Name) : new string[0]; + PropertyInfo[] properties = _type.GetProperties(defaultBindingFlags); + MethodInfo[] methods = _type.GetMethods(defaultBindingFlags); + MethodInfo[] fullyFledgedMethods = methods.Length > 0 ? + Array.FindAll(methods, ReflectionHelpers.IsFullyFledgedMethod) : methods; + + _fields = fields; + _fieldNames = fieldNames; + _properties = properties; + _methods = fullyFledgedMethods; } @@ -89,8 +94,7 @@ protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Bind if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) || processedInvokeAttr.HasFlag(BindingFlags.SetProperty) || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - && !_properties.Any(p => p.Name == name) - && _fields.Any(p => p.Name == name)) + && Array.IndexOf(_fieldNames, name) != -1) { if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) { @@ -125,9 +129,7 @@ Type IReflect.UnderlyingSystemType FieldInfo IReflect.GetField(string name, BindingFlags bindingAttr) { - FieldInfo field = _fields.SingleOrDefault(f => f.Name == name); - - return field; + throw new NotImplementedException(); } FieldInfo[] IReflect.GetFields(BindingFlags bindingAttr) @@ -147,9 +149,7 @@ MemberInfo[] IReflect.GetMembers(BindingFlags bindingAttr) MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr) { - MethodInfo method = _methods.SingleOrDefault(m => m.Name == name); - - return method; + throw new NotImplementedException(); } MethodInfo IReflect.GetMethod(string name, BindingFlags bindingAttr, Binder binder, Type[] types, ParameterModifier[] modifiers) @@ -169,9 +169,7 @@ PropertyInfo[] IReflect.GetProperties(BindingFlags bindingAttr) PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr) { - PropertyInfo property = _properties.SingleOrDefault(p => p.Name == name); - - return property; + throw new NotImplementedException(); } PropertyInfo IReflect.GetProperty(string name, BindingFlags bindingAttr, Binder binder, diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 5a0a6c9..6fd5512 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -14,6 +14,12 @@ namespace MsieJavaScriptEngine /// internal sealed class HostObject : HostItemBase { + /// + /// Number of delegate parameters + /// + private int _delegateParameterCount = int.MinValue; + + /// /// Constructs an instance of the wrapper for object, that implements interface /// @@ -21,29 +27,18 @@ internal sealed class HostObject : HostItemBase /// JS engine mode public HostObject(object target, JsEngineMode engineMode) : base(target.GetType(), target, engineMode, true) - { } - - - private object InvokeDelegate(Delegate del, object[] args) { - if (del == null) - { - throw new ArgumentNullException(nameof(del)); - } - - object[] processedArgs = args; - - if (_engineMode == JsEngineMode.Classic && processedArgs.Length > 0 - && del.Method.ReturnType != typeof(void)) + if (_engineMode == JsEngineMode.Classic) { - processedArgs = processedArgs.Skip(1).ToArray(); + var del = _target as Delegate; + if (del != null) + { + _delegateParameterCount = del.Method.GetParameters().Length; + } } - - object result = del.DynamicInvoke(processedArgs); - - return result; } + #region HostItemBase overrides protected override object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, @@ -51,15 +46,26 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr { object result; object processedTarget = TypeMappingHelpers.MapToHostType(target); - object[] processedArgs = TypeMappingHelpers.MapToHostType(args); if (name == SpecialMemberName.Default && processedTarget is Delegate) { var del = (Delegate)processedTarget; - result = InvokeDelegate(del, processedArgs); + object[] processedArgs = args; + + if (_engineMode == JsEngineMode.Classic + && processedArgs.Length > 0 + && (processedArgs.Length - _delegateParameterCount) == 1) + { + processedArgs = processedArgs.Skip(1).ToArray(); + } + processedArgs = TypeMappingHelpers.MapToHostType(processedArgs); + + result = del.DynamicInvoke(processedArgs); } else { + object[] processedArgs = TypeMappingHelpers.MapToHostType(args); + result = InvokeStandardMember(name, invokeAttr, binder, processedTarget, processedArgs, modifiers, culture, namedParameters); } diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs index cca63a9..5b02a50 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -29,20 +29,24 @@ public HostType(Type type, JsEngineMode engineMode) protected override object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { - object[] processedArgs = TypeMappingHelpers.MapToHostType(args); object result; if (name == SpecialMemberName.Default && invokeAttr.HasFlag(BindingFlags.CreateInstance)) { + object[] processedArgs = args; + if (_engineMode != JsEngineMode.Classic && processedArgs.Length > 0) { processedArgs = processedArgs.Skip(1).ToArray(); } + processedArgs = TypeMappingHelpers.MapToHostType(processedArgs); result = Activator.CreateInstance(_type, processedArgs); } else { + object[] processedArgs = TypeMappingHelpers.MapToHostType(args); + result = InvokeStandardMember(name, invokeAttr, binder, target, processedArgs, modifiers, culture, namedParameters); } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 9abc471..3163cb2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -556,9 +556,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); IEnumerable methods = type.GetMethods(defaultBindingFlags) - .Where(m => !(m.Attributes.HasFlag(MethodAttributes.SpecialName) - && (m.Name.StartsWith("get_") || m.Name.StartsWith("set_")))) - ; + .Where(ReflectionHelpers.IsFullyFledgedMethod); IEnumerable> methodGroups = methods.GroupBy(m => m.Name); foreach (IGrouping methodGroup in methodGroups) diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index eac848a..0cda670 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -553,9 +553,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); IEnumerable methods = type.GetMethods(defaultBindingFlags) - .Where(m => !(m.Attributes.HasFlag(MethodAttributes.SpecialName) - && (m.Name.StartsWith("get_") || m.Name.StartsWith("set_")))) - ; + .Where(ReflectionHelpers.IsFullyFledgedMethod); IEnumerable> methodGroups = methods.GroupBy(m => m.Name); foreach (IGrouping methodGroup in methodGroups) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 6f841f1..da6d562 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -23,7 +23,7 @@ JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; 2. Fixed a error, that occurred during setting a value to field of embedded type; -3. In version for .NET Core improved a performance of the embedding of objects and types. +3. Improved a performance of the embedding of objects and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8f694f6..cda06b4 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -25,8 +25,7 @@ delegate, which does not return a result; 2. Fixed a error, that occurred during setting a value to field of embedded type; - 3. In version for .NET Core improved a performance of the embedding of objects - and types. + 3. Improved a performance of the embedding of objects and types. ============ PROJECT SITE From a96ec5daae50c1704045f027da73e51d57744de9 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 23 Jan 2019 14:38:03 +0300 Subject: [PATCH 164/238] Accelerated a conversion of script types to host types --- .../JsRt/Edge/EdgeTypeMapper.cs | 13 +++++-------- src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs | 13 +++++-------- .../MsieJavaScriptEngine.csproj | 3 ++- src/MsieJavaScriptEngine/readme.txt | 3 ++- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 3163cb2..97ed635 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -123,7 +123,6 @@ public override EdgeJsValue MapToScriptType(object value) public override object MapToHostType(EdgeJsValue value) { JsValueType valueType = value.ValueType; - EdgeJsValue processedValue; object result; switch (valueType) @@ -135,16 +134,13 @@ public override object MapToHostType(EdgeJsValue value) result = Undefined.Value; break; case JsValueType.Boolean: - processedValue = value.ConvertToBoolean(); - result = processedValue.ToBoolean(); + result = value.ToBoolean(); break; case JsValueType.Number: - processedValue = value.ConvertToNumber(); - result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); + result = NumericHelpers.CastDoubleValueToCorrectType(value.ToDouble()); break; case JsValueType.String: - processedValue = value.ConvertToString(); - result = processedValue.ToString(); + result = value.ToString(); break; case JsValueType.Object: case JsValueType.Function: @@ -154,7 +150,8 @@ public override object MapToHostType(EdgeJsValue value) result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); #else - processedValue = value.ConvertToObject(); + EdgeJsValue processedValue = valueType != JsValueType.Object ? + value.ConvertToObject() : value; object obj = processedValue.ToObject(); var hostObj = obj as HostObject; result = hostObj != null ? hostObj.Target : obj; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index 0cda670..e8daf93 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -120,7 +120,6 @@ public override IeJsValue MapToScriptType(object value) public override object MapToHostType(IeJsValue value) { JsValueType valueType = value.ValueType; - IeJsValue processedValue; object result; switch (valueType) @@ -132,16 +131,13 @@ public override object MapToHostType(IeJsValue value) result = Undefined.Value; break; case JsValueType.Boolean: - processedValue = value.ConvertToBoolean(); - result = processedValue.ToBoolean(); + result = value.ToBoolean(); break; case JsValueType.Number: - processedValue = value.ConvertToNumber(); - result = NumericHelpers.CastDoubleValueToCorrectType(processedValue.ToDouble()); + result = NumericHelpers.CastDoubleValueToCorrectType(value.ToDouble()); break; case JsValueType.String: - processedValue = value.ConvertToString(); - result = processedValue.ToString(); + result = value.ToString(); break; case JsValueType.Object: case JsValueType.Function: @@ -151,7 +147,8 @@ public override object MapToHostType(IeJsValue value) result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); #else - processedValue = value.ConvertToObject(); + IeJsValue processedValue = valueType != JsValueType.Object ? + value.ConvertToObject() : value; object obj = processedValue.ToObject(); var hostObj = obj as HostObject; result = hostObj != null ? hostObj.Target : obj; diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index da6d562..bad47c9 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -23,7 +23,8 @@ JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; 2. Fixed a error, that occurred during setting a value to field of embedded type; -3. Improved a performance of the embedding of objects and types. +3. Improved a performance of the embedding of objects and types; +4. Accelerated a conversion of script types to host types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index cda06b4..7ca016f 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -25,7 +25,8 @@ delegate, which does not return a result; 2. Fixed a error, that occurred during setting a value to field of embedded type; - 3. Improved a performance of the embedding of objects and types. + 3. Improved a performance of the embedding of objects and types; + 4. Accelerated a conversion of script types to host types. ============ PROJECT SITE From d4255f196e10a43b087079ccb30b0079c4d9bdb7 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 23 Jan 2019 18:42:58 +0300 Subject: [PATCH 165/238] Small performance improvements --- .../Helpers/ReflectionHelpers.cs | 24 ++++++++++++- src/MsieJavaScriptEngine/HostItemBase.cs | 35 +++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 32bedd4..c8994c1 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -44,7 +44,29 @@ public static bool IsFullyFledgedMethod(MethodInfo method) return isFullyFledged; } -#if NETSTANDARD +#if !NETSTANDARD + + public static MethodInfo[] GetFullyFledgedMethods(MethodInfo[] methods) + { + int methodCount = methods.Length; + var fullyFledgedMethods = new MethodInfo[methodCount]; + int fullyFledgedMethodIndex = 0; + + for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) + { + MethodInfo method = methods[methodIndex]; + if (IsFullyFledgedMethod(method)) + { + fullyFledgedMethods[fullyFledgedMethodIndex] = method; + fullyFledgedMethodIndex++; + } + } + + Array.Resize(ref fullyFledgedMethods, fullyFledgedMethodIndex); + + return fullyFledgedMethods; + } +#else public static void FixFieldValueType(ref object value, FieldInfo field) { diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index b28fee3..55bd380 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -32,11 +32,6 @@ internal abstract class HostItemBase : IReflect /// private readonly FieldInfo[] _fields; - /// - /// List of field names - /// - private string[] _fieldNames; - /// /// List of properties /// @@ -71,19 +66,37 @@ protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool i BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); FieldInfo[] fields = _type.GetFields(defaultBindingFlags); - string[] fieldNames = fields.Length > 0 ? Array.ConvertAll(fields, f => f.Name) : new string[0]; PropertyInfo[] properties = _type.GetProperties(defaultBindingFlags); MethodInfo[] methods = _type.GetMethods(defaultBindingFlags); - MethodInfo[] fullyFledgedMethods = methods.Length > 0 ? - Array.FindAll(methods, ReflectionHelpers.IsFullyFledgedMethod) : methods; + if (methods.Length > 0 && properties.Length > 0) + { + methods = ReflectionHelpers.GetFullyFledgedMethods(methods); + } _fields = fields; - _fieldNames = fieldNames; _properties = properties; - _methods = fullyFledgedMethods; + _methods = methods; } + private bool IsField(string name) + { + bool isField = false; + FieldInfo[] fields = _fields; + int fieldCount = fields.Length; + + for (int fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) + { + if (fields[fieldIndex].Name.Equals(name, StringComparison.Ordinal)) + { + isField = true; + break; + } + } + + return isField; + } + protected abstract object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters); @@ -94,7 +107,7 @@ protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Bind if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) || processedInvokeAttr.HasFlag(BindingFlags.SetProperty) || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - && Array.IndexOf(_fieldNames, name) != -1) + && IsField(name)) { if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) { From ca0d594600916afa23acc92c6e5bb633f506c003 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 23 Jan 2019 20:06:21 +0300 Subject: [PATCH 166/238] Version 3.0.1 --- CHANGELOG.md | 6 ++++++ LICENSE.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs | 4 ++-- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 13 files changed, 20 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bf35a3..40fdee1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,12 @@ Change log ========== +## v3.0.1 - January 23, 2019 + * Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result + * Fixed a error, that occurred during setting a value to field of embedded type + * Improved a performance of the embedding of objects and types + * Accelerated a conversion of script types to host types + ## v3.0.0 - December 24, 2018 * Format of the error messages was unified * Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException`, `JsInterruptedException`, `JsScriptException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class. diff --git a/LICENSE.txt b/LICENSE.txt index 884ed24..ec5a787 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2019 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index bc1dfcf..e83d6ab 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - Copyright © 2012-2018 Andrey Taritsyn + Copyright © 2012-2019 Andrey Taritsyn diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index e8daf93..a1fc3e5 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -17,9 +17,9 @@ namespace MsieJavaScriptEngine.JsRt.Ie { #if NETSTANDARD + using IeEmbeddedItem = EmbeddedItem; using IeEmbeddedObject = EmbeddedObject; using IeEmbeddedType = EmbeddedType; - using IeEmbeddedItem = EmbeddedItem; #endif /// @@ -45,7 +45,7 @@ public IeTypeMapper() /// JavaScript value created from an host object public override IeJsValue GetOrCreateScriptObject(object obj) { - var wrappedObj = new HostObject(obj, _engineMode); + var wrappedObj = new HostObject(obj, _engineMode); IeJsValue objValue = IeJsValue.FromObject(wrappedObj); return objValue; diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index bad47c9..3a8349e 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.0 + 3.0.1 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 7ca016f..a8a569b 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.0 + README file for MSIE JavaScript Engine for .NET v3.0.1 -------------------------------------------------------------------------------- - Copyright (c) 2012-2018 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2019 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 836a8c4..a8f4453 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.0 + 3.0.1 net46;netcoreapp2.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index fe29400..1ba338c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.0 + 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index f75f4f0..bf1ff22 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.0 + 3.0.1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 0ee9335..6a64dda 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.0 + 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index eeacba9..74049ce 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.0 + 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index ec47c0c..0c2d3c0 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.0 + 3.0.1 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f4835d9..b15e7c5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.0 + 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.13 Library From 46875cba53551744dd018ad21af9e928d4448043 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 25 Jan 2019 16:30:56 +0300 Subject: [PATCH 167/238] CHANGELOG.md: Added a information about releases from the `2.X` branch --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40fdee1..c6f5ef5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ Change log * One part of the auxiliary code was removed, and other part moved to an external library - [AdvancedStringBuilder](https://github.com/Taritsyn/AdvancedStringBuilder) * In the `IeNativeMethods` and `EdgeNativeMethods` classes for the `netstandard` targets was changed a calling convention from `StdCall` to `Cdecl` +## v2.2.10 - November 20, 2018 + * Improved performance of debugging in ActiveScript modes + * JSON2 library was updated to version of June 12, 2017 + ## v3.0.0 RC 1 - September 18, 2018 * In JavaScript engine settings was added one new property - `MaxStackSize` (default `492` or `984` KB) * JSON2 library was updated to version of June 12, 2017 @@ -35,16 +39,25 @@ Change log ## v3.0.0 Beta 5 - August 23, 2018 * Fixed a error, that occurred during the generation of error message +## v2.2.9 - June 12, 2018 + * Changed a implementation of the `Dispose` method + ## v3.0.0 Beta 4 - June 6, 2018 * Changed a implementation of the `Dispose` method ## v3.0.0 Beta 3 - May 29, 2018 * Fixed a [error #18](https://github.com/Taritsyn/MsieJavaScriptEngine/issues/18) “Block finalizer solved?” +## v2.2.8 - May 24, 2018 + * Fixed a [error #18](https://github.com/Taritsyn/MsieJavaScriptEngine/issues/18) “Block finalizer solved?” + ## v3.0.0 Beta 2 - May 22, 2018 * In `MsieJsEngine` class was added `SupportsScriptPrecompilation` property and three new methods: `Precompile`, `PrecompileFile` and `PrecompileResource` * In JsRT modes added a ability to pre-compile scripts +## v2.2.7 - April 10, 2018 + * Fixed a minor errors + ## v3.0.0 Beta 1 - April 8, 2018 * Format of the error messages was unified * Created a new exception classes: `JsCompilationException`, `JsEngineException`, `JsFatalException` and `JsUsageException`. These exceptions are responsible for handling errors, some of which were previously handled by the `JsRuntimeException` class. @@ -55,6 +68,14 @@ Change log * `JsEngineLoadException` class now is inherited from the `JsEngineException` class * `Format` method of the `JsErrorHelpers` class was renamed to the `GenerateErrorDetails` +## v2.2.6 - February 23, 2018 + * In JsRT modes during calling of the `CollectGarbage` method is no longer performed blocking + +## v2.2.5 - December 23, 2017 + * Removed a redundant code + * Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types + * Fixed a error, that occurred during finding the suitable method overload, that receives numeric values and interfaces as parameters, of the host object + ## v3.0.0 Alpha 3 - December 10, 2017 * Added support of .NET Standard 2.0 * Fixed a error, that occurred in the `Classic` mode during removing the embedded host objects and types From 73e1b2e38fad685dd8bc9b5d7a1bec51f1813e7e Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 25 Jan 2019 18:12:32 +0300 Subject: [PATCH 168/238] =?UTF-8?q?README.md:=20Updated=20a=20=E2=80=9CWho?= =?UTF-8?q?'s=20Using=20MSIE=20JavaScript=20Engine=E2=80=9D=20section?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0464f0e..c92e4aa 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ See the [changelog](CHANGELOG.md). ## Who's Using MSIE JavaScript Engine If you use the MSIE JavaScript Engine in some project, please send me a message so I can include it in this list: - * [Cassette.Babel](http://github.com/jrsearles/Cassette.Babel) by Joshua Searles + * [BitAdminCore.ALL](http://nuget.org/packages/BitAdminCore.ALL) * [Chevron](http://github.com/SimonCropp/Chevron) by Simon Cropp * [JavaScript Engine Switcher](http://github.com/Taritsyn/JavaScriptEngineSwitcher) by Andrey Taritsyn * [PowerShell.JS](http://github.com/klumsy/powershellJS) by Karl Prosser From e744bc0b98b78dadcb32ee2d56a95c7ed860209e Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 28 Jan 2019 20:08:53 +0300 Subject: [PATCH 169/238] Changed a JS execution benchmark --- .../JsExecutionBenchmark.cs | 13 +- .../Resources/russian-translit.js | 188 ++++++++++++++++++ 2 files changed, 197 insertions(+), 4 deletions(-) diff --git a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs index d67f18f..5d18a1b 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs @@ -25,7 +25,7 @@ public class JsExecutionBenchmark /// /// Number of transliterated items /// - private const int ItemCount = 6; + private const int ItemCount = 7; /// /// Code of library for transliteration of Russian @@ -74,7 +74,8 @@ public static void PopulateTestData() _inputTypes = new string[ItemCount] { - "basic", "letters-numbers", "gost-16876-71", "gost-7-79-2000", "police", "foreign-passport" + "basic", "letters-numbers", "gost-16876-71", "gost-7-79-2000", "police", "foreign-passport", + "yandex-friendly-url" }; _inputStrings = new string[ItemCount] { @@ -95,7 +96,9 @@ public static void PopulateTestData() "«много интерфейсов, специально предназначенных для клиентов, лучше, чем один интерфейс общего назначения.»", "Принцип инверсии зависимостей (The Dependency Inversion Principle). " + - "«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»" + "«Зависимость на Абстракциях. Нет зависимости на что-то конкретное.»", + + "SOLID (объектно-ориентированное программирование)" }; _targetOutputStrings = new string[ItemCount] { @@ -118,7 +121,9 @@ public static void PopulateTestData() "naznacheniia.»", "Printcip inversii zavisimostei (The Dependency Inversion Principle). " + - "«Zavisimost na Abstraktciiakh. Net zavisimosti na chto-to konkretnoe.»" + "«Zavisimost na Abstraktciiakh. Net zavisimosti na chto-to konkretnoe.»", + + "solid-obektno-orientirovannoe-programmirovanie" }; } diff --git a/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js b/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js index 4685668..7e68866 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js +++ b/test/MsieJavaScriptEngine.Benchmarks/Resources/russian-translit.js @@ -357,6 +357,76 @@ var transliterate = (function () { 'Я': 'Ja' }, + // ISO 9:1995 + 'iso-9-1995': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'ë', + 'ж': 'ž', + 'з': 'z', + 'и': 'i', + 'й': 'j', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'h', + 'ц': 'c', + 'ч': 'č', + 'ш': 'š', + 'щ': 'ŝ', + 'ъ': '"', + 'ы': 'y', + 'ь': '\'', + 'э': 'è', + 'ю': 'û', + 'я': 'â', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'Ë', + 'Ж': 'Ž', + 'З': 'Z', + 'И': 'I', + 'Й': 'J', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'H', + 'Ц': 'C', + 'Ч': 'Č', + 'Ш': 'Š', + 'Щ': 'Ŝ', + 'Ъ': '"', + 'Ы': 'Y', + 'Ь': '\'', + 'Э': 'È', + 'Ю': 'Û', + 'Я': 'Â' + }, + // LC 'lc': { 'а': 'a', @@ -705,9 +775,123 @@ var transliterate = (function () { 'Э': 'E', 'Ю': 'Iu', 'Я': 'Ia' + }, + + // Международные телеграммы + 'international-telegrams': { + 'а': 'a', + 'б': 'b', + 'в': 'v', + 'г': 'g', + 'д': 'd', + 'е': 'e', + 'ё': 'e', + 'ж': 'j', + 'з': 'z', + 'и': 'i', + 'й': 'i', + 'к': 'k', + 'л': 'l', + 'м': 'm', + 'н': 'n', + 'о': 'o', + 'п': 'p', + 'р': 'r', + 'с': 's', + 'т': 't', + 'у': 'u', + 'ф': 'f', + 'х': 'h', + 'ц': 'c', + 'ч': 'ch', + 'ш': 'sh', + 'щ': 'sc', + 'ъ': '', + 'ы': 'y', + 'ь': '', + 'э': 'e', + 'ю': 'iu', + 'я': 'ia', + 'А': 'A', + 'Б': 'B', + 'В': 'V', + 'Г': 'G', + 'Д': 'D', + 'Е': 'E', + 'Ё': 'E', + 'Ж': 'J', + 'З': 'Z', + 'И': 'I', + 'Й': 'I', + 'К': 'K', + 'Л': 'L', + 'М': 'M', + 'Н': 'N', + 'О': 'O', + 'П': 'P', + 'Р': 'R', + 'С': 'S', + 'Т': 'T', + 'У': 'U', + 'Ф': 'F', + 'Х': 'H', + 'Ц': 'C', + 'Ч': 'Ch', + 'Ш': 'Sh', + 'Щ': 'Sc', + 'Ъ': '', + 'Ы': 'Y', + 'Ь': '', + 'Э': 'E', + 'Ю': 'Iu', + 'Я': 'Ia' } }; + function toYandexFriendlyUrl(value) { + var processedValue, + result + ; + + processedValue = value.toLowerCase(); + result = processedValue.replace(/([а-яё])|([\s_-])|([^a-z\d])/gi, + function (all, charValue, space, special, offset) { + var replacements, + charCode, + index, + transliteratedCharValue + ; + + if (space) { + return '-'; + } + + if (special) { + return ''; + } + + replacements = ['yo', 'a', 'b', 'v', 'g', 'd', 'e', 'zh', + 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', + 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', + 'shch', '', 'y', '', 'e', 'yu', 'ya']; + + charCode = charValue.charCodeAt(0); + if (charCode == 1025 || charCode == 1105) { + index = 0; + } + else { + index = charCode > 1071 ? charCode - 1071 : charCode - 1039; + } + + transliteratedCharValue = replacements[index]; + + return transliteratedCharValue; + } + ); + + return result; + } + /** * Производит транслитерацию русского текста с кириллицы на латиницу * @@ -733,6 +917,10 @@ var transliterate = (function () { return value; } + if (type === 'yandex-friendly-url') { + return toYandexFriendlyUrl(value); + } + characterMapping = characterMappings[type]; if (typeof characterMapping === 'undefined') { return value; From 1b3827b1ebbc2781323ee33090c52ab55dc7b54d Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 12 Mar 2019 18:30:41 +0300 Subject: [PATCH 170/238] Updated a version of .NET Core Runtime --- global.json | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/global.json b/global.json index 7e7134f..68679db 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.2.101" + "version": "2.2.104" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 1ba338c..eeb0c0e 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.13 + 1.0.14 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 6a64dda..6f719eb 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.13 + 1.0.14 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 74049ce..3c31d4d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.13 + 1.0.14 Library true true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index b15e7c5..6f30c1f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Common Tests 3.0.1 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.13 + 1.0.14 Library true true From 4401dec8ddc3a20b5d0457819e98ab9730ef5e36 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 12 Mar 2019 21:04:27 +0300 Subject: [PATCH 171/238] In version for .NET Core improved a embedding of delegates and types --- .../JsRt/Edge/EdgeTypeMapper.cs | 44 +++++++++++++++---- .../JsRt/Ie/IeTypeMapper.cs | 44 +++++++++++++++---- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 12 +++-- .../MsieJavaScriptEngine.csproj | 5 +-- src/MsieJavaScriptEngine/readme.txt | 7 +-- .../InteropTests.cs | 29 +++++++++++- .../InteropTests.cs | 29 +++++++++++- 7 files changed, 137 insertions(+), 33 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 97ed635..68af7ea 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -123,7 +123,7 @@ public override EdgeJsValue MapToScriptType(object value) public override object MapToHostType(EdgeJsValue value) { JsValueType valueType = value.ValueType; - object result; + object result = null; switch (valueType) { @@ -142,8 +142,23 @@ public override object MapToHostType(EdgeJsValue value) case JsValueType.String: result = value.ToString(); break; +#if NETSTANDARD + case JsValueType.Function: + EdgeJsPropertyId externalObjectPropertyId = EdgeJsPropertyId.FromString(ExternalObjectPropertyName); + if (value.HasProperty(externalObjectPropertyId)) + { + EdgeJsValue externalObjectValue = value.GetProperty(externalObjectPropertyId); + result = externalObjectValue.HasExternalData ? + GCHandle.FromIntPtr(externalObjectValue.ExternalData).Target : null; + } + + result = result ?? value.ConvertToObject(); + break; +#endif case JsValueType.Object: +#if !NETSTANDARD case JsValueType.Function: +#endif case JsValueType.Error: case JsValueType.Array: #if NETSTANDARD @@ -225,10 +240,10 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) GCHandle delHandle = GCHandle.Alloc(del); IntPtr delPtr = GCHandle.ToIntPtr(delHandle); - EdgeJsValue prototypeValue = EdgeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); + EdgeJsValue objValue = EdgeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); EdgeJsValue functionValue = EdgeJsValue.CreateFunction(nativeFunction); - functionValue.Prototype = prototypeValue; + SetNonEnumerableProperty(functionValue, ExternalObjectPropertyName, objValue); var embeddedObject = new EdgeEmbeddedObject(del, functionValue, new List { nativeFunction }); @@ -300,14 +315,13 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) return resultValue; }; - string embeddedTypeKey = type.AssemblyQualifiedName; - GCHandle embeddedTypeKeyHandle = GCHandle.Alloc(embeddedTypeKey); - IntPtr embeddedTypeKeyPtr = GCHandle.ToIntPtr(embeddedTypeKeyHandle); - EdgeJsValue prototypeValue = EdgeJsValue.CreateExternalObject(embeddedTypeKeyPtr, + GCHandle embeddedTypeHandle = GCHandle.Alloc(type); + IntPtr embeddedTypePtr = GCHandle.ToIntPtr(embeddedTypeHandle); + EdgeJsValue objValue = EdgeJsValue.CreateExternalObject(embeddedTypePtr, _embeddedTypeFinalizeCallback); EdgeJsValue typeValue = EdgeJsValue.CreateFunction(nativeConstructorFunction); - typeValue.Prototype = prototypeValue; + SetNonEnumerableProperty(typeValue, ExternalObjectPropertyName, objValue); var embeddedType = new EdgeEmbeddedType(type, typeValue, new List { nativeConstructorFunction }); @@ -624,7 +638,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] - private void FreezeObject(EdgeJsValue objValue) + private static void FreezeObject(EdgeJsValue objValue) { EdgeJsValue freezeMethodValue = EdgeJsValue.GlobalObject .GetProperty("Object") @@ -632,6 +646,18 @@ private void FreezeObject(EdgeJsValue objValue) ; freezeMethodValue.CallFunction(objValue); } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void SetNonEnumerableProperty(EdgeJsValue objValue, string name, EdgeJsValue value) + { + EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", EdgeJsValue.False, true); + descriptorValue.SetProperty("writable", EdgeJsValue.True, true); + + EdgeJsPropertyId id = EdgeJsPropertyId.FromString(name); + objValue.DefineProperty(id, descriptorValue); + objValue.SetProperty(id, value, true); + } #endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index a1fc3e5..eb1cc34 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -120,7 +120,7 @@ public override IeJsValue MapToScriptType(object value) public override object MapToHostType(IeJsValue value) { JsValueType valueType = value.ValueType; - object result; + object result = null; switch (valueType) { @@ -139,8 +139,23 @@ public override object MapToHostType(IeJsValue value) case JsValueType.String: result = value.ToString(); break; +#if NETSTANDARD + case JsValueType.Function: + IeJsPropertyId externalObjectPropertyId = IeJsPropertyId.FromString(ExternalObjectPropertyName); + if (value.HasProperty(externalObjectPropertyId)) + { + IeJsValue externalObjectValue = value.GetProperty(externalObjectPropertyId); + result = externalObjectValue.HasExternalData ? + GCHandle.FromIntPtr(externalObjectValue.ExternalData).Target : null; + } + + result = result ?? value.ConvertToObject(); + break; +#endif case JsValueType.Object: +#if !NETSTANDARD case JsValueType.Function: +#endif case JsValueType.Error: case JsValueType.Array: #if NETSTANDARD @@ -222,10 +237,10 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) GCHandle delHandle = GCHandle.Alloc(del); IntPtr delPtr = GCHandle.ToIntPtr(delHandle); - IeJsValue prototypeValue = IeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); + IeJsValue objValue = IeJsValue.CreateExternalObject(delPtr, _embeddedObjectFinalizeCallback); IeJsValue functionValue = IeJsValue.CreateFunction(nativeFunction); - functionValue.Prototype = prototypeValue; + SetNonEnumerableProperty(functionValue, ExternalObjectPropertyName, objValue); var embeddedObject = new IeEmbeddedObject(del, functionValue, new List { nativeFunction }); @@ -297,14 +312,13 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) return resultValue; }; - string embeddedTypeKey = type.AssemblyQualifiedName; - GCHandle embeddedTypeKeyHandle = GCHandle.Alloc(embeddedTypeKey); - IntPtr embeddedTypeKeyPtr = GCHandle.ToIntPtr(embeddedTypeKeyHandle); - IeJsValue prototypeValue = IeJsValue.CreateExternalObject(embeddedTypeKeyPtr, + GCHandle embeddedTypeHandle = GCHandle.Alloc(type); + IntPtr embeddedTypePtr = GCHandle.ToIntPtr(embeddedTypeHandle); + IeJsValue objValue = IeJsValue.CreateExternalObject(embeddedTypePtr, _embeddedTypeFinalizeCallback); IeJsValue typeValue = IeJsValue.CreateFunction(nativeConstructorFunction); - typeValue.Prototype = prototypeValue; + SetNonEnumerableProperty(typeValue, ExternalObjectPropertyName, objValue); var embeddedType = new IeEmbeddedType(type, typeValue, new List { nativeConstructorFunction }); @@ -621,13 +635,25 @@ private void ProjectMethods(IeEmbeddedItem externalItem) } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] - private void FreezeObject(IeJsValue objValue) + private static void FreezeObject(IeJsValue objValue) { IeJsValue objectValue = IeJsValue.GlobalObject.GetProperty("Object"); IeJsValue freezeMethodValue = objectValue.GetProperty("freeze"); freezeMethodValue.CallFunction(objectValue, objValue); } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void SetNonEnumerableProperty(IeJsValue objValue, string name, IeJsValue value) + { + IeJsValue descriptorValue = IeJsValue.CreateObject(); + descriptorValue.SetProperty("enumerable", IeJsValue.False, true); + descriptorValue.SetProperty("writable", IeJsValue.True, true); + + IeJsPropertyId id = IeJsPropertyId.FromString(name); + objValue.DefineProperty(id, descriptorValue); + objValue.SetProperty(id, value, true); + } #endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 23ec121..c2a51be 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -25,6 +25,11 @@ internal abstract class TypeMapper : IDisposable where TFunction : Delegate { #if NETSTANDARD + /// + /// Name of property to store the external object + /// + protected const string ExternalObjectPropertyName = "_MsieJavaScriptEngine_externalObject"; + /// /// Storage for lazy-initialized embedded objects /// @@ -229,8 +234,9 @@ private void EmbeddedTypeFinalizeCallback(IntPtr ptr) return; } - GCHandle embeddedTypeKeyHandle = GCHandle.FromIntPtr(ptr); - var embeddedTypeKey = (string)embeddedTypeKeyHandle.Target; + GCHandle embeddedTypeHandle = GCHandle.FromIntPtr(ptr); + var type = (Type)embeddedTypeHandle.Target; + string embeddedTypeKey = type.AssemblyQualifiedName; var lazyEmbeddedTypes = _lazyEmbeddedTypes; if (!string.IsNullOrEmpty(embeddedTypeKey) && lazyEmbeddedTypes != null) @@ -243,7 +249,7 @@ private void EmbeddedTypeFinalizeCallback(IntPtr ptr) } } - embeddedTypeKeyHandle.Free(); + embeddedTypeHandle.Free(); } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 3a8349e..4510e0e 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -21,10 +21,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result; -2. Fixed a error, that occurred during setting a value to field of embedded type; -3. Improved a performance of the embedding of objects and types; -4. Accelerated a conversion of script types to host types. + In version for .NET Core improved a embedding of delegates and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index a8a569b..62b6d26 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,12 +21,7 @@ ============= RELEASE NOTES ============= - 1. Fixed a error, that occurred in the `Classic` mode during calling an embedded - delegate, which does not return a result; - 2. Fixed a error, that occurred during setting a value to field of embedded - type; - 3. Improved a performance of the embedding of objects and types; - 4. Accelerated a conversion of script types to host types. + In version for .NET Core improved a embedding of delegates and types. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index fd62ed9..2b2ef1d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -1,4 +1,8 @@ -using NUnit.Framework; +#if NETCOREAPP +using System; + +#endif +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -18,5 +22,28 @@ protected override MsieJsEngine CreateJsEngine() return jsEngine; } +#if NETCOREAPP + + [Test] + public void EmbeddedInstanceOfDelegateHasFunctionPrototype() + { + // Arrange + var someFunc = new Func(() => 42); + + const string input = "Object.getPrototypeOf(embeddedFunc) === Function.prototype"; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("embeddedFunc", someFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.True(output); + } +#endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index 079385f..acb8eac 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -1,4 +1,8 @@ -using NUnit.Framework; +#if NETCOREAPP +using System; + +#endif +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -18,5 +22,28 @@ protected override MsieJsEngine CreateJsEngine() return jsEngine; } +#if NETCOREAPP + + [Test] + public void EmbeddedInstanceOfDelegateHasFunctionPrototype() + { + // Arrange + var someFunc = new Func(() => 42); + + const string input = "Object.getPrototypeOf(embeddedFunc) === Function.prototype"; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("embeddedFunc", someFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.True(output); + } +#endif } } \ No newline at end of file From ec81ea155d5c92c4a7bdc861bfab84d82d2a50af Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 13 Mar 2019 17:49:45 +0300 Subject: [PATCH 172/238] Version 3.0.2 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6f5ef5..67587c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.2 - March 13, 2019 + * In version for .NET Core improved a embedding of delegates and types + ## v3.0.1 - January 23, 2019 * Fixed a error, that occurred in the `Classic` mode during calling an embedded delegate, which does not return a result * Fixed a error, that occurred during setting a value to field of embedded type diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 4510e0e..5c0fef4 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.1 + 3.0.2 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 62b6d26..40e5537 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.1 + README file for MSIE JavaScript Engine for .NET v3.0.2 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index a8f4453..6caf041 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.1 + 3.0.2 net46;netcoreapp2.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index eeb0c0e..346ac29 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.1 + 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.14 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index bf1ff22..547da6f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.1 + 3.0.2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 6f719eb..98d2939 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.1 + 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.14 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 3c31d4d..f79efe9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.1 + 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.14 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 0c2d3c0..31b1d5d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.1 + 3.0.2 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 6f30c1f..54eaeb4 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.1 + 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.14 Library From 27ff75c289f05c03590f6caf529552236ec56583 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 17 Apr 2019 20:45:19 +0300 Subject: [PATCH 173/238] Was made refactoring of unit tests --- global.json | 2 +- .../CommonTests.cs | 13 +------ .../Es5Tests.cs | 14 ++----- .../InteropTests.cs | 12 +----- .../PrecompilationTests.cs | 13 +------ .../CommonTests.cs | 12 +----- .../Es5Tests.cs | 12 +----- .../InteropTests.cs | 12 +----- .../PrecompilationTests.cs | 17 +------- .../CommonTests.cs | 12 +----- .../Es5Tests.cs | 12 +----- .../InteropTests.cs | 13 +------ .../PrecompilationTests.cs | 12 +----- .../CommonTests.cs | 12 +----- .../Es5Tests.cs | 12 +----- .../InteropTests.cs | 13 +------ .../PrecompilationTests.cs | 12 +----- .../CommonTests.cs | 12 +----- .../Es5Tests.cs | 13 ++----- .../InteropTests.cs | 12 +----- .../PrecompilationTests.cs | 17 +------- .../CommonTestsBase.cs | 9 +---- .../Es5TestsBase.cs | 4 +- .../FileSystemTestsBase.cs | 2 +- .../InteropTestsBase.cs | 2 - .../PrecompilationTestsBase.cs | 9 +---- .../TestsBase.cs | 39 +++++++++++++++++++ 27 files changed, 74 insertions(+), 250 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/TestsBase.cs diff --git a/global.json b/global.json index 68679db..b1b46fc 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.2.104" + "version": "2.2.106" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs index 35081b1..12fff1c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/CommonTests.cs @@ -7,17 +7,6 @@ namespace MsieJavaScriptEngine.Test.Auto [TestFixture] public class CommonTests : CommonTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.Auto, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Auto; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs index 2133db4..4bdc032 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/Es5Tests.cs @@ -7,16 +7,8 @@ namespace MsieJavaScriptEngine.Test.Auto [TestFixture] public class Es5Tests : Es5TestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Auto, - UseEcmaScript5Polyfill = true, - UseJson2Library = true - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Auto; + protected override bool UseEcmaScript5Polyfill => true; + protected override bool UseJson2Library => true; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs index 0134590..c6e4def 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.Auto [TestFixture] public class InteropTests : InteropTestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Auto, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Auto; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs index fa985a6..f846854 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/PrecompilationTests.cs @@ -7,17 +7,6 @@ namespace MsieJavaScriptEngine.Test.Auto [TestFixture] public class PrecompilationTests : PrecompilationTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.Auto, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Auto; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index 8b1ecc2..e7a0e0d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -9,18 +9,8 @@ namespace MsieJavaScriptEngine.Test.ChakraActiveScript [TestFixture] public class CommonTests : CommonTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs index 1a17734..2075b11 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/Es5Tests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.ChakraActiveScript [TestFixture] public class Es5Tests : Es5TestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs index 44871a4..04efaa8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.ChakraActiveScript [TestFixture] public class InteropTests : InteropTestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs index a61d3fd..d4c74a2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/PrecompilationTests.cs @@ -1,6 +1,4 @@ -using System; - -using NUnit.Framework; +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -9,17 +7,6 @@ namespace MsieJavaScriptEngine.Test.ChakraActiveScript [TestFixture] public class PrecompilationTests : PrecompilationTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraActiveScript, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 9f9f5fe..0afc7e8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -10,18 +10,8 @@ namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt [TestFixture] public class CommonTests : CommonTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraEdgeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs index 9cadc18..cb3a18c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/Es5Tests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt [TestFixture] public class Es5Tests : Es5TestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraEdgeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index 2b2ef1d..85afbe8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -11,19 +11,10 @@ namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt [TestFixture] public class InteropTests : InteropTestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraEdgeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; #if NETCOREAPP + [Test] public void EmbeddedInstanceOfDelegateHasFunctionPrototype() { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs index d182fd9..94a1c6d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs @@ -10,18 +10,8 @@ namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt [TestFixture] public class PrecompilationTests : PrecompilationTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraEdgeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index f621d4e..770e9a4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -9,18 +9,8 @@ namespace MsieJavaScriptEngine.Test.ChakraIeJsRt [TestFixture] public class CommonTests : CommonTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraIeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs index dd4658f..cb44dd9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/Es5Tests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.ChakraIeJsRt [TestFixture] public class Es5Tests : Es5TestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraIeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index acb8eac..a314072 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -11,19 +11,10 @@ namespace MsieJavaScriptEngine.Test.ChakraIeJsRt [TestFixture] public class InteropTests : InteropTestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.ChakraIeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; #if NETCOREAPP + [Test] public void EmbeddedInstanceOfDelegateHasFunctionPrototype() { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs index 77ccd8d..53eda79 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs @@ -9,18 +9,8 @@ namespace MsieJavaScriptEngine.Test.ChakraIeJsRt [TestFixture] public class PrecompilationTests : PrecompilationTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.ChakraIeJsRt, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index 15be1ec..f070a05 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -9,18 +9,8 @@ namespace MsieJavaScriptEngine.Test.Classic [TestFixture] public class CommonTests : CommonTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); + protected override JsEngineMode EngineMode => JsEngineMode.Classic; - return jsEngine; - } #region Error handling diff --git a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs index 9888aa7..b447707 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs @@ -7,17 +7,10 @@ namespace MsieJavaScriptEngine.Test.Classic [TestFixture] public class Es5Tests : Es5TestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = true, - UseJson2Library = true - }); + protected override JsEngineMode EngineMode => JsEngineMode.Classic; + protected override bool UseEcmaScript5Polyfill => true; + protected override bool UseJson2Library => true; - return jsEngine; - } #region Object methods diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs index 5786691..c94d813 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -7,16 +7,6 @@ namespace MsieJavaScriptEngine.Test.Classic [TestFixture] public class InteropTests : InteropTestsBase { - protected override MsieJsEngine CreateJsEngine() - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Classic; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs index 37accee..3d0540f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/PrecompilationTests.cs @@ -1,6 +1,4 @@ -using System; - -using NUnit.Framework; +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -9,17 +7,6 @@ namespace MsieJavaScriptEngine.Test.Classic [TestFixture] public class PrecompilationTests : PrecompilationTestsBase { - protected override MsieJsEngine CreateJsEngine(bool enableDebugging) - { - var jsEngine = new MsieJsEngine(new JsEngineSettings - { - EnableDebugging = enableDebugging, - EngineMode = JsEngineMode.Classic, - UseEcmaScript5Polyfill = false, - UseJson2Library = false - }); - - return jsEngine; - } + protected override JsEngineMode EngineMode => JsEngineMode.Classic; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index aab79e3..19b28d2 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -1,6 +1,8 @@ using System; using System.IO; +#if !NET40 using System.Reflection; +#endif using System.Threading; using NUnit.Framework; @@ -10,13 +12,6 @@ namespace MsieJavaScriptEngine.Test.Common [TestFixture] public abstract class CommonTestsBase : FileSystemTestsBase { - protected virtual MsieJsEngine CreateJsEngine() - { - return CreateJsEngine(false); - } - - protected abstract MsieJsEngine CreateJsEngine(bool enableDebugging); - #region Evaluation of scripts [Test] diff --git a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs index 754cdb2..327f0eb 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs @@ -5,10 +5,8 @@ namespace MsieJavaScriptEngine.Test.Common { [TestFixture] - public abstract class Es5TestsBase + public abstract class Es5TestsBase : TestsBase { - protected abstract MsieJsEngine CreateJsEngine(); - #region Array methods [Test] diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index 671cbe2..d624cc7 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -10,7 +10,7 @@ namespace MsieJavaScriptEngine.Test.Common { - public abstract class FileSystemTestsBase + public abstract class FileSystemTestsBase : TestsBase { #if NET40 /// diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index b254d9f..56b2144 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -21,8 +21,6 @@ namespace MsieJavaScriptEngine.Test.Common [TestFixture] public abstract class InteropTestsBase : FileSystemTestsBase { - protected abstract MsieJsEngine CreateJsEngine(); - #region Embedding of objects #region Objects with fields diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index c3eeaf5..cfbad8e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -1,5 +1,7 @@ using System.IO; +#if !NET40 using System.Reflection; +#endif using System.Threading.Tasks; using NUnit.Framework; @@ -9,13 +11,6 @@ namespace MsieJavaScriptEngine.Test.Common [TestFixture] public abstract class PrecompilationTestsBase : FileSystemTestsBase { - protected virtual MsieJsEngine CreateJsEngine() - { - return CreateJsEngine(false); - } - - protected abstract MsieJsEngine CreateJsEngine(bool enableDebugging); - #region Execution of precompiled scripts [Test] diff --git a/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs new file mode 100644 index 0000000..81c99f7 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs @@ -0,0 +1,39 @@ +namespace MsieJavaScriptEngine.Test.Common +{ + public abstract class TestsBase + { + /// + /// Gets a JS engine mode + /// + protected abstract JsEngineMode EngineMode { get; } + + /// + /// Gets a flag for whether to use the ECMAScript 5 Polyfill + /// + protected virtual bool UseEcmaScript5Polyfill => false; + + /// + /// Gets a flag for whether to use the JSON2 library + /// + protected virtual bool UseJson2Library => false; + + + protected MsieJsEngine CreateJsEngine() + { + return CreateJsEngine(false); + } + + protected MsieJsEngine CreateJsEngine(bool enableDebugging) + { + var jsEngine = new MsieJsEngine(new JsEngineSettings + { + EnableDebugging = enableDebugging, + EngineMode = EngineMode, + UseEcmaScript5Polyfill = UseEcmaScript5Polyfill, + UseJson2Library = UseJson2Library + }); + + return jsEngine; + } + } +} \ No newline at end of file From 26c4f60bbb292f25b0e39c8d0d02ef7461f8ebe4 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 17 Apr 2019 21:10:09 +0300 Subject: [PATCH 174/238] Added a multithreading unit tests --- .../MultithreadingTests.cs | 12 ++++++ .../MultithreadingTests.cs | 14 +++++++ .../MultithreadingTests.cs | 15 ++++++++ .../MultithreadingTests.cs | 14 +++++++ .../MultithreadingTests.cs | 14 +++++++ .../MultithreadingTestsBase.cs | 37 +++++++++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 test/MsieJavaScriptEngine.Test.Auto/MultithreadingTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraActiveScript/MultithreadingTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MultithreadingTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MultithreadingTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Classic/MultithreadingTests.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs diff --git a/test/MsieJavaScriptEngine.Test.Auto/MultithreadingTests.cs b/test/MsieJavaScriptEngine.Test.Auto/MultithreadingTests.cs new file mode 100644 index 0000000..5077e7e --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Auto/MultithreadingTests.cs @@ -0,0 +1,12 @@ +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.Auto +{ + [TestFixture] + public class MultithreadingTests : MultithreadingTestsBase + { + protected override JsEngineMode EngineMode => JsEngineMode.Auto; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MultithreadingTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MultithreadingTests.cs new file mode 100644 index 0000000..21d93f7 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MultithreadingTests.cs @@ -0,0 +1,14 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraActiveScript +{ + [TestFixture] + public class MultithreadingTests : MultithreadingTestsBase + { + protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MultithreadingTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MultithreadingTests.cs new file mode 100644 index 0000000..bd25138 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MultithreadingTests.cs @@ -0,0 +1,15 @@ +using System; +using System.Text.RegularExpressions; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt +{ + [TestFixture] + public class MultithreadingTests : MultithreadingTestsBase + { + protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MultithreadingTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MultithreadingTests.cs new file mode 100644 index 0000000..42f5b1d --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MultithreadingTests.cs @@ -0,0 +1,14 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.ChakraIeJsRt +{ + [TestFixture] + public class MultithreadingTests : MultithreadingTestsBase + { + protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MultithreadingTests.cs b/test/MsieJavaScriptEngine.Test.Classic/MultithreadingTests.cs new file mode 100644 index 0000000..8b6577b --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Classic/MultithreadingTests.cs @@ -0,0 +1,14 @@ +using System; + +using NUnit.Framework; + +using MsieJavaScriptEngine.Test.Common; + +namespace MsieJavaScriptEngine.Test.Classic +{ + [TestFixture] + public class MultithreadingTests : MultithreadingTestsBase + { + protected override JsEngineMode EngineMode => JsEngineMode.Classic; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs new file mode 100644 index 0000000..8849530 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs @@ -0,0 +1,37 @@ +using System.Threading; + +using NUnit.Framework; + +namespace MsieJavaScriptEngine.Test.Common +{ + [TestFixture] + public abstract class MultithreadingTestsBase : TestsBase + { + [Test] + public virtual void ExecutionOfCodeFromDifferentThreadsIsCorrect() + { + // Arrange + const string variableName = "foo"; + string inputCode1 = string.Format("var {0} = 'bar';", variableName); + string inputCode2 = string.Format("{0} = 'baz';", variableName); + const string targetOutput = "baz"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.Execute(inputCode1); + + var thread = new Thread(() => jsEngine.Execute(inputCode2)); + thread.Start(); + thread.Join(); + + output = jsEngine.GetVariableValue(variableName); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + } +} \ No newline at end of file From f5e4bade6522e303ba3fdedf532f8c3ed4ed6d69 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 24 Apr 2019 20:32:31 +0300 Subject: [PATCH 175/238] In version for .NET Core was fixed a error that occurred during the recursive execution and evaluation of JS files --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 63 +++- .../JsRt/Edge/EdgeTypeMapper.cs | 290 +++++++++++------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 60 +++- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 22 ++ .../JsRt/Ie/IeTypeMapper.cs | 288 ++++++++++------- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 18 ++ .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 5 + src/MsieJavaScriptEngine/readme.txt | 3 +- .../InteropTests.cs | 65 ++++ .../InteropTests.cs | 65 ++++ .../CommonTestsBase.cs | 2 +- .../FileSystemTestsBase.cs | 10 +- .../InteropTestsBase.cs | 63 +++- .../PrecompilationTestsBase.cs | 2 +- .../recursiveEvaluation/noError/index.js | 18 ++ .../recursiveEvaluation/noError/math.js | 32 ++ .../recursiveEvaluation/runtimeError/index.js | 18 ++ .../recursiveEvaluation/runtimeError/math.js | 32 ++ .../recursiveExecution/noError/firstFile.js | 2 + .../recursiveExecution/noError/mainFile.js | 2 + .../recursiveExecution/noError/secondFile.js | 1 + 22 files changed, 808 insertions(+), 255 deletions(-) create mode 100644 test/SharedFiles/recursiveEvaluation/noError/index.js create mode 100644 test/SharedFiles/recursiveEvaluation/noError/math.js create mode 100644 test/SharedFiles/recursiveEvaluation/runtimeError/index.js create mode 100644 test/SharedFiles/recursiveEvaluation/runtimeError/math.js create mode 100644 test/SharedFiles/recursiveExecution/noError/firstFile.js create mode 100644 test/SharedFiles/recursiveExecution/noError/mainFile.js create mode 100644 test/SharedFiles/recursiveExecution/noError/secondFile.js diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index d707ae2..f6b8db4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -250,29 +250,49 @@ private WrapperException WrapJsException(OriginalException originalException, || errorValueType == JsValueType.Object) { EdgeJsValue messagePropertyValue = errorValue.GetProperty("message"); - description = messagePropertyValue.ConvertToString().ToString(); + string localDescription = messagePropertyValue.ConvertToString().ToString(); + if (!string.IsNullOrWhiteSpace(localDescription)) + { + description = localDescription; + } EdgeJsValue namePropertyValue = errorValue.GetProperty("name"); type = namePropertyValue.ValueType == JsValueType.String ? - namePropertyValue.ConvertToString().ToString() : string.Empty; + namePropertyValue.ToString() : string.Empty; - EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + EdgeJsPropertyId descriptionPropertyId = EdgeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) { - EdgeJsPropertyId descriptionPropertyId = EdgeJsPropertyId.FromString("description"); - if (errorValue.HasProperty(descriptionPropertyId)) + EdgeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + localDescription = descriptionPropertyValue.ConvertToString().ToString(); + if (!string.IsNullOrWhiteSpace(localDescription)) { - EdgeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); - if (descriptionPropertyValue.ValueType == JsValueType.String - && descriptionPropertyValue.StringLength > 0) - { - description = descriptionPropertyValue.ConvertToString().ToString(); - } + description = localDescription; } + } + if (type == JsErrorType.Syntax) + { + errorCode = JsErrorCode.ScriptCompile; + } + else + { + EdgeJsPropertyId numberPropertyId = EdgeJsPropertyId.FromString("number"); + if (errorValue.HasProperty(numberPropertyId)) + { + EdgeJsValue numberPropertyValue = errorValue.GetProperty(numberPropertyId); + int errorNumber = numberPropertyValue.ValueType == JsValueType.Number ? + numberPropertyValue.ToInt32() : 0; + errorCode = (JsErrorCode)errorNumber; + } + } + + EdgeJsPropertyId stackPropertyId = EdgeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) + { EdgeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? - stackPropertyValue.ConvertToString().ToString() : string.Empty; + stackPropertyValue.ToString() : string.Empty; string messageWithType = errorValue.ConvertToString().ToString(); string rawCallStack = messageWithTypeAndCallStack .TrimStart(messageWithType) @@ -301,21 +321,24 @@ private WrapperException WrapJsException(OriginalException originalException, if (errorValue.HasProperty(urlPropertyId)) { EdgeJsValue urlPropertyValue = errorValue.GetProperty(urlPropertyId); - documentName = urlPropertyValue.ConvertToString().ToString(); + documentName = urlPropertyValue.ValueType == JsValueType.String ? + urlPropertyValue.ToString() : string.Empty; } EdgeJsPropertyId linePropertyId = EdgeJsPropertyId.FromString("line"); if (errorValue.HasProperty(linePropertyId)) { EdgeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = linePropertyValue.ConvertToNumber().ToInt32() + 1; + lineNumber = linePropertyValue.ValueType == JsValueType.Number ? + linePropertyValue.ToInt32() + 1 : 0; } EdgeJsPropertyId columnPropertyId = EdgeJsPropertyId.FromString("column"); if (errorValue.HasProperty(columnPropertyId)) { EdgeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = columnPropertyValue.ConvertToNumber().ToInt32() + 1; + columnNumber = columnPropertyValue.ValueType == JsValueType.Number ? + columnPropertyValue.ToInt32() + 1 : 0; } string sourceLine = string.Empty; @@ -323,7 +346,8 @@ private WrapperException WrapJsException(OriginalException originalException, if (errorValue.HasProperty(sourcePropertyId)) { EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceLine = sourcePropertyValue.ConvertToString().ToString(); + sourceLine = sourcePropertyValue.ValueType == JsValueType.String ? + sourcePropertyValue.ToString() : string.Empty; ; } sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); @@ -331,6 +355,11 @@ private WrapperException WrapJsException(OriginalException originalException, lineNumber, columnNumber, sourceFragment); } } + else if (errorValueType == JsValueType.String) + { + message = errorValue.ToString(); + description = message; + } else { message = errorValue.ConvertToString().ToString(); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 68af7ea..eed2633 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -16,6 +16,12 @@ #if !NETSTANDARD using MsieJavaScriptEngine.Utilities; #endif +#if NETSTANDARD + +using WrapperException = MsieJavaScriptEngine.JsException; +using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; +using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; +#endif namespace MsieJavaScriptEngine.JsRt.Edge { @@ -111,7 +117,7 @@ public override EdgeJsValue MapToScriptType(object value) return EdgeJsValue.FromString((string)value); default: - return GetOrCreateScriptObject(value); + return value is EdgeJsValue ? (EdgeJsValue)value : GetOrCreateScriptObject(value); } } @@ -225,12 +231,17 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) } catch (Exception e) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue = wrapperException != null ? + CreateErrorFromWrapperException(wrapperException) + : + EdgeJsErrorHelpers.CreateError(string.Format( + NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) + ; EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } EdgeJsValue resultValue = MapToScriptType(result); @@ -274,24 +285,17 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) if (constructors.Length == 0) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + return EdgeJsValue.Undefined; } var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( constructors, processedArgs); if (bestFitConstructor == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetReferenceError(string.Format( + NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + return EdgeJsValue.Undefined; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); @@ -302,12 +306,17 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) } catch (Exception e) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue = wrapperException != null ? + CreateErrorFromWrapperException(wrapperException) + : + EdgeJsErrorHelpers.CreateError(string.Format( + NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) + ; EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } resultValue = MapToScriptType(result); @@ -357,12 +366,9 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) { if (instance && obj == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return EdgeJsValue.Undefined; } object result; @@ -373,17 +379,28 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) - ; - - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } EdgeJsValue resultValue = MapToScriptType(result); @@ -399,12 +416,9 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) { if (instance && obj == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return EdgeJsValue.Undefined; } object value = MapToHostType(args[1]); @@ -416,17 +430,28 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) - ; - - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } return EdgeJsValue.Undefined; @@ -465,12 +490,9 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) { if (instance && obj == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + return EdgeJsValue.Undefined; } object result; @@ -481,19 +503,28 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) - ; - - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, + typeName, exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } EdgeJsValue resultValue = MapToScriptType(result); @@ -512,12 +543,9 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) { if (instance && obj == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + return EdgeJsValue.Undefined; } object value = MapToHostType(args[1]); @@ -529,19 +557,28 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) - ; - - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, + typeName, exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } return EdgeJsValue.Undefined; @@ -579,12 +616,9 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) { if (instance && obj == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + return EdgeJsValue.Undefined; } object[] processedArgs = GetHostItemMemberArguments(args); @@ -593,12 +627,9 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) methodCandidates, processedArgs); if (bestFitMethod == null) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - EdgeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetReferenceError(string.Format( + NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + return EdgeJsValue.Undefined; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); @@ -611,19 +642,28 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) - ; - - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, + exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } EdgeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return EdgeJsValue.Undefined; } EdgeJsValue resultValue = MapToScriptType(result); @@ -658,6 +698,40 @@ private static void SetNonEnumerableProperty(EdgeJsValue objValue, string name, objValue.DefineProperty(id, descriptorValue); objValue.SetProperty(id, value, true); } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetError(string message) + { + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(message); + EdgeJsErrorHelpers.SetException(errorValue); + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetReferenceError(string message) + { + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError(message); + EdgeJsErrorHelpers.SetException(errorValue); + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetTypeError(string message) + { + EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError(message); + EdgeJsErrorHelpers.SetException(errorValue); + } + + private static EdgeJsValue CreateErrorFromWrapperException(WrapperException exception) + { + var originalException = (JsException)exception.InnerException; + var originalScriptException = originalException as EdgeJsScriptException; + EdgeJsValue errorValue = originalScriptException != null ? + originalScriptException.Error + : + EdgeJsErrorHelpers.CreateError(exception.Description) + ; + + return errorValue; + } #endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 719fac1..9d34b29 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -285,29 +285,49 @@ private WrapperException WrapJsException(OriginalException originalException, || errorValue.ValueType == JsValueType.Object) { IeJsValue messagePropertyValue = errorValue.GetProperty("message"); - description = messagePropertyValue.ConvertToString().ToString(); + string localDescription = messagePropertyValue.ConvertToString().ToString(); + if (!string.IsNullOrWhiteSpace(localDescription)) + { + description = localDescription; + } IeJsValue namePropertyValue = errorValue.GetProperty("name"); type = namePropertyValue.ValueType == JsValueType.String ? - namePropertyValue.ConvertToString().ToString() : string.Empty; + namePropertyValue.ToString() : string.Empty; - IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); - if (errorValue.HasProperty(stackPropertyId)) + IeJsPropertyId descriptionPropertyId = IeJsPropertyId.FromString("description"); + if (errorValue.HasProperty(descriptionPropertyId)) { - IeJsPropertyId descriptionPropertyId = IeJsPropertyId.FromString("description"); - if (errorValue.HasProperty(descriptionPropertyId)) + IeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); + localDescription = descriptionPropertyValue.ConvertToString().ToString(); + if (!string.IsNullOrWhiteSpace(localDescription)) { - IeJsValue descriptionPropertyValue = errorValue.GetProperty(descriptionPropertyId); - if (descriptionPropertyValue.ValueType == JsValueType.String - && descriptionPropertyValue.StringLength > 0) - { - description = descriptionPropertyValue.ConvertToString().ToString(); - } + description = localDescription; } + } + if (type == JsErrorType.Syntax) + { + errorCode = JsErrorCode.ScriptCompile; + } + else + { + IeJsPropertyId numberPropertyId = IeJsPropertyId.FromString("number"); + if (errorValue.HasProperty(numberPropertyId)) + { + IeJsValue numberPropertyValue = errorValue.GetProperty(numberPropertyId); + int errorNumber = numberPropertyValue.ValueType == JsValueType.Number ? + numberPropertyValue.ToInt32() : 0; + errorCode = (JsErrorCode)errorNumber; + } + } + + IeJsPropertyId stackPropertyId = IeJsPropertyId.FromString("stack"); + if (errorValue.HasProperty(stackPropertyId)) + { IeJsValue stackPropertyValue = errorValue.GetProperty(stackPropertyId); string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? - stackPropertyValue.ConvertToString().ToString() : string.Empty; + stackPropertyValue.ToString() : string.Empty; string messageWithType = errorValue.ConvertToString().ToString(); string rawCallStack = messageWithTypeAndCallStack .TrimStart(messageWithType) @@ -339,14 +359,16 @@ private WrapperException WrapJsException(OriginalException originalException, if (errorValue.HasProperty(linePropertyId)) { IeJsValue linePropertyValue = errorValue.GetProperty(linePropertyId); - lineNumber = (int)linePropertyValue.ConvertToNumber().ToDouble() + 1; + lineNumber = linePropertyValue.ValueType == JsValueType.Number ? + linePropertyValue.ToInt32() + 1 : 0; } IeJsPropertyId columnPropertyId = IeJsPropertyId.FromString("column"); if (errorValue.HasProperty(columnPropertyId)) { IeJsValue columnPropertyValue = errorValue.GetProperty(columnPropertyId); - columnNumber = (int)columnPropertyValue.ConvertToNumber().ToDouble() + 1; + columnNumber = columnPropertyValue.ValueType == JsValueType.Number ? + columnPropertyValue.ToInt32() + 1 : 0; } string sourceLine = string.Empty; @@ -354,7 +376,8 @@ private WrapperException WrapJsException(OriginalException originalException, if (errorValue.HasProperty(sourcePropertyId)) { IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); - sourceLine = sourcePropertyValue.ConvertToString().ToString(); + sourceLine = sourcePropertyValue.ValueType == JsValueType.String ? + sourcePropertyValue.ToString() : string.Empty; } sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); @@ -362,6 +385,11 @@ private WrapperException WrapJsException(OriginalException originalException, lineNumber, columnNumber, sourceFragment); } } + else if (errorValueType == JsValueType.String) + { + message = errorValue.ToString(); + description = message; + } else { message = errorValue.ConvertToString().ToString(); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index 0186763..d429422 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.JsRt.Ie @@ -568,6 +569,27 @@ public double ToDouble() return value; } + /// + /// Retrieves a int value of a Number value + /// + /// + /// + /// This function retrieves the value of a Number value. It will fail with + /// InvalidArgument if the type of the value is not Number. + /// + /// + /// Requires an active script context. + /// + /// + /// The int value + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + public int ToInt32() + { + int value = (int)ToDouble(); + + return value; + } + /// /// Retrieves a string pointer of a String value /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index eb1cc34..ea7ae37 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -12,6 +12,10 @@ #if NETSTANDARD using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Resources; + +using WrapperException = MsieJavaScriptEngine.JsException; +using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; +using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; #endif namespace MsieJavaScriptEngine.JsRt.Ie @@ -108,7 +112,7 @@ public override IeJsValue MapToScriptType(object value) return IeJsValue.FromString((string)value); default: - return GetOrCreateScriptObject(value); + return value is IeJsValue ? (IeJsValue)value : GetOrCreateScriptObject(value); } } @@ -222,12 +226,17 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) } catch (Exception e) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostDelegateInvocationFailed, e.Message)); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue = wrapperException != null ? + CreateErrorFromWrapperException(wrapperException) + : + IeJsErrorHelpers.CreateError(string.Format( + NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) + ; IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } IeJsValue resultValue = MapToScriptType(result); @@ -271,24 +280,17 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) if (constructors.Length == 0) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + return IeJsValue.Undefined; } var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( constructors, processedArgs); if (bestFitConstructor == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetReferenceError(string.Format( + NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + return IeJsValue.Undefined; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); @@ -299,12 +301,17 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) } catch (Exception e) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError( - string.Format(NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, e.Message)); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue = wrapperException != null ? + CreateErrorFromWrapperException(wrapperException) + : + IeJsErrorHelpers.CreateError(string.Format( + NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) + ; IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } resultValue = MapToScriptType(result); @@ -354,12 +361,9 @@ private void ProjectFields(IeEmbeddedItem externalItem) { if (instance && obj == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return IeJsValue.Undefined; } object result; @@ -370,17 +374,28 @@ private void ProjectFields(IeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, e.Message) - ; - - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } IeJsValue resultValue = MapToScriptType(result); @@ -396,12 +411,9 @@ private void ProjectFields(IeEmbeddedItem externalItem) { if (instance && obj == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return IeJsValue.Undefined; } object value = MapToHostType(args[1]); @@ -413,17 +425,28 @@ private void ProjectFields(IeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, e.Message) - : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, e.Message) - ; - - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } return IeJsValue.Undefined; @@ -462,12 +485,9 @@ private void ProjectProperties(IeEmbeddedItem externalItem) { if (instance && obj == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + return IeJsValue.Undefined; } object result; @@ -478,19 +498,28 @@ private void ProjectProperties(IeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, e.Message) - ; - - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, + typeName, exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } IeJsValue resultValue = MapToScriptType(result); @@ -509,12 +538,9 @@ private void ProjectProperties(IeEmbeddedItem externalItem) { if (instance && obj == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + return IeJsValue.Undefined; } object value = MapToHostType(args[1]); @@ -526,19 +552,28 @@ private void ProjectProperties(IeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, e.Message) - ; - - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, + typeName, exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } return IeJsValue.Undefined; @@ -576,12 +611,9 @@ private void ProjectMethods(IeEmbeddedItem externalItem) { if (instance && obj == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError( - string.Format(NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetTypeError(string.Format( + NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + return IeJsValue.Undefined; } object[] processedArgs = GetHostItemMemberArguments(args); @@ -590,12 +622,9 @@ private void ProjectMethods(IeEmbeddedItem externalItem) methodCandidates, processedArgs); if (bestFitMethod == null) { - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError( - string.Format(NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - IeJsErrorHelpers.SetException(errorValue); - - return undefinedValue; + CreateAndSetReferenceError(string.Format( + NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + return IeJsValue.Undefined; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); @@ -608,19 +637,28 @@ private void ProjectMethods(IeEmbeddedItem externalItem) } catch (Exception e) { - string errorMessage = instance ? - string.Format( - NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, e.Message) - : - string.Format( - NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, e.Message) - ; - - IeJsValue undefinedValue = IeJsValue.Undefined; - IeJsValue errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException != null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, + exception.Message) + : + string.Format(NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, + typeName, exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } IeJsErrorHelpers.SetException(errorValue); - return undefinedValue; + return IeJsValue.Undefined; } IeJsValue resultValue = MapToScriptType(result); @@ -654,6 +692,40 @@ private static void SetNonEnumerableProperty(IeJsValue objValue, string name, Ie objValue.DefineProperty(id, descriptorValue); objValue.SetProperty(id, value, true); } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetError(string message) + { + IeJsValue errorValue = IeJsErrorHelpers.CreateError(message); + IeJsErrorHelpers.SetException(errorValue); + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetReferenceError(string message) + { + IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError(message); + IeJsErrorHelpers.SetException(errorValue); + } + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private static void CreateAndSetTypeError(string message) + { + IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError(message); + IeJsErrorHelpers.SetException(errorValue); + } + + private static IeJsValue CreateErrorFromWrapperException(WrapperException exception) + { + var originalException = exception.InnerException as JsException; + var originalScriptException = originalException as IeJsScriptException; + IeJsValue errorValue = originalScriptException != null ? + originalScriptException.Error + : + IeJsErrorHelpers.CreateError(exception.Description) + ; + + return errorValue; + } #endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index c2a51be..8d5c25a 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -4,6 +4,7 @@ #endif using System.Linq; #if NETSTANDARD +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; #endif @@ -260,6 +261,23 @@ protected object[] GetHostItemMemberArguments(TValue[] args) return processedArgs; } + + protected static Exception UnwrapException(Exception exception) + { + Exception originalException = exception; + var targetInvocationException = exception as TargetInvocationException; + + if (targetInvocationException != null) + { + Exception innerException = targetInvocationException.InnerException; + if (innerException != null) + { + originalException = innerException; + } + } + + return originalException; + } #endif #region IDisposable implementation diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 5c0fef4..de53041 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -21,7 +21,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In version for .NET Core improved a embedding of delegates and types. + In version for .NET Core was fixed a error that occurred during the recursive execution and evaluation of JS files. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index fc7b649..08f86e0 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -142,6 +142,11 @@ private void EnqueueTask(ScriptTask task) /// Result of the delegate invocation private object InnnerInvoke(Func del) { + if (Thread.CurrentThread == _thread) + { + return del(); + } + ScriptTask task; using (var waitHandle = new ManualResetEvent(false)) diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 40e5537..3243aba 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - In version for .NET Core improved a embedding of delegates and types. + In version for .NET Core was fixed a error that occurred during the recursive + execution and evaluation of JS files. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index 85afbe8..d34fea3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -1,5 +1,6 @@ #if NETCOREAPP using System; +using System.IO; #endif using NUnit.Framework; @@ -15,6 +16,10 @@ public class InteropTests : InteropTestsBase #if NETCOREAPP + #region Embedding of objects + + #region Delegates + [Test] public void EmbeddedInstanceOfDelegateHasFunctionPrototype() { @@ -35,6 +40,66 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() // Assert Assert.True(output); } + + #endregion + + #region Recursive calls + + #region Mapping of errors + + [Test] + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); + const string input = "require('index').calculateResult();"; + + // Act + JsRuntimeException exception = null; + + using (var jsEngine = CreateJsEngine()) + { + try + { + Func loadModule = path => { + string absolutePath = Path.Combine(directoryPath, $"{path}.js"); + string code = File.ReadAllText(absolutePath); + object result = jsEngine.Evaluate(code, absolutePath); + + return result; + }; + + jsEngine.EmbedHostObject("require", loadModule); + double output = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'argumens' is not defined", exception.Description); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("math.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at sum (math.js:10:4)" + Environment.NewLine + + " at calculateResult (index.js:7:4)" + Environment.NewLine + + " at Global code (Script Document:1:1)", + exception.CallStack + ); + } + + #endregion + + #endregion + + #endregion #endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index a314072..0f23fd3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -1,5 +1,6 @@ #if NETCOREAPP using System; +using System.IO; #endif using NUnit.Framework; @@ -15,6 +16,10 @@ public class InteropTests : InteropTestsBase #if NETCOREAPP + #region Embedding of objects + + #region Delegates + [Test] public void EmbeddedInstanceOfDelegateHasFunctionPrototype() { @@ -35,6 +40,66 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() // Assert Assert.True(output); } + + #endregion + + #region Recursive calls + + #region Mapping of errors + + [Test] + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); + const string input = "require('index').calculateResult();"; + + // Act + JsRuntimeException exception = null; + + using (var jsEngine = CreateJsEngine()) + { + try + { + Func loadModule = path => { + string absolutePath = Path.Combine(directoryPath, $"{path}.js"); + string code = File.ReadAllText(absolutePath); + object result = jsEngine.Evaluate(code, absolutePath); + + return result; + }; + + jsEngine.EmbedHostObject("require", loadModule); + double output = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'argumens' is undefined", exception.Description); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("math.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.AreEqual( + " at sum (math.js:10:4)" + Environment.NewLine + + " at calculateResult (index.js:7:4)" + Environment.NewLine + + " at Global code (Script Document:1:1)", + exception.CallStack + ); + } + + #endregion + + #endregion + + #endregion #endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 19b28d2..ea8777b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -184,7 +184,7 @@ public virtual void ExecutionOfCodeIsCorrect() public virtual void ExecutionOfFileIsCorrect() { // Arrange - string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/square.js")); + string filePath = GetAbsolutePath("SharedFiles/square.js"); const string input = "square(6);"; const int targetOutput = 36; diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index d624cc7..febdb21 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -19,7 +19,7 @@ public abstract class FileSystemTestsBase : TestsBase private readonly Regex _binDirRegex = new Regex(@"\\bin\\(?:Debug|Release)\\?$", RegexOptions.IgnoreCase); #endif - protected string _baseDirectoryPath; + private string _baseDirectoryPath; protected FileSystemTestsBase() @@ -39,5 +39,13 @@ protected FileSystemTestsBase() #error No implementation for this target #endif } + + + protected string GetAbsolutePath(string relativePath) + { + string absolutePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, relativePath)); + + return absolutePath; + } } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 56b2144..5ca3e9a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -403,7 +403,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect( { // Arrange var fileManager = new FileManager(); - string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/link.txt")); + string filePath = GetAbsolutePath("SharedFiles/link.txt"); string input = string.Format("fileManager.ReadFile('{0}')", filePath.Replace(@"\", @"\\")); const string targetOutput = "http://www.panopticoncentral.net/2015/09/09/the-two-faces-of-jsrt-in-windows-10/"; @@ -638,6 +638,67 @@ public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCo } #endregion +#if NETCOREAPP + + #region Recursive calls + + [Test] + public virtual void RecursiveEvaluationOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/noError"); + const string input = "require('index').calculateResult();"; + const double targetOutput = 132.14; + + // Act + double output; + + using (var jsEngine = CreateJsEngine()) + { + Func loadModule = path => { + string absolutePath = Path.Combine(directoryPath, $"{path}.js"); + string code = File.ReadAllText(absolutePath); + object result = jsEngine.Evaluate(code, absolutePath); + + return result; + }; + + jsEngine.EmbedHostObject("require", loadModule); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + [Test] + public virtual void RecursiveExecutionOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveExecution/noError"); + const string variableName = "num"; + const int targetOutput = 12; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + Action executeFile = path => jsEngine.ExecuteFile(path); + + jsEngine.SetVariableValue("directoryPath", directoryPath); + jsEngine.EmbedHostObject("executeFile", executeFile); + jsEngine.ExecuteFile(Path.Combine(directoryPath, "mainFile.js")); + + output = jsEngine.GetVariableValue(variableName); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion +#endif #region Removal diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index cfbad8e..60fe323 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -89,7 +89,7 @@ function declinationOfSeconds(number) { public virtual void ExecutionOfPrecompiledFileIsCorrect() { // Arrange - string filePath = Path.GetFullPath(Path.Combine(_baseDirectoryPath, "SharedFiles/declinationOfMinutes.js")); + string filePath = GetAbsolutePath("SharedFiles/declinationOfMinutes.js"); const string functionName = "declinationOfMinutes"; const int itemCount = 4; diff --git a/test/SharedFiles/recursiveEvaluation/noError/index.js b/test/SharedFiles/recursiveEvaluation/noError/index.js new file mode 100644 index 0000000..36f3289 --- /dev/null +++ b/test/SharedFiles/recursiveEvaluation/noError/index.js @@ -0,0 +1,18 @@ +/*global require */ +(function () { + 'use strict'; + + function calculateResult() { + var math = require('./math'), + result = math.sum(math.cube(5), math.square(2), math.PI) + ; + + return result; + } + + var exports = { + calculateResult: calculateResult + }; + + return exports; +}()); \ No newline at end of file diff --git a/test/SharedFiles/recursiveEvaluation/noError/math.js b/test/SharedFiles/recursiveEvaluation/noError/math.js new file mode 100644 index 0000000..829eb44 --- /dev/null +++ b/test/SharedFiles/recursiveEvaluation/noError/math.js @@ -0,0 +1,32 @@ +(function () { + 'use strict'; + + function sum() { + var result = 0, + i + ; + + for (i = 0; i < arguments.length; i++) { + result += arguments[i]; + } + + return result; + } + + function square(num) { + return num * num; + } + + function cube(num) { + return num * num * num; + } + + var exports = { + PI: 3.14, + sum: sum, + square: square, + cube: cube + }; + + return exports; +}()); \ No newline at end of file diff --git a/test/SharedFiles/recursiveEvaluation/runtimeError/index.js b/test/SharedFiles/recursiveEvaluation/runtimeError/index.js new file mode 100644 index 0000000..36f3289 --- /dev/null +++ b/test/SharedFiles/recursiveEvaluation/runtimeError/index.js @@ -0,0 +1,18 @@ +/*global require */ +(function () { + 'use strict'; + + function calculateResult() { + var math = require('./math'), + result = math.sum(math.cube(5), math.square(2), math.PI) + ; + + return result; + } + + var exports = { + calculateResult: calculateResult + }; + + return exports; +}()); \ No newline at end of file diff --git a/test/SharedFiles/recursiveEvaluation/runtimeError/math.js b/test/SharedFiles/recursiveEvaluation/runtimeError/math.js new file mode 100644 index 0000000..7bc5a5a --- /dev/null +++ b/test/SharedFiles/recursiveEvaluation/runtimeError/math.js @@ -0,0 +1,32 @@ +(function () { + 'use strict'; + + function sum() { + var result = 0, + i + ; + + for (i = 0; i < arguments.length; i++) { + result += argumens[i]; + } + + return result; + } + + function square(num) { + return num * num; + } + + function cube(num) { + return num * num * num; + } + + var exports = { + PI: 3.14, + sum: sum, + square: square, + cube: cube + }; + + return exports; +}()); \ No newline at end of file diff --git a/test/SharedFiles/recursiveExecution/noError/firstFile.js b/test/SharedFiles/recursiveExecution/noError/firstFile.js new file mode 100644 index 0000000..9a8443f --- /dev/null +++ b/test/SharedFiles/recursiveExecution/noError/firstFile.js @@ -0,0 +1,2 @@ +num = num * 3; +executeFile(directoryPath + "/secondFile.js"); \ No newline at end of file diff --git a/test/SharedFiles/recursiveExecution/noError/mainFile.js b/test/SharedFiles/recursiveExecution/noError/mainFile.js new file mode 100644 index 0000000..5372239 --- /dev/null +++ b/test/SharedFiles/recursiveExecution/noError/mainFile.js @@ -0,0 +1,2 @@ +var num = 5; +executeFile(directoryPath + "/firstFile.js"); \ No newline at end of file diff --git a/test/SharedFiles/recursiveExecution/noError/secondFile.js b/test/SharedFiles/recursiveExecution/noError/secondFile.js new file mode 100644 index 0000000..8588ae0 --- /dev/null +++ b/test/SharedFiles/recursiveExecution/noError/secondFile.js @@ -0,0 +1 @@ +num -= 3; \ No newline at end of file From dac54bdf340b619ce0d91f1752bf68d62a22b588 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sat, 27 Apr 2019 20:49:57 +0300 Subject: [PATCH 176/238] Removed a deprecated unit test launchers --- .nuget/NuGet.Config | 6 - .nuget/NuGet.exe | Bin 3957976 -> 0 bytes .nuget/NuGet.targets | 144 ------------------ MsieJavaScriptEngine.sln | 41 ++++- run-dotnet-tests.cmd | 55 ------- run-net4-tests.cmd | 14 -- run-tests.cmd | 39 +++++ .../HostObjectsEmbeddingBenchmark.cs | 2 +- .../HostTypesEmbeddingBenchmark.cs | 2 +- .../JsExecutionBenchmark.cs | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 12 +- ...criptEngine.Test.ChakraActiveScript.csproj | 10 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 12 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 12 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 10 +- .../FileSystemTestsBase.cs | 7 +- .../MsieJavaScriptEngine.Test.Common.csproj | 13 +- test/MsieJavaScriptEngine.Test.Net4.nunit | 18 --- 19 files changed, 96 insertions(+), 307 deletions(-) delete mode 100644 .nuget/NuGet.Config delete mode 100644 .nuget/NuGet.exe delete mode 100644 .nuget/NuGet.targets delete mode 100644 run-dotnet-tests.cmd delete mode 100644 run-net4-tests.cmd create mode 100644 run-tests.cmd delete mode 100644 test/MsieJavaScriptEngine.Test.Net4.nunit diff --git a/.nuget/NuGet.Config b/.nuget/NuGet.Config deleted file mode 100644 index 67f8ea0..0000000 --- a/.nuget/NuGet.Config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.nuget/NuGet.exe b/.nuget/NuGet.exe deleted file mode 100644 index 6bb79fe5379d098fabcabf69f3e5c9e8214c229b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3957976 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

    u`~u-4R_QwH34fjNiJ#YXwiBMQTDPA`_yNKP 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

    q?zIcAk{U|VH1Lr>$qLBDkJ%l8D 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%0Dr|q4 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®FbQ_ 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%0D-B$lcXj(!M5VY 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 &075Qv=WA+vP92B5(O=;-8ki!KUdW03zHFK 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

    Kr!IOq6Q7?TzDzy)-fY;^MGt18Mq3kykJ!_S6 zOgX#-1Z{OPX1L(8Oix5$Q+TVPv$dh@mDo%0ApR0w_$%a)^$nXhg)i_P#CwCvY_glv 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 z%0AEJm~z+)!rF#${zP&*0rEvM+|o5n`yW zE|dvi8#?|}07@Vgz)YTlcn#de2|%r7%>xjrc5c>odN-phELA`;I9n(ro>Fi*BV2W6k1aQ9Qn zXfi~pnOYh@Z>E$Y0@*-bbq=m-$pd1gW@SMv1hquoaQ8N8Go@H0wG2tAnG#&4nE8O~ zGXAMDUY1a{ENzN%o)6KsEX{Jp%DbT=xva7B{!Ce)tuV0=vhvCw?%uX8@8)o-@=oEg za*j4(GU;)nvL>zbScarRwy-&&#db2)9T03pSmvx$w@rqrKt0TuWS5~|4>y53Tk%^O zQj`8w-1GJ|EoJhaWOCaG6mlD@a#c6sC0#VUiy-l)K;qw8mHZ-)9As>+0!Bxui&>7s zY7D=;I5<~vG=^8IRLL#mRX4^}m3&YPyxWo$f+{I*xO@AQe~Lv?D~f-N;RWXgIq4!M zdvraahdn%-6Ed1j{_R8C1Mh4OuVvI3Ho@j}`3gr#6Uf%DSRr1e5N_Q_M{}~U*eZ^Z zYBW-D`p7!#xN=N6oCab#qYN<>Ys1Zt7uFST)rWobS=NWCq)p*UF6`u)T?L)UINA8T zC8&(gTk}%S=WT!_eBPGFAl}Yg1&ku`nY)&a&nx5Sd{(OPc?Wsbt#HNXhs5W<8oPvm z&+_<6m-1P$;PWaZB|ZyY`56ASMXLg8?_Z9%TJR(jwT$H(u89r_k@$|KyqVDE1wmNG3E>i$}9{XW=yy` znCV*c5s>{&{MO?42EQ(T>EA>i-sJZme(Umc@^f?FRglw~{Jc6NZZ?H8m2y7rV=ee5 zoO{QK&fW%34+NWg;7a+)GjAwg-f@fz@ zDEgICtZaJ$bGKv8Uxnc^vly+m-8+N+VSXWlemR5A`f+m#t?mQVDj@qCd33uC|Ho~G zZP<$rb7XypS27yeSV(#?hmQuZ zUF|2Y`XyW)BlL*GdJ^i%{zO2GALI>p|26#(u2>{h)8|FT4}vpvm}fCEdR$Q*pX$gN z9Gx5uXBJJ)zeMr>M9yu*NH$JF+||6*@8lZ~L?1nYvA>#zHBdG2k`US8VQpkk`64<04XI!zy47q84&7ZHCgK%{W+I^#EM88IMZ2&bL&Apv{oywHb;v zvdvJAb!|pQnY9^}IY?tst%cEH1T?l59wuom=wy?*;?JMU+6&R1wHGrgcc}e61X$Mo zCg)=6egoQIw?A@<@$+zk!Ov4wV7EW=XdvnS$Rl}P#Qw+#6#FBO!VBWBm^)~01^549 zf8?=5rzP1Hg3|qw0=fN>$0&!Y+{NyXRH0KiEfMnv4@9mFN zy#H>0q?nWt@)IUJqwJ47lo07uQ?eK?-l?gk+aD?9DElKDQmx+~sZyu=BaI{XX{I%D zf245r`y&mK?2l9yb^9ZYS5@(-aet(T`TuEuq;k#nM`~=a5z?7zdiga_=;c`HW%W2- z((&PbRyAWF@oP2?uky$-%H}RG_Z#LaQgoym!O_Qx%7L-sLV4A%<7%w0V#*#KBSJXbla3AeJno(<3I zw*48=Ms1@xBF7}#{?a{v6Up!~ey{Ueo1Z_<)6B7xpV#(^6P}G?Ne&$58+N)k zlxBJ3Z!aWL$A|#Wb3NAXPA4Yx!*BY0T*{5ol=F5XUVIcf-64$LVVm` z8O1`tM|ob8r&#dOKakG$fqUznEn!Qs;pDO$k?|zyo38y~w%%Ekczkf<{}qf6XM=(d zdqbYa|L5{r*Oy;zbPLP|H6a(%mn$v$^7G|Y&%sq+{-jFp#{WXlm&^0|a>W|imn+A* zzC5EW8UO3OvcY0{bfd<|XzbBF%%aEtqTlP!A5wq*U0_*%zHC#a!rY#|d?}m1t!Vtb zkRb5WwU8I{693*>$V+%+f26sWntPeKm*Xz3g;aWI)D`lo7vV~yo)S+_Gsy^nM#=M9 zNX2SwAuj-ywvZ~waPeWakZV~BDP;IG$%fD1c#3EFTgK&ZZGvW&h#XN0*U^kL9TPqF zbf$Nrw<%m#Sbfv#E*wug)@OXW5)^zofI@h-xvPPC>Nl^8@IfqS5MLu)W+Ibq&Mahe z#Rl1Tlp@-9oxJK*xYE97#VKdu69Vm%=h?>;i=@mxhHXxEGuh^@1zeYLruJr=Gppcy z<*XTr<&16a`-f;?j-S^DiG!K`r{6xuSCoN?7yj1X)I6C`2vaxdNYiy!# z{nJc;ZX-1M^SJn1d4g1G_W)rFlDR*^t%=eUaEAbnW*6d40UY@baF+loNf0Y`{FYVQ zyA7ZaNr``KfS=^xJdIefqoWo*+7Zpv<$L8-Z^u<#{*~0^2^Aw2g1RivtILYjSeI`C zR?o<%#K}dsKzaznf3|}CaF}WbAO5(ZYu>N z4b7cSB)yeP4;}=C9@Ibt)rS@CD8@rU{0NVU3?Jn&xtHoOJ$}kZaCSQB@e_M|oJTfJ z39y*4s&YblPspo2ge&R21e1n7Rpzk}NKc+8J;iE}US&2sZmX<^+rHpd@b!{>R$_4D zRw1oQm=UzIxqoeP;;yy&JL{Q}fg10x^s%(#~Cz=D6IP1Wc)gB(| zAy~RHyVBLP@{fyie+z@>>`AD5vzVg$LRH zcjV`_G2&uVINzm__79=S_2-~Q_76`29oat!8pKZtx0wDxDbhbYBd_`kT=fqxOMb3@ z5Q6?ep4UGp)+qhM(}086%Xo49gXK*B@T?-atmz+qtE^rBAcXn{`Ck8Ed5`QLly}xY zWE`n%g~ZiA2)&5@!3Z$|8v6$i^I!H4;^2t>VQY5>3pZDQO|FEQQF#T8UidtatWVgU z+fOz??06gERW_DU1RY7+g1ubZAH=^RmMM9-jr*RytSy0G*>vRBAkmR!Q7Xm|Kfwzs zL*!NaEeP(7F!x2=nv!tN^dY1Zo`QMLCOkRZYV1Z7#vwyU(UOUmh{!6PJe=ZpvxQSR2l30e z(Xr}UHiBOo{A`S$+i1lKl>1eA)faH3+^6zfgz>sD5MU&DhkiG z)P+zTkngphMq;!3E|kKJOT)$2)KG2)f#DFzgsDCgM|w8XPRIe0DY>EORWd zn-eo@)I7|Xa0@W?XU$Iw3We49DXF9n6O)_5EiGuKx4#VH*MOU*G)4O&uVl;5>w+#t zY^T`K{OtH8J41Iy8vFsu7WQkQ$EzI3R@q9qpVJg= zjX%(9sq4}1$sPO=VUsFodF;-aK_CYQZ*TU}m|o~ez2cJgEFmmFsUn*coB&ySO!#I0gJ!02P)!cew8ED64G~##3*S+VodYqt~YUAv)h& zZ%J4kN~_6x#H5-C(an)AN+^im$6Z|IP#LHkf0tMN6Rs-9>r%bzRjgPDDu+C;awt|q z<#44OF8;nw^A`M$kZB(-5e^sMQUKS73+aZnZ%9jjhvTnpG1`nMtR34SpKOAaW6I(7 zAk;qk-?Q7N=%T-K{AAmxRpOMJm8HEB1xc&ho`j`PwNRQoW z_oGF-^Yw77Yu7$T5=%=D?Ccy1tkIGkA2#^NQDctkAEUJHy0h6G$nZ~<(`3~*p(S~k znB<~}YO}OXDXNm&Reh7#(Ls#UzfJ~M^>Jw2$Jv|7x}9wjK+0VXgRDQ{HHiO>o6Fi7 z8fyvXLyS!WRnUNj=2Q9A4{^uS(EMJ~-d|y2A=J>w_r$Gu?5(r5FoD;teXw*bJ=zWv zRJW3&Rq-%m5=r@T(pYGHex95}l_#gR!gD0Gs>$g;ppeskM(Qvx@ua0x?$3D)Viv07 zE@5t9ZWC^JsyYUJywj?O`j2-?k5Oy00#`rdMWfa?#f`l!3n3V_%JV+nDHci9NK#+p z_3_S|3Rs$!7^nFWBvaWOfw5X&j#8Vz#aCuF0ny-nSL!T$1>US?Wgi0(lzle{qd)(* z(bpovf)@+#^$ALhOk5dff_@PQuIZtPsOi;Yu+A{J6$8iN&5Rd0Mo@^@K z$)hbJtxZ;d1n1OW5aaTMGjvK%U(etlXo4y`($q1&8eH-#=?e>+6*=z4jh2G8S`SbC zSI~L023kO!c%^!hZ?cp1NHn80%gU>E;7V)$C~5r1q6&f5$nzHLDHcgJF4&s{n4-HQ z+xDXTT{LF`x;=MK0GW4#*y4cy$1T1_9J(@vBogY-mA6HmzT9$u2ngwld~b`dkypRP zH~cz0k(Eh|*OjHc_)$ebCdCpE`*(MSt*Fn}fVTG^XM|1!Ghi*ASCI2im)X1L1+mS8 zPw_r`V;px}&RZmspIs(7+JHFYM$!Xt#+QM1kwmQrsI0~8^*AOpk{WBCaeFv-LB$oB zHZ*nM^=d%N?q13-TL5KK4xiBhncE0Z9-&g@{|9Yip*89AiN2$SZH9WbX*FlenDTX$ zY~6RX9*5U)de^cLkgb+f8QljpSKLGC40RZo;9OyY8{Wo3CL0_%eVw(j?EzHryXUNF zrE4hu9MxE=i`6dUQ}_<5VM7g9{j;qET+$ulPubhO~=)^25UqG@1Qc5dzpxY3^|WV8o~s5bA3pHGLB3blD9dDZ1`Rh!>ceYrx3 z#X?Y<Nk>17HsOTvrT)LmQife&%mu0_<8yxiDtHk$*hMv z8vS7_184b82bG+eBK^6apBBU1$`2iy36=|a%v}w4aXO@w(4jTtRae244!tK9mdTA3 z^?=YJd7cg_R)Y==oT1Du*XaFJUo;%9*B8sLR9lk-lKhyZ{7v~?WbuVymLkv77t1ej z`oa`m`l2cP45i|-{JXN;2Ys?Z$iC9i`Kg{*o+#H^d8TwMA1KomEmI-XvB)3pJ}A{v z%e6V&Pgn^@v{VT6uPWcu zQp>&Qw3LI(OiR@mCtB*tE=nrjmX?~(yBtfp5()(~Wz~aIR{y|iqs%B`K}MajdYF<^ zR)4HN8_n2&pQo$R98Xt!to>ZWbafq2UR(DtWu7ChchzQrVZ(vB{kV(MQ>B8Q&X!kQ z7gu`v4>9os6QL03sXR|l6{}HC%NE|t^`BCm{SmUX^#EzkT**bPo8?-ntw%CRu4pSe z#8w$v%2E*mZIw6NeMqV|mTM3mD7`^j1(&uCC>6iBA1mX72xU5ZuyUTC>a69A&aR(l zjn4i{S)XTGBZPET{&4r9b$K_3hbZp^j?My;B>_Q*k*JX z!yApM9wsrS`a1F>_;U|GPe&xROh?jjw)Pp#0g>)AQai`kx3H$^&Rj5zvENdOE5owO zYz%~ZdCZ-UTT^7VB;dx&GQeIi2Pb-gPuAflFsrXCJc7Z84MxHxfV%Nkbh8Xghr*=6 z84Rjjf<{Mpn1E{wSly6B^Vxj39|?`^Yq8x&w(W~;h?egZvMhxg=oH_0BjQBk;c|2c zBXISXhidVZX_Q9bDiOM{iM;AOTrD&Gx5V0M8YKk%rM%(p)l#V{7D*jWQtB@Sm+Y09 zeF^Glo~21#xB`X{=JP+|xubb-Pf8JeO4>T;rY^ua1gKz2qw``QJk-m$xYVy94Wqi3 zuoZWfJIZ!jF&9&m-8gR|p~0?$x7y2fA6QE6153#reba&AO5zzVelGLS_35^#)XZQf zu^Jbw_zcYI_RM&gF^zj>j)X&NK;-548kePi8h*jx4`X5k<(F8=LGb5io|65 z0k$H#t1#Sq$GDVz70Y63jRuL3><)NvvAYArC1)%)`i*c5KDO&DHTZa#F>c%05=09M zR~9yVH(lP}Quw^M#L|haSf%&YbG6%HX=@w5w*dvesX_32J6__c#_#QU7|TKkxGvA*x?(kO-BB}KJdqk(sldK)m{dF~kmY1q zG<*=w5!naf)DCp(-I*Oow2k-%yjKwK3Y^vbxbf~d;VI;w*~B|%HrZKD>%hB8adW#5 zyQZ+krkWxaEqZad*aEI{w5Z;eS)|=*KBF=g;KDr!mZir&&2Mt=g6=NfS>f<^lrI~& z>cqMxqrHiOj7|{)D1=4D9J!C}dbD zX&Hd19WIuIJ65b)0%#cEcv3g2jGP9k=ZHk=exDb>%QC-7P@dEYm1u|tOXmb^ZD#^B)wVJ}yq_s`ZA*LZu5E!|jP*vF z#W?{@6p(WQ1PFghK+SjE9{llzo9S=+O$Ux5S9IXpAcIPmbl_`1xRu7-LEPG59-tz? z;U3^<0gmth#|Us_28i?6vEqfNq4%8Qp%%QQZKw-EI41n-VESKxk$hM>OQgidS_)sq z-rdCB%@6s)B(%)td@$0b=?fg3A}A+E(J+;U$hOa$xHpURecmen=kS!ldR(n zVsT;AyQ}K=V_4zDRx>z>MgAGh-rfsYzA{eG>)S0>>H#}joDJ*0OIP-vJeiW);?dH$ z#iPWEa@*qJ%E3Xx9c8RYDwBguoI6EVTpcKr=FW^Mj_b66fpOkA&cL9~u$yBNt2=gG zed^#(qZwHncZa#^57WIMDO}c&U4S2iufG)jG4Eo4>Z;(R2wEeW?Mw7%tkD+~JvZ_|~a;hD?X5gAGiVI7axvrJET)7n&wgV(~? z$uSlaRZBMKrh#&c(H_3ehj@4Pv^3ZbR++ z9hIYaBxXk|rEn{wquwfiIxMs=*OrlGz+l9rpAJSm%$QN_`cvWeO8h*ziO@`LlV?t{ zdBrS~$qAs4$#_bL?OtDQlY2(a070vBvqNl7fa z@l501e@|kUF|XdLEG{KhWn3)gQr>Bhtfq()CEeBMhL6^BJqdoc>D6~Yp;x^CxXXtZ<8OGSdbuDz2Y?4QC21?U z)dMRUgU%&{YmDC~O1ea##kJ_xVzWLy3-cSo8W_Y4EF+g)w6Il!!1cq zow-X0X1MY^Jyk4bxTdGfaGjp!?0AX%^7TjcMYZoJb~Qr(xV)GzibCD2)gvMmeABJj8hkKd)_3xjY?MsxSpS*T!L+y$}>SaJ!LmF)!g|kTSN# zoxAjyfiDqw5A=6H^I2BR>wQDs!&ZjMX+gQJ1`sk0Umyif2^K6Y%I*|jN;F-pspMQD zTz$iHlrNiy!aCA@~0pv5*J)~*Ljn@AH==yyX z&=sV!h`OQj!2BEJRjydOzAD#AehO8I5AgF^z5ILh`wl-%Rwqv8~(z*zWc9L}m13JE8C^@N-PIH-bX8 zcZl%b+1mgQ;vWLDPnHNp&n7k)ev_U}v_-Fe1o6#+CzYg>h*xz!h;IR7$}w;}8Mt=_ zTZ-V4+4ItfNmSKB&M6h2I~YLiM+crZBP`|7!{p4v&GkUYlu4Ei4Z!KHtjg+RPj? zN}KsTSadZ%ugw$-GhImSzl>z>va`bd zjHQ19tfn*&?>%}}N<81IXQjvUeR@`^L9F2MDvZ$>1+S!0u#P_saLGq~fvJ+Qt@q@737Can>dsma3)3q@zy3bByC`+IRiwZy7H|L>(`eg_rY< zmrsC#m$Jok`wK6uq{m%wjK)v5P|Rr#>{_X?As8$DEy~m8K7$+mkU0I{84>PT3(**w z#p#OkgOr`JT-Of-L?82s=jBy@j;r~^l47PaiwnVgLY~J<#cG&OSMq#tkngCAKorknu8YA9Od#!GzoZp4yVm31@ULUDr*Aza+d3cz>mba8)$5HH>Lm zgZM=tLHujnVklPIRVJwM3qWiLVK?5k*d=I#-7@RAwaY&db1R$_P#Vt)4{>&#&lNB=P*Jo<#=FLwZ&&taHar+o09+Ht01&zK*-N zHb}J42E8G#`Vy|%pr!IQNC?^>d0rc&SpTnWkmYPyHnu@ICX+7>e^7X((DruT27MZ2 z-wH(c2wATi#J@B6?VJfoo094P@ZSp_RS_=m$upNOyoZfuBa_XWppeau$cBmdTf9ZL zBl6nYJf(mi3Gj{wxI=(H2~b%Z0o2~rW9(c-4A*5&R8y|hQ(Cx#Q3Z!LQhF=TrY)h& zIZ7Gk-b13MBPF}|*9};n2bc}$O>m@GJG41ztDk^{WjeTxKJ{l4sAi%rn$Hu5I3D@Cvj~; ziOJG2^v;Z-b<*Lxs98`+sZf7?rdVQHl3bsey}J*jSS$o_J&+kajUUDbjGlEpP>xCK zmCoAI-vRtyfLXJs2P(~~$r`nNc@BY{%1?bt`X}wW8`uNJ~?^sNc>9^_?3x&b>gp=q%$w^H% z`-sSM^TBk=182jHNVt+A@Eu=CVL%ZS)J<*|kIV~=P~OCw_MoW~Z@k3FJ2 zEsu!3OCDQDKXyZds?C?~-ho(s%=Gl^b`4hFQv4Xx6y&- z6Y)63S)P;P?STw{b)+zRFqpeLAx)bw;}u5tRt9v@n_3w<0Wt45p9t75?E_a=Z5eQBpYsnz#T% zltc%+XJMlQMXU5?q%19>=@hph5MsD^7=bI_ltjLTGYu6Id}u`puxC9RTgKufOA6{_ znOq>tULBCLTsWzO3&%YOJVytJ5=XIITkWd{x7yb~P1bm1%wdLKw<6rbWamSs-%qcG zrpMvop(uwaPXAPae-7+9ej;reO$6tnNTITIz>{b8*_w+lTAf-B6m@Dp0#m2Xz@rwe z0MM&NeY`p#TQ!8rwus2aWoz%V)wW6xMGoavm&cVNcS`1COp%2^k>z6p)=G97CPX!LEggry9|ACXd938&xIC?wcu4z?^?x@)+_S(#5G zo%$1DCB^JS*jeLw<8)Xpt3h{YV$C+tg>L*e6_W$+3r1q#Tr=urmTKxv=(c)tu?J|M6IvehGWb&F0&2i z1bCHg{PHj@;fY}Ax6<>gLj*BES@*&3!Pg&;g{%1emfsz`?0{btkU#17`smR{_4+M6 zYYIRDD^OMTZEBhyl>nV;bBHQW99)k{wP1MJ(L8! z_Ha^RGxTY5)0eeCdHV7^rM*NVWAg@>AYRAZb#WJ`FG>Y{nI*5fHm>w#g4p+aB^C>T zzR2_RMX?(6Mf(K50GM4YxC6UdY>$Rad(`~ZYmd=TuFY0#M+42@MA5L9r6L5)pFB@{ zjD{xH64U(I9w;qEGwId(m6(yTU;{0>%6EO()dkbK?C^$Adp*>c4NQ=-aJLE3*b4Jw z$y{vgwo${D z-3V8#TUxB^w(24Ttdr;Im|~HXHFykMq+_bGn*!!S5!?ZF^>s8Xrpg)(<=WE$X?Zm&zlUi!H}>uKGTj%E9xo>r-iMc48!xv5mFxZl z;OPF&0NLnc?vA*NYc`Ysy1$FO>h`$O{VC$c8A>b`0^OJAH5-aGve{UQ7^MaC>zj=( z#tI`_j@nM75X5qwSg$wU>)i(W;c0weo)sI=D@Z2Rh7IZ(GFeGju&}FAc12;q!c-OI zAxlRHEm)B6N!H3zzd_w33*C-DzU@i4#@2of*4?+Pf7Xq{MWh>hyA}3`!4*-$usWv) zryBm2PovtXZ5-Qpn9;^IcfsuY`FV9t;`8*R)7IH;V|ub1DD-4&sHctmo%qpJ+Y4Y2 z?|~aF2b&gg@PVSDA$!ZK?v5)BSzc^ilkB-@0}vV_&(jda8mS>#e-@M$tS1$Dk#;G( zi>*?%FA+9~<(`?enW8C(_rzUPO_s!svU2Uq3hXGOCa)mME>u3T5Y%LOp1h5+`kIWW zlVOe{qw=8IOk+=1LY-brjCvT^bQ&o}Lu1qFVbZ3vZhWv4Ox&|xj$(4198U(nt;um8 zP&=(v;^(Q?W)$)9P$#!TOmr zwF$U(0AcH>$tvy0fvQnct{to>jv6G`mrGCxBq-05pi#4E35tNqBa)yorYoUHFD5}f zjFg~}Vl*^L(8DAW^v8GGz_y+1|l*GTF}LcL*rtmyGX@;4O#`Gxu=Z#R*O^ z5!{jTs)yoAaMQ%9n@rh-KydOr!70{A!L3e=(t^2l4Rw9jtI-`JzRJ^Lqa#zU@lOvU z`#7V|2y5))JWN9$=iQB@5@kHY1|0EjwqtvMUSLP1FnciA2;1>j6lU_wl?t0-JKo-S zJ_rb&zeohyJ{GX5?W+RBtH}%Eqwzee*H;DgfKM{Um^gbC#q^*y@)%@j&&4A|7~HYU z>4?!}Y%BwN3hIo{U$-2p=EcV-pC72yl|0Y* ztXODO-9DFIBPFOR$He&je^;=N#pcRMGNT?xT7fam@txglO5K^Dt!THvOY65}Ldg&8 zQSV?yE7iWCG+fazp@b@$GeHZ12}Pb)VXSC@Gu*IzR0sCxI0;jiSoBm*gfdLfq9i)O zJqsHhFN&ppj$&V;7BO}>rNPa{1g@MSxtxk46SUy zDap4)iKAGqRa!lathB}>V@_kG^)TtIjCt+ahz9Zef#1{U-)+1!+Mvf#?|S)p;}YqW zSGQfAWu4hVgU?5V*adaoTMO}ausZuKP}JE98Bu2+G?h3_#X1QDd&129Hm+A|l^oZV zn0tayS;sTdR;~2W`_tuBkH?kXuPo&_(ez#j^j@CV@hBF0Zp*+)(UM}0gE zum3Z6Q)y*x9K?DLAL6jeb```KEi9;&!B{YO7yB|<0Ch4!dsu3z!o}aj>6^7Y1)r7{ zSMcHD>C&7((LDEcHrEtNE7+~LV;PW+c00BzgO!)T@fk!&3e4bmx(a;08j@HD4UXk| zw_{t08*j&EH=FY11|D)`w;eChtw<58uomE?XMwv_b_6?=Ch^sJo3}nbYMq$a!@gVJ zy8T|=xZ0Q@$-2R{GiR4_bGBBFiE*qD(*nMsqeys^tXQV%vZ}jmt=^E{kX0vBJ4<=2 z%d|Dm)Y;I-cC@D3Zk2XtThP(Qwp%^B+$PTbn1j~3Qe%0$_CA>)OyfG*!_%qznX%l% zw1j7X;k@AeU46S8u1=v~vS<3Xa&>9L{5}G{8UC;F`7fmKeb8kM`RC&6Pd4;tcz%JO zS3jlyP2riACH1h!?z`R5>fxE7T5VD0_lZk0b-tDEEZq1~>tW93(T>889zzA-nE`Yp zHM__2XPwQ%*W1Y@7PcSF@fobfv_!r~A}z@99833HbI-#K*JJfr^c`q28}(T{I2*O5 z@S;k4WWOuF`W;;DkzGaF{J6-Bg^-O}{&4qKX~cu>Bpx>Evq?T>J<2_-Dyyx8v~pcWxtz+To3l}O&xl zxA5QR*C?lDkwIU*oWzjq?$sHU^Jv)@ zUI8pyXTd$J%TNuPqA9qQ9jH^&SEWE66m^a2HrDvNT23d2Wfe; zD~~LqbyQO)^|F}adQmjxGsE_uppdaZ(PWTqrD!z*F1Qjvx=Kog9WI`)9_<`h+_zB3 za5eO!ok6)Jz6Nnh(aN~xQnV5t`~C1oSE8%1&)xj-CgnQr$mHWT~3_Z&}-OG|4-NjLft)4DaSe~Fc~zXr$N zwFYNP(%CiRWwr)K(yCj7W87@*?<9Cn<+~8lniR99vhsW#UQPVS*5+JFDCRj+3q$DC zZkERl;2ATm4uHbl!W&oX;3n6;de-}vP*=8gg=e!nhTB;P-!cMg3G{EI#Nr>4N_-_8 zcbA)4s;vfYZ$kO1zKQsg%2$O4 za)!5=V9fOAGJaB2xr{GY#`o60yDZsBXQjMZ+5emd+s*+q+n^l;HeZp{VTd)_%yg^# z>W#SC%rrv{(G`}k5E}l-_l^QnJT^1gQDAIlvZKH_-fLhrB6So8CvD4_U!4<}f2s8i ze26Uu$jig_L*?L~UTHKLE%XHE`7MlxX$j8`We=M(hJFdput4jt&qe%$H-13IIzn=ElibYZvk(5sF5*#zT zQ(d=NSd_$9pd^kQMwKduPgQ^**--b$Y6ty0!F zWo+Sb!tH5#_zO_z;VuB!h{;Q$M^9TJo-y}X+`NTX+fskhqtZZko|9L75?8vjmUL%d zOI8SUN1oTbD;7yv^G@5M<{e{+cQlzLYw0!Ik(nbJ@5ns+!fcPF=W=zG&`m%zX)WaTkOtDT@BGyy`D;RrIx0^rJ0xAt<^$?}AXp zqUinwp=~8orIK9~+K>1OJ^r;KmXBq?0S0xKsOFe*c&>j(!}Ygh-!Mg($BXX50c5b3 z@#43j;KjkB)(&Q@{T>MWIdKzJ7&5?X=Du$38@SO^>TE_oDpHBUl{e*8U%?eu))7}U zI1geW;EFu2F;T3B#>5VZZ0p~hSS33ovYjuQ<-Cm@mFna=IXS%12T@W&yrN_ zL{KIv^8wG&NStk!fPv^7$>gZd%lvaBO9NVHksS2tLf2JhE1?yQ%3ODtq=!iklO&>eitYs%E2AUlu;#H83BZsz*okXgZmnEa!~zC4qbZiD1$D;eLq0$ za6rvo^V?*?bNK*`k;2fr-fy4{29*a-C7zWl#p$}6fqlRwVeR@G#?-3}X!Jigepy{f zVW|kS;4QLC`w8)JxOkiTiA!Nz-$Efn8mv|9{v4^9qEp?pa5K&DvxW@y&Q;i>WGKvn zKaR-o_B=x&y$r`B8IDOa6u-;1Dm19Rr?7UDz=o1sSM37;l-;#qCcA4)c8X+2_HvC9 zk3p=M`7ynAYIptcTpGdXx%Q#_>N~jOS?0B_YO9-o2%%+O^1b$3@mMov?KjK3Y{K;YiXF~(A z$WDz7Vm)@Yx^sUV?_i;FaTH>0>==vn&`~>r=DDx^=kw3KGnFwmGO#qh8NWK(!ejjY z+{3hn$69}mEfKjDp2fKw|1>&rH84l2Gv_abpUu0bH%}vDAO1iBUyg;zf~&olOSRpE zpVwYUcunC~(|&$j;h%*2veo;4fTG?*2X*BmEBVLf{>$7?%>B2ypPKt0+~}cnS~s%O zSAw+hpUJEK6IX5g7o;`ETOLBt#>?}RMzIOkBMnDf7Z0G2=tiaXJ#TU$T z>}OwP=s+Vt2+VWxyiQWFNXkasnCEn!ayYAjN0zcB36D%O)z?U8b4=MOCh$>sBx*c8 zTGH;b+ShnA26Euhenw)8Xpc*{iFvYYfL3$In%jn(b3tlU&jqE28nw%-7ICFUv&DtI zEejz~BY7Sd6suvV;0+utO-rm?uOd03f<@_ttKB|%YkXS}@v z4XRB5!nAChyto6`47aszdlxjm&RS&$7;oTCbGvZEO|YOXVhE+Y;LAjL)unL7m-WOK zjrrLV1qi;#^Z24z4SY$4P%9G44WatnZi-kmx!#?@U+Zy$yKd^3J;L>{#NIfCrRp@hI8yZ;)M-K=1#+nhSa=Xg=p2V zT#cU_ycCfNw358)3b?93>#G8}K2QiMki6mUYHILOERwp0q|~wt9$m|e*Sc83mSWkB z{3ResI!Bb;De`&Sdh&O&d8tUr#`LoJABKz%u(EQgfy%0lH`ogQXhoh5EQnVzcU9cQ z6@Lp32#)_y!s^G zHH9}>Q07k^g>AtfXfm1!Dwol7M*W(=f_N=+*T!9(j1(Uktt+p(2Cif@Pn>X5Vlq3SVXl zkT-=YH#)bWyy|+m(zy*J?@!@(5DS6M$@5m9C>BY*LQ-l9H=*|N8BwcF?At}<6}Ztp zbS)_)<#I?@kiZxcy^e6&hrUUeX(6@>fzzkD?lU!>kRA%QKF|EiRZzdex93iu1~*TBa!JF^S`Y7=h3PsbrV7Bsup z+K0FJ?acGT_&)qgR4a93v+?z(`Rc1Yzsb+5-_pgV@UHs$%{iHy0Ox`sb2nBPH@193 zRXrQa92mr31Q*>;MVQ#TOl5mMWQH4})n?=FDNG`-gRS0gMlkCApCN*N^-2g0DzB)@ zZ*4hjfg9gKogCZK*23J1mDNw5+Dw{`$Fup0e8)9emlhWuR9MnZ&YmFlQ9;#U` z7X6r*9nI|{N0lw%jpX<$ZI9@wZG*$U7F;Xev~u(lV%m4rdzATnWv=h4Dwe*hZY#gK zIj+8|Zlrp>oXQvrq3^2lhr1W1-Kyg8UG-iP8_#!D!L?;sIbsG9Pce=-DnyV`!4y*+ zZp+Z^R`d*R+;@Zz7hhGAbRWsOl7|~ZN_4-7FOBCagN%5M2psXH+IGs$5nl?zO+>sK zp9z7oSLF|Pf3uGGQutF5UvlvD!>%d6rEBS-{B^yLhiP%WPi~i$&E+6|8tSBa&ZFt= z@8IP-{5-uCuSfJtn+Ngsz)ew_!VOGUC(oQ-xC1>r#Po1S(CA@E!a?PADd4U^xFW~g zopEbQfxc;Xy#4_q(s3~PLYBJ#iCxE`;CWVqZ58z%IZy+&!Pl3N=7uE5-kKYAcmZ}s1#ezs#5fMQVu^@_F)PN`^78V2rfyG@=VOg+OG+>XS z5jE=D7>ONQtWhCq>{!rP5o}RWj3(mmIdivMuq23Vu@oL3<*NFq9sn9O?H-du}PhlM#a}RbF3`NEWL+BB1if5xk>NEF{I=QBZmGj$$qepqE8{&RJHYp^rgm zzIpTCO5`N`X{Qz@awDAlY-1#h`tXZUv4-FfRtQ3%zaca2BJ7%HT>pC))eLdz3x=s1 z4LO5=x_H99Cz=$hjr}HU&#%>%q{hG#UoT2A?Lz@jf6@uA z71br&6u=VqQvq#wc(MNCTlg&n1o}n#U?@Gw_ZP5t#p9XTyVwolY2Ot=8>gkQ8%9$l zX#Lm?@0Y0cV>i5ClGcyi2-5XZzQWKjSx$6aUWW4L@bu8zu`IaTh?BtdUV)&{d)|(f zf(L9=Vb=+`%AcZ@%1@y@)DVi`>R;X{A{xR(ax#>-QbXuR4Phn{$F3!Kp&^h{U4Mpl znnbaXR56mGUX1)Rli{cR^^-WS7QY6+%HI&ibutm9{gJG|(#5i7dDgOY=?NN3m)4HH zd7IA8MXc)VTv{1nO)bd?-_@e*24X%!>!R$~UfM(^r!){CCwfOme;Sa}ey1Tn=>U?PB*2GN3Gu|{Qi}d;ZpL#*tn=kgz!Z$V<>IxC=F<}SBPJAzhY_9? z<2f{fFC9xsZ(L(5@|krlh%%$OG%FWYc_0;R3}c80v?8BefqjjY%!s$I zY5bXeP4hCzmd~-YnXt5GHEN&KU+5_&8mn5(b&@k6(`-P{Zb{}kyV^%OF%?vuPSj&( zOe8U#m+&U#QZrh_5J?5D}mA0Mz&kYm+6*imA2DX=_tYG10sn32k$MkU90) zg1RJGee@0l`&%~i?~bxzE~l+y_%C4ofAap0-cqgq zwt}$hLR{4p8}CI+;rPoC(LgDpa7$PS{<;YFs(pBkSIlOuj$*T172OTEWGTJ(sEIke zQt`VS&!FL|ms1M%>hH)=u_X30>l~%Y%Hl9zj33=y?G*Qu@kzSDh=XM>3QPK$AA3*~ z*31pNBoH+l23f3aWA9p&Dt5)-s(IHU5B^;XMk$ujeE8_zwe*Fm78{_H+IKAqgjb1W z6x$rL5w_jz<998RCf>DHkdu*%E4^!llIA30s5MX#0q+1{>!n6n>cw15cUb zSqyum?v}|9N>$nhiybIGX6K zeE9k!(=(<3R;FKkam0o$KHnNIjx~*pwerK-6hZRlyphpN9*y5$1t-v%Tbb#MjJ� zK6rm*3wY?B&$&U@MOgY`3&~K+w_%&;n0_(E!X~=&s14owqktljUI0b+{$r$)Btplp~rJ$rP{PJQu_er7gqY{;gG39QNaSvmmH`4gj7?9e6hI#%7 zEIWT%B<#kQxmK@#w}u@+FH36we3wsyl}Lgb?yR+ zk@N;A=xTL)q{ARovJcW)24Vm12fse>TLW~%J=t#PPwP*oGLmH6_->!|?~|a`S%9E_ zCnYeHmhzc8dfRaI5KqC{OaVw}GxUR$Er!c&c;rtdIOBx2@jrMAJrBZDvF(bX=BSW> zIXb$5YCA>MomxQiD*d^RWRaqrpq4wx$@m#pQp*TZOMbH@5uldj2yAo|3rVq43t+>h za~-jkSjVObJHJ3#hB3g*7*-x*-YzFx*ue5-8Dh>}<6t-erPkRlCAW0z9f?z&Ee`gO zop@%p5_W^~Yv<@*%KB)llXnqa>*r%Azm9dxY{T>8`?0K8UUOeEl zbnLnxSNT6Ell&&?jBFaW;OcD}6cI072gu1N#FbvUhLI?Fn+6f^(nU^n{kht4iDDtC zKadpJG{`@5H~h3V4dT37Y)2i=ZG>^1OhoC|NLFCeU|F*~YuPmPgwNYFh}Dm58Y2ZV z!q@dEPiEL4yT&r;X$q6oFYt$~GoHuv zBu+{j;{27Ij6=ARIKLrr^5@kO0pcV_AWn)^OPo9()#8RE!#j|nbT~;*!g@u#!|p-V zOL&clgSC_A60ft2!4If!-sj&f7K~%O-ktyt8kX^TJAzo|Efz$e*IRN077NDnzgR3- z+Dr_!Ef#u;)?y)i#~p<_sb$9|S$<@%s9E195ky+74hSv02lJ_~|@ zioX`)UQH?BgL&+FnqAM}`lb4&v{B!`lao<|E7kW%5*}}}AOh-}96^0ktdHuO_^1{) z`AmH;Lw)nCp^_O_RLP&SSunOxsppWUhA&j=DB>%MB}4?ORB{D23&z;zZ5Aw9R?ONq z3q9pO+AK&`x_KFmBea=f0;{j{AfdiOz$omFSbvX#UxXjFhT$r&rgDG!YvmLZwQ+@< zj0?C@ZA4P3%ULQ!Ky8pCIK_!#p*Cuq;>0pk9b@)~%b@cdu-2quV+3}Nvp$uECw-qv zMnJ}fL|sDhcs4LR$%qXZV}l47p2!g>1!Kd2?^7{6QJ*SYZO;;Aso{P79y$cwQW8DI zM0y{DnrrIJAXnPsBpAaR1d}asCx7~5>cEOv+r;|srH(jq+67x`m4L7AJVnc~Cgn&MRUK zRDZx41p zEPaH;tg+dP{OOg1vc!%rs!P}ecs7V5#)ifwAknND()qJm$0r9V2eBIsJ-khT$}X@8 zm{^+#)(ko5m^V>ZPovkO_sQ zhZPYu)(iu;9?=ZulQIUY49gxQ9#vW}ufKA{L{F$ogZ315G z+l6UN|DS-2zLB>Hv>=^-4j*h=W7lW6swoB71YW}NhpC%7OMc|}6F#b=te2$V`m8i- zhV-6nl221Q&BCEt6x#J9Ts=eyV^bZj8iN3N=nMiZ@?-eu3Cl63|wjpgYhR2m}-(=~Gbf!l+$8MC<3tJ}_3$R&dMg0Q9@kYJlv#8E}RE zHc)5se?gx3qcLU%{IYAdEz$`?=`%i0M{jHPU6XXyeqMou_M=%pbP(~;QT@e=ScU7C z)(=rs3>a_8$#{(`4H#od?dpIX0~HZ4V2~qNKSZ%GUPhml%Ij>4X&RvGf)rB za+RpxQD8n-D0>{``Ykc9A_A119D$jE}wr|9H zmd@Wm^`2N|@6}p*l%d=Z@eEYeAjzMaaHfvZ?=TQk8v1j(K7gn>r%U95T*-z}hxOYk zrXNJdIbDAb!(vseLD7KJt-S#BOf(PfrZ*hy(?l^!ImGK|j%Tq$NA?>O8wPGtKI~D~2Xf6K`FlriN3e@_AmFVBe(PY=`*8EX2~N#o zUo)w%W`(m=i%~GlMh)O7vHZxCdEA6ejWd@rgJaEKj3^x6FKPBw8>lFS4)uv|cFUwG zJ&B~)n?Eufk9-XjqyA@iC}jr#czket#j@T?l}EIcO` z%Ibp!6H2S;KRgS3lOZqpLlE)uNe6a*lIg$s7?2l)pkta&DEyf1CKL$2tT4VEw0zUM zqd`+X9Ub;3|0!w0X3{Z@yOFdK&KovbjA};&(unfFT+O(z=lZW7M{7rp0#JL zsdc)mJ9CX%UX3%?7=POD9{QoIbmp2NLa9kPabJh-Nl|oXt_30#`V5sRJemEH-Jrbi zGt>I98|EiPt1-p*6MG@rWOJfx`;8`s^6q?Ed>E`rqGtn@B|_=epETkMA=6A&mbxHd z42eL(*yW1{>{?}48+Ns2*ZR1AX+tk1g3-i|oQ!(7(r6M-{dy?1Efov!c}bY)$ii1xv}@tn|cjY zR9@{~T}LD%v8qF#K__qdQd(Tzkvj61;E!HGSfgF?h0n2R_TzT?;(lE1>VCFHkqMDW z4{H>eJ%V*wSdAp081n`R?H=3T!DuQ#ds(Or(I2{4E)O^h#KXV#{GEQMm%vG)*tIFUI%wWVJIXXm^#SYQs%EgwD6}d zEttrwaBpLz9Ds6B&x(&5BCMK3r)-U|uF#qr^m~I;^Pv0jLGGdPp-DB{GA#Fm57vMf z$xGpt>4-G6KLn7NtHq(nM0wJheh46qj5GLyf7KoE~Ll|wa}ib)6R&_SbKxm1EE{)i$0XS$a)xet6ajc84+ z4eKT~HnrQB3l?y&dS?}m1ss2Y0o@c{KrxrT1qIV3-8TcNKkSERLnw!^9bJPTwIO=- ztlf?x;5P~ov?Ee9L+Lv{acw(_$3|?bqrc&8$POH32LiBf+z56%9Y(4_&b`MnBmL zTGAnkQWLXWtWD(2a5O?dXWr{sh&D+%DL5u*#1JnzE7MO%tr|>ges89bScR30h;s4< zzog0m!PKRblE7+3(_ws)j%jlpUYq$Wq~j4ys-Ul%-T#U!j0Zq#cIOJOzley z@l|1FAXOs9%^akPJ=Y-M@SY5EtLtO60&gW{bzvqoKw@szW*P!3R%Q!?)bxTfLfS^r~lIhNG@KPFqnaS>$G7I!wnZTY6mA%Qu4itp(;2J7t)~o4?nSZ=t2U-wd zC{0CSnCK0qlgtqkAFtNG8yO?4=G{obqT$`hi0h4rQ&@W)tEuK%n;u)QR@}0ZRip0@X47#cBo3%3WfvE1kAe$hi3fL=zt8N8fZ85} zB2|kgQ4fM6SM14^%nNhj&B4;f=iuRcHn5|2IcLg{%a zGpWpjK-ZNSYdx5qw-e%1IPG)iTF+f-J^$D6+A{RT9!AF3Ce)$a4<{ISa6_=Sl=-cO zUjX%>_S98zemLb}7zomtkQ$zCV7qAz>U8LkaxRKsDmGM)L;yZbc|+2OYVka(5J%ig zC!qh6PQ(RgiwopP=~6T~<%e{&yeW9Sk=7GqP~w+3jG|ynd62J{@>`NyB>V(&(+4NH z5sx$lp+CdSCquUa6FgsVez;gkF(; zdT8~F&KX9%HNoyRUV*{G5Z#&eV~~!4k$Nl~R%R7>pd2dZqm=>bCl3A^#ey{onZYmq z6Mo}9;g?X`4|Y0Ul9Z}}DiK%dGQK(?&ov}Z1^jgK>}%M;ltia%DNqD$d#qhHDzBC% za9LaXw`Yo*DNV(6Md60ollCYIL-~Fut=--OXBd%uGbe*VZ7mYB)#3tu^$?L&595X9 z-OW(*S&nQJl=U904`6+YfUnxmJl~pk%5Kon*+^P0NQ3m2{G^L`0c!MBU*Vc4T7BjF zLEckSp^UVdZ|k%y{k&o>XqtINHg2J7 z+HWJwV0}N)Klg2fBarK-zKvkYorhA)6vWql8(|*&F~04DgOQ8njW6mDdsKDo1x=kx z9ATIyDl>p64CZDybG9r0UH==O9f(^R$qth-xBT0%tR{N|SV`u5)q#I+YCTfhaEPbsF?ia8^DQ%NJYJZ*iiA;rMOoUubA^K*ZEhAPa&YbzSS%BA>`Yk1?oKVK+RIJ{*y=n zROBV!0V1gprLJN!pw@~HrVM6bD4hI|~i_N+<+B?y_;aF@=?=7sD57 zMY##Sr@_j^=Syl8Fo~IuNm9@(Vn?T0#UwpwmT;a&YXJ$`c^>JQK1Gd=u|nx|jMxzB z7<<<0*j!y5=yZ%~xrUCh^tC!x1g1#GmLZgyDgyW4(LGg!PRGt6lupMm?yLf_##mHS z?^c6cb8a^h8!~ip_-Po9%xkGj)5crOk(GZQ_~*NK*bMOA2J>Y+CT<;Q&JWJkBMnzp zOKt`R)#7VlOZhjw^VF6LK zmJ-89Tqs~uK1+p!Mu0qxx#b06rvve5C)t zzAcR>iQknFL#nA9clHp|886i1c6d+;8}jt9?^GEbToZR+@D{^ zLte}?R|fQo;anFV`_t&C z@E-I!M7P0Obo{K!{t&bog0hH;Y1qx8^)N(8-c%M&11GgrFXcPR^FXaUuhWc5tM`)Y6AWT|OmXDN4m8_QvJLv(!`bExs%DNFGDsWxWA;doXqR}f#<#z??_1JJT4 zgn`a61`JfcBOmn{V#c0%LDku2eN6!69=zA7FA^QE>bSi?w<_kr;>w%i1>Ma+#rsog z@&*WpbxfCW?@yCG1J!x*eh#r|!x2rs88LD0VKwB`;X4W^k>5uc{-Y^Z5Q17OvFR@( zs)369_^+m1BC3W9x@TN;@a2P%2VW!yZIP0QqDf851B=IawN>-!vGiH1UT7dCA){3@ zK2*dnzF>;|r*vn)p80g-|3fJP8(;+2HDGh9o|?896=Y5jwqI5OtW28r%d*$CU#b&f z`(@ACF?*q|j&<#qw5Ue=W$9~eFJ|D0+Ar0Fnl89MNB2}?y0&bMP-qkN;Y=<8LD!a@ z4eg{~Q)7i3y_60_zxFwL6GLe{x@WW>X#_>l_6PLNa}$xY33(}-QaZPU>7dOurZ`?o zXQJH}(x^=%&1|AOde`F|AkvDg3rp(AoF+ z1%i$Ps;+ThBQb{W-d2#4aUWM}90#PreB&n5XcZA~91uCx_4{hA-V_T-eV_vyaX=^e zYku}Yi>Ow!L|JNB>N~fgz>ck_NTl;X;J?F0T6gb}ZXXe`0Vy&v-sjA@!zkhsCdWr0 zL5{Rg%Ru!64=TRQPjPE&hfff|)fbn3aH&~bijN;${v;>kF|PE3O9mB}KLeZyF!GZl zC@#f9QmnYx4#XF?A$VZBlv$cAF_W5w)e|&@)t+54H&=Id3GtvS>j16&M0$xjvge>- z>@npAA*-b*zjP~FvXOijCTDUN^y$joxHH9aM+Afw21Ld5mNVbQ9 z#I;!d2)pN{t~3@HOP}DrhP@B--xo**%kglPcJ53qN!u=9U#*0%GKKvDptoTKpuM~T z!BHNC%siOgmEK0aV|Dc&6s)Hv6C3F<%{$nSm+0Avgw<5IswUdty`>pw=sk5F>VGJJ zJqu^=p^0Fp;a5dOUB5#O9`B^gFF-3l7Lm?-F=s={3dYX|M1$_65+5rmLzT!C3~aZ> zr2rQ!Yr?b8_b2A7549D~(x|3rOrPGLK{-IX3@Mom%+i^5sY$!|_c$UzyT}o&`=(gX zuA2KZSf<-3{|w?v?uKd$=u5wKk>0Uii&$A3J-t@%PMp!{9dV~yEAI&V zFr5ywlF7*kB*>`;6OkAXsvA`9pQzl!9QdCxzlN*dWJfVjZewyX>flPPDpTL8h=6jF zQ(gZejPz`S0mVYOzd=&8$&UO5yXRP%EHM))R&eQm3eyuL(qs@&|Jw3pOw*N*xG{_hyUP1QyP|;qukC82q1=IOZ8kw-a(mp$hvT9fb6~R^)`F%TW<+;KHS5&-Jv<+DHFXg zObc0vArFas3>*t=lEDH6;qE5J1Gk!uEGiBN(vsLS4!OfPj zum?%^Q@EZWk*)wi(Ed+f)U|)&!ce-Br#oT{y#w)l&*aqvmTd>7XY&nizU;uNqf zZ>3QquNrDZkx)eFDT?TXD;04n6_Jd>1}Y+;h~!k)&(o?A#X=EVBPlm3BN1+j5y9;y zE*ut1v2_de;TWhGAFaTLsx>b11K_<>-`g_=SkAS2dp$wZ+oL~ZFRP|p#!QZElsI46 zl$({yQEvD%=C$*DO=(5o1D;7bU2P(?SwB?cGGbCmv;kw)WL zda(`kq>*O1OXC`oO-d0$bR#Fj1y>T{G`*e>0YW4PLf9vz# z2Zz*5iC;p_&M(3@CBT_9nO@*|ChriFC-KY{9tk|z0(CQEd0P|~yXWv#b1Wk@S%*U& zMe^1-Q6BHg7ABGfaXycXCfnprSlt>`{U2 zN7;9sLNXOw8LN12CcgVr?CXe)l$ZyTLo_0@?YCCgtECgOBIhT=6d5h)MNYVWe@yR%nM!G3%AlsFkoOknu>JE%1k;I zl~Q9FoS0t*hXXZGn9`b`lO?^;Sag^Qu^_M{(SwkEQcH(X4qa&t78WDwsZ2^OQELA| zAZcjQi^%C_AfD-DFjgY!EBF>4N=fNH5>82>om-i+)50{(I}kku8y5LOX_8=)r>q1? zDi-|Tx*uDxP?q@TUzR+P_Zdg{c?o z50~VOk{~2+v-3qi9smf|`cZo~l-{5mXeeu>8K}2q+LM(>$>^y#7x~dMr;^LgZKcB-frAf$Z9<+n?FdJecWU-qrLZR|2;m~ z0*Wf9DQt?JaR&o%ARP2K{IN1bHBfbA*G{;~qe&!ZF*P8O{0>(y63PQ2=}JyU2V6-c zvq&WGQE&Jp3A`W@a;obGYehn_kkmOOMIs@8X-909Ljn|u7?1}*UTl99qX<0Z9YHa_ zIS1*(&a3W%z_5@|2{es{Zt2r$_FdaB9whK&Ak#?Yb%Wx;m zf((mpw4#|-W@4*ZJJ2%^T7oTf&zez2j4yHOM;Y2j$b^BN-a*JiBMq^EbT&!jPnH1@ zXs0*1f>DNvL(Gpd*y+uWGOT9wH6{HA8FzqQb2mF;-8s)Je^q^pnuNWZ9Dz@RKxZaR zD!$-=MSLs<9_i9dGzWPWE=&S^eapLGoEON!K*j3669mr8rtG_N)uaGHlr(J+=gVxY z?uJA)Wi~dD&Y?2Xj~MtO3kcY^o~@v#V_$J;1Rn5o}spQ zA1QwOGgXsj-)x86u@u@24qtPaDww*J^2PsR+P1t-Wl#-N*Y`rR^FM_n8L`V9-5V<} z({!BHbskCT=AC*9PGSTB4VL!9(4P;m9k>tJ0;G&kO?DQ_5om@H+N=$pwSQy{?+d@L z06{-S?F(lv@@YF_81Df353H?s2T9Y`nkkAt(83y3j|hsPWf4FrG3+;>(Hq{>;v&EZS{x>_P#*Hcw`p*7;+)8%7jETvP3PMnnekZ@q(Oikw!m02QTL^I zJWDX+&m)%T8-4~VBEXDKj-UZDmJIm@2s1w404Z0EG%QFOov9U&y|ZSn)CfMGE1kmm zf5^4w^n^;UnV!(CW+A^V6BREN!8DZBvn3eSe9P6JG@lP8e~w=UYbH&F(Or3uIZ{98NAUr(Vq&_}`9D-`Ncn-HnxM}hb`jxM>{^al2h zOc(f90(lE?V22|GsF|RDM+;?@!Rj7+scTF?1Qa8F0)j}|J!?g{r!@^{0qtCa+9)kQ zpn(Es73%!q#s5Bt_GetPjZ!nHG1qvGup3w#?FSO(8q?r`ul3-8{TyMh+>OmtX6&FZ ztS^SQYFslC3x&{lBrp#~OVr;c;Z~YWn`%^O5Omy423-BvO!=W<4J0R{Kdy9!LpHUA zQH%v5U|Tym)%7vr@z!XHg{0I-ijKP>e=}x%VZZUPG+AOM(t`-1>;3cuW9cs-uytf4 zrF}ZjnPosfykm|W}+#0;+bnR9bK77a4 z5$@Lj{g$u{*ahHsBCZmkuN!y+bb?VLK!4O3b^^Wu(tzavEk3ynyaMRdq&C1nAPI2h z+!4MDcKr^=%4h7NKp3)BQLk(XP)|)0Dw?dIAZ&GX8@L02;Xo`P2WA6{fYrbq-~(WY z^m_wzIzt4&=Wws_N*u&iH~rOXiEW|b;+v*BawLn#j_-2f?4AaO*FtWVZD}?svn)^9 z_x?rGv0pjm2Tp9-t()JjM`>5~n0Te-o*UEK?LgFo6>Ww}Z6EDEJO2Knd!f0<+B{UY ztZY4Y)1AggcOUICW=8P2BS!8w`sPHb1D6KG`pvo#Jk#Osul`5pB}d#qvCbC%`3o50 za)E@fG-XOmqE~2)Ql6@aj#29FLStm3V-%iFiOOiXA|Woy(`iVILK!Dd>fF}LoBnw^ zbx%!5NmayjPKrrQQOFWJod%^wCB#Mdi%AZ(ux*-kc%L~F-xM!QaVuGoyyW-QJC|i{ z?zGfqPf^IQ78RHlgb|N9Q`mT*#A+YdETG7m7`y;`16EBnptfb z;c>{?cl3h=*C4*FBa0IFx_v1bz#k!~@?|+M0o4pJ~^7yw%diK^Lc&8Asr9|~5fURh- zHJYOYNWfu&s{M3TA4CFv|1E*qtlC5Ay#HHNJ;OZ_soTeq1~Zu^p%}4DriqYp9Mg|a zvpp8ce4^Z+Po_5W6-eL{<^FsE`XX4Mk@@gNpvIJhFVKad4J6{948=(Mj5@SKG|w+Z ztIZ;riQT>wLC=yY`h@^tW!G%$gCSFDsLIc<=85QS|4a1REdGFqUjHScp4F4YDz$F~ zG&LG*jbXZ)&h%E8)Tb-{8L|3bqSt11G)7;q{}NHp>Mw}mJ(N{(C=PxZi2hQ^);dT|OUN&rBEsie`%jkBxDXDU~saQ3+{I?kaD!yHlLfDM_B< z6qlro8y(}6f&lIqRNb9oa}DCn6M!o-B(VCmVzCN=h_EmXLs;aY-q1Cz(^SLLMIzo#G|x5F($zl4OLBa*d0n z?382WsR^SgKV3GXy+nAw6i&(kBDG^hexa5QweSS($r?@dmas^cyLQj+_lH!ua zc!}I~@)6XlAafmi<47Ac)y(UHP$)=};*&JSB*mqJ4OF+xX@V>v4jgF{qxtEV6BG)wsMxp|g_p=BG=>F5wK7fkR61Uw27Quh6Lys<#~ymYbf5Qa`Ftznu#$G1q=02GFsWCC{mN6 zWu!cDd@tf2B1@uPgs;;E`DpY8;*<=!|N~z)KWN#bx3^m#yi}l<2ZaIptAG zc>=mpC-2CGolR%Hu>AO?cCAQQ^q>E4~R+Wj&2to=xkZ8 zHG4yCRA|07W3PkP4gdfDdiw^mBl^?4-tIQIJb9qQk*Omck4#vU* z>!2f3Pk(h}>Mvv9mw04q8~Kr`hm(&?JqcJ$KQeWtd)w)GfJckA)7!UfJN<_?ZKn_M zYdgJZ_qNlQ^=vzRSMRpd>x^hS-8K^Rn6}f;Cbpg4srtc;TLxt_hB%bXxX`$4#${lg zQ`wB~+m+4m>{~XYOMf7yY)1dgvKb??%4QfZD4Vf${;ip3*4>&}y5ZK$Et_x69Ps0< znag(Hnt9^zt(m?>w`O)LzBRK4Q1{lYnFn6pnz{9_TQh&Z7&WVXe8sFoi50VMj<1-t zBd224PN3W3idkp!DrRNoSIio<2RK(Tt5rqCtWJ+AW|h6In6*6p+?;N6&&>&&cW#bs zJ#g^c9Oa>NbGVD==KNEBZcg#zb92rBeO{cKb3}Z8PPEziIV(>(&F#0UYTnBqs^&>| zRL$$KyJ}wZJyr95++Q`X=xEivYp1H_#hByfwf^pkH~_ydAR~vYX9!$i9&4 zknQk;Lv~YO>jsDHm4_U%ZH_x+xB1l}yKj+0_LOT5**T>S**oqyWFMRJSN2s^r}^H` zyU#cItNZ*%@4L_cn+u+QM-)8Y(I$9)oPF?ov&O;mH@OGTH}MIczqnKI{HQL$^J9P+ z^>;1k_P?dyW;Sxm>0RNMGiZEKPK&gn9MjCA9LFg|Idhg3<+NN~lp|VKlyhnmXgi8> zI_@gU*?F)iXX-CSIWvH-4wmG0KUR{vuec=lAaMG(lHBJdCAndbN^(2AF3BDHp(J;k z>DAokb+6|7SYOTkN_sUnTfBbZDwFjK3#`^J9MW+8!dWfXFRa^o{lZr5*Du^2zJ8(M zko60VfP!zlfa5m$O7el6xydm#$bBy7cgl(52^hhAuVuEp%!1?a-yY?}aWM2;3_R zT{^xzbZPhM(4{iNu%*8>3|rcyuY74zz^0}3EKe?V2^B5Bo*lkCeU9&nqwP!b_6L^a z-5FSt_k2)EUh^>}dFNCmc}J&~Q~ zx%U0jsP$jXd$T@m*_-v_R=rt&ZOxnYs&#MHJ8XNi{=%_0>n{WMPrO+_`RbeX{VLw9 z|N0Ta8vM0BF8;3#&ZoL=`nkC4rri5oH+}P>>!#trPr%i8T{oGS2W|4H7qn@RL(rz9 zje<5^Y#Oxb=XODx&b-*Xxmq@5OU$rwThE2=D`+!pUqSOx`wCXX?kiXYY#Fn!Aa};T z0^gbY3L50@E9kuvVb<*{F#K^}f%VpX1^v57w@n{;X{Pz~)9foUgsu_4ADvyK-N@ z*!7LU%U#2PpMa}oFL#+Ve!0u1*~?vnTD;tKwAIU97rkHZ`nl)JU8}YX*?lcNVb7d* zJ@?i**k!-ny!`$DEX?1(dTIXth1>G?F9D)=%gD8F8pd{fI*k8%G>kn>hK<@|M;|z6UBit&dy|vOW^q)B4D(Ue-q@^tV2;IMn(` zqoH^nZ+%3ZW_`py!}>_bThZ=V_lDq8s~cSNtWx;vs0TNKir|^abxAz$B*7t93Na7^6U7)?M@j)v^$ma zb-Pm?r?flO378Lf&uVw7aBjO(6?yGWS+4|WiN4GcTdq6hdo6T9QPD$k?tw78FQg{nDRpLNT7Af zh2k};3&qspDonBVo`Lsi0=hGEV&ZnONiSEv)T|Asm&+v6V{h*`s=~-Q!Ph0$0bmp$z zKj(}sdR|Ji?RhB^m<_yd((}^JW<4*}ckg*A)wky*`?k3Ms^_JL!+Kt-8s77gXME2~ zA*HdGtiL*N`LBormsgB9aJf9{z~y%_2QGgjKX5sB(t*oMfiW2eE+5-);Id@Tfy)gF zK|gfh^2NddB_<~ZlsFU(D0y^#K#9S<0VU0qxW2ISf$OLG9k_mNz=7-i1|PT{_sxOprZESuA4@)Py(;~{^{%P| z*LwkvCm*<;Hub=D>+q^l<*2ICz42A0zX0Ekt19J`Ri*XjR+Vngttx%Iw5l{xuFmfTgnl;6t$Oe^L0mRKj>v$spWH=|MVJ-=qj_da+f z-<#-@eD6W;<$}7IwRsIaP8@8)Fe(bLDuH$!=--xiN5RJ8{s268Z zad*5$#q-5*S6Wnb&$p<^+GHbFWoq-Vm-a5W4+?wv zuus^_s{UawJ--fnc}8)ia!JOYmBq^{D|dWfSy}N@W#wN#S60UFuB>c%va<4Sab@MH z%axT^Z&X$m->s}1`ns}GR#jOU3;2hnyt*Ed@@i#V%B#@Clvn4KDX*>o8z-c^l4hp7 z3YY@yOL=8@H04$Aiz%;$T}pX1Yte$YZ&xgMTMbB7E_kc{VZqzBn-;uX^3#I1ulFu^ zyKEosOBTExb9=$t3HKJf-ST|F+do1dyxaPC>xVOxIQn+)E3erY|j~0n>rjt}iVPy1%p-;Q7+x ziMx?iT~8ycCasOE!n+z-B?TK5=^<)a%=RsEI z#8a#qbTYU7W17G1u55qX&iVefZPxkQ`T<=x_}ktr^tb)}kiTulC4bw3NB*|IJodM} z|2O;%JJ_CR;A;1vjjP=&A6L6W-CXV5<6Z5(nc!*{pXO?p2*j#f?Ji}y+MSs0YWFP1 z)$aIru6B7lv+TO;&9d8lHp|ZEQkGpiz_29CZuOlkyAMyY?6SGZc3W&F+a0u>Y`5BR zvfUV$$#x5a%N(volsWtXBz;}xpd4Q2a7R|=aB*Up!;48}4&N+>-;y#1(^X{-L0iil z25l>IxRCm~LB^fXhLZ*>8fF2O;fjVfLlq6D3|BPtktrJHDisa?{#MaYxmeL~^KwPQ zJO5KOe7*%?wkaAquHN9-2-y7n2FE@58ysCXZE(D@WrO4Qdp9`RAKc*B?$8Fu85cJ= zF1`Z#jSY?i?r(6cNdDW=wd)I&LU-u_`Ebxw^C1rNjPW zmzGD0T^61wc3A?fFDiEF`X2sueseLi_|2uE%0HdVNk{I9~L(Y^|o2S?SgnxYd(L-0s$sxIOoU8z6D( z-c{n36(Vt)Gf?8T05FY}xZRdZ+@>ldZZ|!n+~OYgc7GZ=+WqmJO!tKqneM0FWV&B_ zm+9V*%W{u1&T==k%5p!}D9gRdEz7;DdzO1I;IU_xdzx34yZB6jv_V|Cw2tU_3tNNZ zEy_%fxA?>Qcnej}<1Oa)KHg$J@M-}32On?I>zm^(EF+J%xF2`C#msTXTli-@X@L&{ zc*q|P_2~b8sK*E{!sBf&P%3?y~&iB9R_^Zn#5KL4B6#b+x} zZ*~_SZe16jwHvzlco+od zt)E54TE9kW_)TBycOrYO->f(1{N7fd^Q#6VAI|xyP0stZH9zmS#Ol1?>&EB(mNmhB z$Mb$;g3tR+=yl$2%i!~VePX_8Z?V3-{j>j-xBsxEy#0fp%GlG^hoDXkT!K0^0seFi>a?Ou zP^aYJpib8Pf;#mZ6x3;QWKgHvXoQUm>ap?COxf@FI(Dcg{KmTX#wiju@04JPLUBReEq` zSbDH*SbA`nJUw`Pa(eKMdGO0l51zX?J^08E>A~kVr3VL8tm*M%>*c)2@4Hy`U(n66f1_Z_{y+D!?7s&P^~H0NWq+>;mi+@KTK12bW!Zm&(}<9^&Lcvu zx{nC?185-~5i;CoL`eP4BSLof8WD17z=)8ZgGYo69XcXp{%C|v91&8-F=s&c!$$|a zw#pv(&>?%^u%_7qM*?G=vIpL5kv(v+XZFDGF4+U$1ZEFB**$yUm7duH%?D=>d_6pS zV9bnL12;72HR!^VgM)&7zy2zrSykxo*K@*d-OLHA|12kLOI1$T@i#ePUN*U5{cUr@ zx_IP)DfbJ92EHmBy3uj(&>QZ1 zhd%PyJM<|~=DBz1VDG&{d;0Ain$&IY(BOW1hweMwXt-;Glf%VMCx_cNJ2`x~&&lD1 z!%q&MGwS5<1;FvRlfzw=Cx^G6aB}#J^pnHgC!ZW{G3(^;C4>DU_k9=|c@UV#MMT<} zMMO@ti-@#!iiq6p77=OW5fRy?Q$(ao=ZMI5T|w^=5&36GMC5l{R!4R$SRH9qxH|Ic z!PSu+j<1evS-d)O;qR*>u_`8V{e{($UB%x=cCh?D(#-Dr$cFacNA}zuD!c!3sLc57 zP?_Dkp|TNX5wf?fB4o3@BV^wKzjlj|P3RRNyWc-T7W-9%Yz>nC0jXXmCR(#D%p=4R>`LPxJuT08)*Ai$@U*yC2M}=b_s6W~# zM%ngGjCwjKG3wW0iBTa*iBW&1;(1PD)Q9ZEsN}_oQ9(-*qk00_YZ9ZHZY_-J;WQ+A z*Ny|D7tMB#ah&fQ(;>$>X8&U6m=-IXW3I1uj;Z&vbBsN(VTW@}w=2#ubIP1!mOn(8 zXU;K&uY1H;^k@~^sCTQ_XM$@W}_Q3wk*tx%C#?A+(T+57Yek(K9F=o5B<3Z4OV!2HdxXC+zw;JfY{V@PxWY!xLux8lLdO zZ{Z2YTcjr38(25#db?+ei^&#B%dOK>#|<@fk!DNhy8QtT!?OX)TH zS&Aa}S;{fsIIv*VvlMyZvy}Jyo~3j=+i8NsiG35!J6KK}+sty}JXgz!E2NeaA9c2z zC<(NjIJukU#6E*8C%zjD`ZtynQ%6`%G#qI;(Fm~Fw=r$liH&I^fz~HCrmZ=U+# zjcGqW*q9djbYt3e(WbQRrkm2{S#L@^+A3;o^yu#5bVW~b`lL&(GO_^6%dIkON?K)1DQ%VEbEj2C zZe^>Czw3HsC~dtmHamD_+-c#J@!ZoZ!={Z_#()J+G7{H6$;jCFB;(nSPcqu?d6E%( zlrs6)aEyq3f#gZ4eo8iU*TX8Ri z>*9lLl5Mah2f)59ZUYbl1Y!S9H*7D-1#Salafa9)K#cDbtp_TBaNrEq0A~WNfks&B zI{|CwcHo%iS3o=5x0--Om_PyWBo#~JfOz0Jp4%Xd0vJ@vaqm4*wpRH3HQb#*PD_rv z1~}us8mlsU;XVOwbKpA8m)iw*ofpSF0@}3ZI9k_#7V(F}orLE@fY=-HQLe>sLx3B= zTO6A7Ey7)Y&vC1O=0GHn@DInm#14o5!7T$?1H14%3Frt^zhl4VaKB?MaqF$9@6Gru z@mlZ&Jk7_kfN&SVJq*MG9e_X9;6w|!+u_atA^@YO9M>6G_ynJS1bzc1;JMi|$Ovwo zKe132?jk&Y4V(sC_d-X2i-5;Ij&mx+CnABf!13MKVg)1uj(Z?apa}RG<-Ck@%bLI) z1B}IK&P{=Bz!e+`J|74M-r+eL;kpAYW{Wrluxu9U98hAR?(!KTZXh5A?f@R}s{`5q z-~jG>Oy{@<8IUp7#GJkd`I?`74115OR!t-(9yVfEuei*iv0d>FTxT|n0 zhGNMkupMxUz!xt8U-`@QEH-HQ9)DE8z0eSb5pnOE zi@1Hj3EWQuF2Mg=pg$0lihAgPG=Lt!VF2Ht;*x-3f0P%f1m*`oKLKlCG_W#2#1&zs z@^rv*4#&Nl1w94=@f?Qd7jv=W2<~!V4DOwQEr78II=c#dBh6lBSWIn-_;91)dH{LA zUOc}9CIeT@(SCr@Kucg8+WxzTc&;bnipOIsmjdk?xB@H!8Ys~=fxE!>z}OV%HSi6jz_yc_b+#FyW?wx_1Kx1dL>1gNzWEh8bzU2dGoQQh} zw{JDt9B>%$!}H&8$HQF?`Uv16U@3xrE#SDQH>hWz9N6|3WDK+f(%+)qfmgWi{th|= z9K`cXxPShDz99j64pfg5aXInm3jtHy_X3Up(}9^dCUt zdGsB?N!-U?z_MiEFrG(UMBf4I#q)N!ZErxQ0TamODBP#l5eC=*biW4qU4>o)b8&wj zaDaa%+Gaf1{uX_TFZ!O-ojI;gLu^?B{%C+t`T$*l&A<-$Wdb;zfh&hQ3vMXT7`U+% zb+!cc1a!uI+A`<_kd6COaP60)U3>=~;Kl-BxKFjjClD;Kl@s^{@W=Dta6RincDUaT z+{3+7J(K}%9MIStL+bep9jR9g2 zx5EhaS_k?7T*h-ca2)sEQ1E#`o&;?RD8v05xKs9VTvY?~fjHMS2#Caeec(qR%R$7o z1&V<}tPOVtN)RTI)`>@A{2L|W762!K%_A}X!Mz99ANVjr#Epl00`7cZFc5bP?Q?>N zOF`Q%03HEW_||VE{9J)6Kz}^H2aW=>0RKtohXJn`Z0-iuk48TLGz3NgInijVz>z47 z5kPxDjOTv9(=d#YgW(6aG!%Uu+}?QJ8IE=iI1NR6!*l!)^qs)3z;}rlhi_v{ZI8Zb zF#4)+^jUzF5(*4VO&~)zR(B#5q4vA z1f~K_v76&6`s`S^uYjL`2MFVdetk9Ep@4lCi~+!u&LZe6Fo zoB{4()L9lF!t*qs8_@S2$ISywfKvz~$^k#$!XKCgsPNncIF9>5xUYdNx!CLi_y85a zwBI2|@Hut_`Xay{I58Y!Cj3(2w)qDA%h%u^aKZCMJWmB0|Ay{ThWQlwye{aU-#er4 z0}cQIz}seMQ@}*P4|we);&uW`zz3jDlx_ho0`Gtn5$3}{2yhfw2~+^I4R9pT9{9O0 z`o5mfuiog>fmOhhUg*;Scia!?gJZ7&8z2>71Aq^>KMqWVu7;xj*^l{;ScX0om<${Q zz8QtBASiDWxR-(DfORA`7y(5fPpdkXSi>JMBF%FJJ7Wo=5}4tM+RcPh4$tP_a>etz!BUph3kTF z1M<+f0?$`Mw;`uGaN7dWz!6{}umyBAa04)1g}H=M#I;kPjgQAW0o*;nU%-C&{{y50 zhp19h@%{j}GjI_7hjK9b-+1)-acFyRe*~(4pm7-66Ci82CBOjmQ-yd=1PpPX5{W#3 zcR*(u=AOVYKpZ9F`T*I0b+m~49d0<><$&=N5%+Wu`r=NQ+X0<{hXEXiFN|@+03$sA z26rLwb!Uv(Kso#t!R>&2nvW21lV)Ko^+Wx($Hq3eGT>f2@Cr8ut{bo(Xy^~wAWR-G z0-#e3Hv>+XGdzH6F;>L&1}>mK84fH1e!=rJ;4RP=VM3iz@4#tbT65^H3+6^}djclF zVE|_xayx;E08W(QZrWfx1j2yjz%DBs?F+mES^{PDL|i@)XpMdvm=1h99(8<)<9>op zyiZ2@cpe9LCvZ)Uvcc^IHwQ>af_?(mQ3t!=Rs)UtVLY+Gobs3dkG(H}kE*);~JAhKCe)JbNN44KTtnKxkKQW8M+MFiO;$iD9oAb>Tbi`xD| z>(W~77A6D}wA!lmXKnxAbI*Hk7ABLK`!0U||Igpr%Osh1zVF`q?)Tht&pr1%@DOD` z%0&lZo9x5EzP(sK;j?QE#y>t6;qw!e4g0b7Md^j{H5qf&jAqzf@8P-Qa|AwDqx=y+ zpM%doG{K%lnTGPxG4wG?1m&;&z_B8%!BO@XVl9Ny9_5_^v;pOFA2^B6pJHrvMmdJ- zUO@Tx&%hm&nJ?iP<8u_s7pU(Jl-~H;?@{zx)ahl^59KYCb7DG9PQjEV{jq)_c-*q^tScP&Pex7%a=88he zU5U><{WVuVl&|CWmvI7e2+9%seAVyKrnjIYP-dc>`zCn!1~`Dy9_4L3yXh!v@b?E% zK1O-=JDTeql-?*?zOA`@D4(OWzYx4b38NhQF6LmAAt5+M(I z_dywoG7sf9zk)4>^3z|UPAF6Ha~FJm_6yhqC||?x-~A7CIp+H7+G9L|%Ue+T{TT8n zM^IkH-!Hlnb~`@*i_d$mg57~nAIg<2z{eQ)QD4}VeX#bx=Tv-lMfvz{&Gl`RM^M(G z48U_f1!Xs`nUBv-<VDof_{<;+RME`d? z3(o+h5oI&V;xl0b;`4X-bfbKFhUR(+WiZNQ6d(T9_bEKPsd#QEPoq!{np>w}{+Wz< zXcC?WKKJ4Gf8ldCN;!W1H_BfZV9uHd-TVyf4U}&9`O*o{f8){5C@{igL$;ST~@wjL=+* zP(FJAJjdt#`20G`8kFBY1p61I6Uv`)ZR7^$|h8|5!Q0;f=}LMcGmtivWk38UPIvhRm3*S}DnM(Kuf8p=brX|AQW!p27V zK7PL97R}{FS&q_pGu8npMJRv6??1vdkD}cB4UEw>c-Cv-lS5gAaz1{41Z5M-Wvg*d zl-E~boS;lV`5AuSjWISJ{Mft@x}!U|i}F{L+1+4kp960-ckA(HE-T3)&luuADJ|BLl^RT``8HaNA zxfmzs!0ti02IVhj!+(nMBL03H<$jb0N1^R!K*yjwjZ%+t)9Dx^X!|+%+=_ziFs?^X zI^ergQQpSSJ~!+wl>egKb1j~A2Ry55Ft?)2!_P-huIq>~i}EVUMY!%4JK`;0bR~4k3iuW9S%J@O`0R<#11R4>8MGX> z>Wi@T@%akMbd*Pr!X9tL-|+e87@iS+E<@Rf-`5|3enxp1r5C=Njq)%2eDEdA)7@~6 z*NZovgv^trbRs(anMjOA*G=gzr^AL(9JHiE!RbZUL9}x^(P231=)u{{)&wz%=%n|F zRg4Sv!jX15Crt;F>6G~!5b2OvB>5aIoqWF}xdXZZ&F|_DyfVDh5LRL9Uq6Co7vZ+! zvboG~Ep7X<2yS|yt;@WqTh#SNTbEIXl!`@W#wHZt>3Ljq(mLa1bk^G=GWle@Y!q%8 z6bXScURI1@6UKWD+qfw`*J6==AR`*37083x(*{}?y%ur(zOBm))U4R`1upBF{OEgP zT+ooETn9cRdH0B(3y9wW_&tn95f3OQ0w3DG!w(d&!p% zga+y%?pK6MPlcTZdopo$Prks?EZwrZ&~QDO&4r{9*0+5jv;ALfU&u_p>&!MA!z`WF z_Jz#AhPE$cc3pQ?o401>ENc5gX2qx3Tu3AS-m}}hHIL@`ZC}VEwZl0uk&*`m&15t} z*%%vw&(Rn?12Ayt8PRT6=UfD=QT2|Tpy9gVT!}l}^^I^x<#C4< zv$6h{Xfv~CsGKk}Xr`<%vFNazFf-}A3#Ho3YFg@QqyFpP&+>8}>33v%Igjqq*jy1j7RLTT*Y|g4*pS&mE;k;FIO=h$(Ogw@oqe#r{^lhBm0wF#dw52a#@a* zWRLDIa~0zef8FId-i=58LWo`2`cNJMOU1D5l~b=U7Yyk&aq`91sK-k%c$Ja8kl`AY zs}PO&<+%y*ct7>WIaQBG`;gp(c&yLQO^8SON4W{{IKQfWPHo~*J}NgM9^)Hw6(U{! zX>LM1zAv~kr#A8Eo&uqaqdPIZ>|1T!A@O2sbbpw;kl{M(sy5n^dM6s)SL7zdqx-Jh zgm`r0RiBv|n_N8}-I3gccyv$CO~|yaa}(mx{j=PJcy#|US0NhRALk~-qx-z8bLw&) z-B*!NPiW`@tSh5%mK$QtY3W(|hE|!$ImmlJ=$2fCtkHhvHPXU{>sPYEH2Rm`MWJ+Iy%CCn^Z z)mciI+4TLJOg7OzH|3#D_TQvu)2TO`cg#h|VpDs0VZ+r=R+!jSC@0Kpnj|O8Y+5ZR z%xwCVoG`QLJvm`!(|NZ@J!fXq-EzXrriiRCv1yu|FtcgBoG`QL4-oE3oJmg%+LGni z5sG7quP~D5s*eHE$0>-#wr}0449sv{tqP3T*i#J{vy;x0D(Ew2>k>6!%-%z4z?jV+ zs{vznUwoUAK4Z2IR0GEBuT%v_+TcYsV5}YXssUqd@wM9#FyA`S+uoJD5CA=$09ab$ zIyFFstFH7;T(uH!3WNPSPNXz#qoe-4RD(Z zAY%Xh&ViWubh^$V*O>Kd0d!mIq>V>B(={iqWDh~SyS%u?_%rWN00X`|hatBA)F}*e zz0N5NGyQvaI_w+fd682XX8C%jFwF7yox(7~``_iTZ2j|Kt>gx&8gF4jaYH zUI>`Z*-$fetLz;JW-tWeDj`+SV)NzQ90B0nc}@U`!8_yun7jX$2VmCr>@M90%-3o1 z0L;|a4) zi&+eG^>QF?xNeabC-yxiE6&{8AS=$yYmgOZ-d)~Xvg??2kI0HM=bn=lXU0(yEvaF{ zeEULPoY>a;Zpphd*T&0=Gt)kRcsrVsO0g5u`hmjh`rzr-GgQG0qdJGp_ zp6LRMWG`lSq2c;XHWw0c{RJ>IpeP z!}YR^AdR}O56HQyJPIGqU64oRw%i4Il%75?=c@9krIYMAJ`NtmYjYRmQGM3EIp2{- zd9jQjjrx~!7i1P(JSgX?GAo{e;E&S}@&Qo7beh$RO@=X0$A7`4?(8nLm~hU0If@vr zJ8~1D(NDQxv#ywFpyVRLBmUi7M0l)UIyi@l@hBgWiwKYJXL1qYk^N>aB0Q$`Avv^# zL-2}n5#e#XJQooj!Jk6pru4%yzRpdr;X4gQ5(zm`YlKIfLKv=1&LD^ZjZPq#5qRmf zd|xm_o^=AjjEOmcU;cI;6B8en6J`!BkP~M1y)GxryrVSH61~lg>nA77 zT$>;#%q)9JPMG=ixvVf*YBxP7)nUx3$K-^WO&cKGinSA;?~;8=MO!rDJ5T{srlhQj9b6s1asdL?5A>?jLD4Cz_ABIz! zL?UPtCkx4@WgdvZ^OUQYr44R>#DTcsdS70gw8FYaCGXCf;h;xSoVCMid6MF+A>PcF z6lX0F^Gb@drg+6CDbCvB@L2 zQRlOO0vN-kmpFzYD)n>VM^ZX6o#p}5-><$-}-Du6Ky^=grXuFQF02b^z-*$06APOq@@9FFFi@n zhHK8rfhJ9H^khJ@_V~$TC!s@Fqx|e-K(m&)I(!mp&6*S0c1_o)71hRu11xB#IReRP}XGT-go#?O%;c+{QdUFe_$+mR%>HYiR#rpS3+q(^lE&!#Q)M+|U9w6YAZwYs$D01Q z*8F62e3CNb@)1i9{AoVd8VKEzNu#6_vb0Bs3Ta`(wOCe|w89ycQg=2rfSfS1{gH7} zcV=e)Q%=}4na4}rnHhWK1Sw%==O=Q)%*3i^r0&eSx_3>K5@v?IDJRTqs-4uvod<(G zk7359*_x03)8gERCA#6dXEM$*XJS<*VT)b!oP!vyKRN{=wp~2MQFEAe70y7IeaD@F zFbfAwb<`YY<2q*`%*s=yIjRY>bFwoKW@&>{5Sk-zo9?JN%-SW+K$yL^%s@a%CIZp{ zVRDuk;4dX$Wvkl<7n*_J!x;3l0MXkSgvI0?s-R$BtAQd`pE^@P1DV@hR6sGq{VJfC z=gU<G=5@bi4jRIYUhV{f zx%_V@5X|CXFFI%l^LLXI2xjg#mOH2gbM{eZ5X9C!P9T`47p!p55N2pGAUbC^FDFNN z9)e(&6MC|s#m@Jg0U&GsN(VI{W_FbaU|t5~0hpBww0&Tk-(R!n0Sm;fTv7KI|rd^vOi!Y(Ok_KCBK5Z)H^lMy!27 z4Hz@{RW)GD=1pE!?jAD zCToj_0M`8;IKs)QPCi<}Nk)>19%&^wIqpO|=NJOn!DB4BBUVOyjG4c7%*B?O7_f6QHwx!tlY=Q}cs-`}3I zAoKNaJ8~9eX2y2rEXW-E)vlZcnQiA*=Pby)x^Rz#ATj91y*UdqSFYTbvmmo#LrtrK zWM0QlZ4gHS<~;1fIgXY4@shdp>_``u^(rpEKKsipD*Z!7%y3S1~5eZ*mtS+I;<`9NWgE>5;1#Q)V5+ zZb?6s+fMENX9#zd6}DLM^`AKgFitW-{z`Bfz=Ow6j66J}1ieks*q%%)Bd zcDKc*`)!DUxxahbWGKAg+thU?b)tkFrW&Cm97R$CVw&Jvx~(#&ixXSH+TZ?i;awX!7J z%UNxF`*&HQvszf4?d44S%U;hCosZV8%Jy=m?JaL)iO#hA^u)_4UrW$MJ0A3|>@Y}4 zhwc2X(fIADH{o4Q9+8xq_zQ9slWVtVpWPP9d-yUSdg zaM6`*U1W{&PqM!l@jGv4iA*E56%;WC5ceAPnkG3tixYHn^ON&!XpVobH+Mi&M|*K%_y01;z84w;8<_WR0YSHqzQ0cGOGYe9TY&6S9%?yH{6G^R-b66|1UuLI0dm-c=tb*ff=qDs=$b$zf}XqeC_xU6)z|3|1XKgG!lC?!ISBcm|!^>k} zqf>fMD=na3toQwZ8=Sq~XbaBLARA5wEK-1~hb66|{jcIqVEuBBYFO4Z^HjsK&Usfg zENh>uKUdthtcMKMu&j~ZR1M3zsolR7cLJ{(idDn1zS^Z4mNnO1U*NqznN&^k2{Otn zT!2D4i%yo&DKa`L7IKZk&!ojbT|f?33u$SvU!E*z!*$+&PD-swll40p(5%hooeXH! zXdj&nXx3_d|9cYpnl;;+lL5`z?W2{SYJd#aODcd!Q~k?15bLFz zPIcTztcAup2V$M`Gv`38VZLw<#QLPmX^#7dwZ~lNK&&g?RRKhr;li&uZW`->LC%4g z^;-aRXC|YB!ohli?*%Ro(zXX+$t17YBCd}B(c2k>#ry}pt_aF-?NtLs?Els`6x53O z|GWw))&So*T|uo_2fU~PinYK^XDFx@>w)PipjZ>!aHfJsbnF#rj~k z3MkeHGtSmrH?>9Q!O#UkS2q-TF?bnPH4r;+n&2s|5 z3~d5L#t?;UUu$^Z1)A%gOjOSn$YO7eT0p~f@wXJ#keL0rIzZ-mqdGuleg3zVHJNq5 zo9X~rBMkkHvKq2}*rg7TwZ)?sDyt#uj-x68Nt5J#S6K~Nue`1fkhRRji`uYG*uPnd zwLuuG0^XsamBNYpy?+N(MrUgFP?n~-|6;|EhHJT6NYXYRsDxyFbN?j@8_pW1Q6(hn zoJTKJSWDJA4Jsj7?+pH)!dkNC`JGBg);;%rUtukIFXoU+NY+1h{y5 zA1SFBtEs!&DFI^zb;)H)z*sf?O$`_;r45%WsTr%Iepe^~V?{LJ$4bCh1zp%)5g3_1 zO=`ec?NnW&^vY)O)mr9LESbeE4e_1|7#ugb#&K;(EBKwl zus%5G6oxgyg&iC=igiH5DGam!cTQoL_w746Y!oworBfK@`sr?mwP6$EQKvA>@9j=u znAvw;+s5W*{Lp4A+y+2KpG#W+7Q16=fWYrg3Ti|Qf5@&ViWg=Unf&Y0UP=oC7i6f35k%I|D$tm=geE^-OsHX7grw0A}%Tz%X*ztZ*w$YFB;y)98xV_~SKXux%y11>1xBoW zS`8R8xLOSuv-uM>V9e}WZ&vaEnB|YD0b|B5QUk{9e^(6{Yl0u#qNLB*I`^vqV-2xf z4H#>Svv18xTUbGd>8|(Wn&JE|Vo8v_fTabx%Ly7TLq?F;y)bt{X7Vp{7i896c1O;g!wemoyCAc1X6}N_ zy!zY)nPr#UnR6SNQG;Xz$pSCWU67fwCU-$*#b*#iTu=HzPJwzJRErXlb~iWBXbYc$ z`wLsKzT4fUQR1?6fNj4P=v4^A{+AQB=r_2lV-Umj7pEXZ%i?a1YQhw~q`M;!rt2|h zAWYqrJsj19Y3%Lk2!tv9Z)YG(@BO_T)r6@Y=M{^SgV)xn2-#I{yC z0uBZ3OP~lspr_Fa`B(H68v?T87K2agrvS!qJ>ndOSiH?C4DihIu{DDGW2a&%Gj6KOHrPiD{lP zDW*4s_dpcEH8P?Wqt6}W5W;ZfJA)u5uW|yxEdGZR2xhS7J_mil?0v}z1T*)t!47J{ ztgUbYVJ>8yKrmbH9^#-Oyl7qO1cF)mg%b#7s4-NdJi(c1mipp?ItaC5ZpUezDrB*8 z`!H!?!?kRC51UtbEjA_Z$o|Tc#T1z=VlnBstSDa6oF{cx zV$oePqRgQZ8Bu1?^D?5$pMx@@%%1mTM43C^&X?$6X3i}#qRg8|O zWybs$qSsS)nh4f+A(5XZ8#n1SUMv}N7qght%Za$*dQ@JV81%TTIJ0QBtT;1iyR0~~ z>9DLgGwK6bac0%oKFQ~9GD}vR*)>vLoESDnR-9S(oUAxA?H3Rqo|!U75ErO09{8H=GP;rf9**fM)tGIT_GQ?RQTGG}Hd# z!jteAStay88PKdQCZ7ywRwchXInbnLPA@tMea$N9&XWPn>gfeQXEX#T(Mt~~Bzl=U zUR5VPBd$Nmh~eC}Kj*uV%D69AF;)jJw@bV{ybOuyH26=Q1k zE6%Z!Oq*4?ixDOMldBjH_uhdVE6GFoZHRTsG}8`pU61+H+S}kH2Dg;Jqm)^Q#(psv zKu%LS3z(dOw#-!qh~Ca1ELts41!cH)sevN;)vJJFN*-4M#Wej!P(imdb+1(c#dIE` z0*WafRRP7cU#|j+Rl#93P^2D?tAJvaaZX6VU|==U1yHwSqBDK>7+klk2WZ(GgkIp( zha(`|RaV&20xO+^7_MVZL5TV7OC2?bIX}}G2($fjXCTb;haYp)9AF`WxlKrx*cs(@lTzoG_;==_BWD5kUf zNd-@k>0Az|E}1Oscql}AGOqzZPbUD@x<9W;db_y;Et%*ZEZIj9A5^4w<~Krk!kI)Pwbo-^A) zEtr{moIo%)2R`SZ7R=5DClJifk~t1)!3^y(7v~V#qFLK#^L`GPe$HVm=Dx2I&TxI} zd1bXDM&GUqj@dm%6&y2tt138V{Sj4gtN~7+r|40zHgKzgW6ki8Dmc~>6V<_ym0ha} zjlY}h8EKFyYQR{3{9O$gYmd-E zCCy~r@wyr?)*RO_Qc^S48&lPQvDWxp4H)Z;5sQ^HlWmN8HDIhSZdszFW~?p#1hCt( zCwl53r9LlYVYbATO{%!1A>L5|W4KC}I<5_Ah104W!mvJ=?-YhLL5F1yYr{I=C8sdV z{-G~AtPS(N$teso{>kMIYr|YWe}!WhvI|x?g)#ZP(qV0w*{=cSmh73G>_mHXRZd1k zvarSKsB;j*HO(mqF}lhb2=jTbGZ1F;Th2h3%O5xcVJ4rp+R-Cs9$)MXgjwu%2ErWf z?i7R=oaYRL`TLYJ5N7XkfLx!r-j8JEt$P__n9eEv2k(n#CuTABk~I#*4cAZP#fhaW zWyP7FXRnp4JTr5atT=P>V_9)#(v-I;qqd2wRhA7#avZ+C2v ztUNRAw-ASeyLHO+#&=<4)$z2NQRj}0*d=!cVKH!)Dk#I%pazPVdG#g*4P=(iQ~||| zZBhZn?CrH#K?9k|>s3H8tIyb?pjOQACsaT&+y9{kikSb%Rs{`YEwEVy6l;Wm+uBel z1EC8j%T~{{L1()m4p)Bb3MI3+r3qeB0b{t{bq+%s;C-hs%>FN&!Z7o{wcTMCGwa(s zg<;0u<`jn6KENpqGu`VHhFSiUa~NXyOs6o+?kcA+%Z&zfI2v0{*$WUSOe6lf@4i^!%jtg#~Q&<1;?7cEV9WWL!104Pj}JZ&WLS zGF(4W14WwSb`?;pHSSjd#Tp~30*bXol?o`<6tAj)VlC0E0*W=n1$z{XE7lITsDUEQ z@SqAP)(SsW0mT|&GobPkDVyqg8)9c{N;MDq;vi}dkvE2N$PC4*;_+5}4Zp^1MxFfI zSeoVXyddreN2LQ=&eW8Ih?jK$EXN;o77QU^!u z{ZJJgbGdJwqP}Bh?@wp(j!LdeoUlkndhg*N4sP9-?EL8=^ zx+A6vjx|Z>mpBYL1m~uFNHvh0ZMU277W=RpL@!_}LzXhyB`#{kZ~QWV?ok0`X_LRI z1vFfz{YqgCNu#t^2go{QggQXhDihTKvR+@=nY^-D-4 zAo+|Issm&l^O8D1)-qpv6|X)_uN-=&-DmCu0W34psipJ+me%-#oS@+v_nO2VNei_5 zbyuMB#n1kicAc&32oIo%y4?BTihF;_}q6|og(90N*1x0 z^gUTo!_`4flvs4Dj3{%cuZ$=&Xqb#B^QTZol-U!N5oPX7kP&6(JSQW{yjd`4pm^hG8o43g3$_#Y59G?b_*#cR}!6g)G*1<%JE`9$8^x&RKtwsy1_H zoSZPT=hQz--I@90mlI|N9g`Dg4&Ct=scJKe>g0r(M}7Y)b!Ya6?vN8^E?x0AsXH^9 z{s7@STPH?uMNo$8jF=KAV&Sh< zKrtsjYE)1wX6S=W3ZR&;PaRVL#q2%wo&qT5^2%lfP|WNrk1K#;o_pR`0!8!ZUV2%!R0zk|hClA1UTrCg4ENlUQyLB=RLL39d zGWg6WQi^Oi_YVJyzu3){jL_IKTwewFsC6nW72z+1#&}``~@}Us! z+PVhIENp43*PMeGF865;YeHIRx-$^gIOlxLQB7F8%ykCBn&kYiJE{q5jVfm#tRXJ_ zhNGIWHaO-Cgqa^X-BC^0oA#+Q5N7n_XE>?}vv=B=ZLpW@_kvc~`(FrWWN#*6i@gKS zatva)mN*3=_8xNv!tCvOwxi}Sd-pm6VfLPTj-#3|d!Kd&!tDKxGZ1EPw{smehuOQz zDG1HcpF0C#_6|MIQFEBRe+NhghgRajo%Hi>uk%lF^~^N?#xqK!2e4Q?Mh%eRTCM_! z*!-GvAZGMw-*ntZ%<2KoftcA-oC7htf9V{E8Gh;oj{AsNKF~Q3Gkt~%AYyyHb0B8? zIp1>JN6dOZfHL^M;~^HQF;1%?m_c2%E@-hl<_y4aUG{AUH6T`d0IOy8~oiaGxeHBdAsUw^TJZf8AEr~=B=2!PU7Yu&uwh;9`5^g{n=Ur;ag z;;q$un z-l4Ew62jm8!Gcf+y)XnQl8M}Q?X})ee#9M&7Wxc#C|r1Lekd4;miX{lQsN1EI|lqg zU&pYoz!&xf^L>|jyxxxHS8na6LrQ)5{sO;`Yire$Yt=y?gGv_Ze$+@W2nD>pu#RdB z8`wjS6rqkCs6BiMH8mJ5EiTl@_yYkw&!^)yRPR2S+l8)5t$|TQumot;2EST>IvSMp z-IrI>A)<$=UFeGt`kPv-cN`)fpq_u*LwTO?L+6}%&Y9`1vo3o`TxB*a@{o307xU*q z9;4_^8?6iXc6U$2=N-gjhwpQz{$Qxo@Z$-O)Gi&0KI%58uU_mcLzTj!Un0KnXkXZ^ zUDCLCdTh$F*n%}j7mgQK#Wp{4Z1&2Av6b5QkJRj?ujAhx-SJ|qX6~`+JL&81^bgc- zJTzShm4-t)Lu!}x#N)^9Iu6M%3e?s_BEEoLP+Jq$y%^v_%-detBj6d$wJP<5Jvy!- zalbc&I_dX#^d5oQwF22&yVmQkU5kMd$i!2x45-SheU(X{HX4)UF{Ew3q3(kk>Lp++UnMB?dgwr@&Yur!=69@-Gd&^ z_eCQ9V4)r=u!elZe4b#QP1UQ9uBvF<_~Mc3y^R}J#Gc)MWZ#O|o?T7Lro~o_KRWA~ zqid$d_Rfq=n?N0Md8}gb(K%~y;jyX-M;C3v7>KQ$cVyqL*q-f>Xj(8A653rOJjJ!k z>JFebc+7?`2%?qNEvVgC>?!98`U1h)je2=$*pnX`UAv5a$@7TOQCzp#t@Y^X^AsEY z(NJhY$#IkL=!TPq%k%k-D4I1o6x0XdI$Xlz1= zd&E=X=L%6r`2rz&D5ajqqCNwm3c5TFykJ|Wj^sf>2_zhnPAh;!g z+BNvASI7!o3=l9^&-WROLNGqJcDHyyTp0kh_XRw8p|GbMl#4$!4}ko@&Cf4_IDSHt zQL_m8&#uq?4HeH}q&8G;Zy5JN!#MmqnSQNU+E7{1P_e#YY(>MkXB)%Fh2kWZxvr`tv^6ghsTL)Ar3KoxlOkiI$iv}N5@wO>T3YC zzkbKzscx-j_o!YRDv25Ke%x$Y<5P4A{jtCw29`MqTGo(utEubuAA}Zb+O+KGrg@Ev_a3czF1B(0k^PII z1CMUlaHM+dk?M7}-fP@Di|EmjRo@XI+PHQpX1UnG^|6`H$0`;ctu*CgW2dq{)cVJD zU?^I5z;8gsmH5j2rJj;Qi-_8xL(^+F8lFSbeflU*F-CHDG}K^GNH6z>L!*32`Vgut zK_8O21VuQ;7xa=EB;C^^R8ktn1SGluPbm=5@u;DIpdWn(R0#Uht@Q_sk~Cs8BGexU zM}n9@y-<_B$D;mHp>U{D{u10R6!sTFv(mSws&s3^;(Dn@ak5Geagc@8$>a=n0kB-?Q2f3U z8k3(oUzc8cj%b;>xMj+U;}aI^EqiC-7oj1yt=F5kO=?+Pt;h9f%QMq(Ve>Lvn56<8 zZYj_XdbF;lY>a0Vv?-cd;y<(?pN5h*j33H_zEPxgM89~I0NaXeCCAG^i5P}#Qp%PkMh@s$z=_Lk3iTTh-;kvbFwRHNm z8Wzk!C`Qt(yGd^f1zBCc6Z-P-^uv?tw^)kv;NfYoek$40(MiGXg>IgR-z)G}SU{wJ z*%&%dzrFr|UJq>2y|`w7eKlR3qN3f}kO62WMnmncU>*(sLrY21`UAz(exIQid&+{I zL!@s*0ZbyrdT}%mfJH?=rqjoVwg%nW0||?YvQiKanzXS1)w1fL9s3~ zb(x^WZCJ=euqx`n3mW>MUvC!%Kls!*ZDMTG!lqRfvBhg*nxl)|S4o zp~Lv5B}62Iryp$Neq(x3w_(AW@6iJxJWi;<2#s;EpdK9}GmM&681;m`o-j;Sd>JW? z!ZxI7;Hqjgx&q?ySSCXK(hzB*AeZ)v3#c3U431`Bj?I2wqSM1x)r5jcox2l^V0AL!bA z9~5*bQik4!mq1w6&@aA#KWzBJt>AMjwHw;DsM+6c;q5Ht_*q z4uV0(u8C3g%fLJ`vkuhnJ<%o-D^)CVK|*uk+Cf|tH_8r=i&NNiI<>Z>y**_~%huAN ztpQIy45kE=suEe%?9DJ*Mk_P8kqi9r-q3=Q7O-TH8bxk>D6Kr% z2}x^4e_;@AX{<_%Fo$;>g0YJ~nv*mfz*?`SgL7hwUN|;k`qBNHVq*4t`BOa#kM>XJGlSo+?C|L8aw&evOVZG1Ey)sMi^g!!BS3OJWCk3 zu%a5CE?8tqcnc~U7ms5w!tf1;K|l+gZh;>& zftQ_Lo^T;N>Oov1T1ZBf2YfGqi4+XcT9`UPc*x)cDY)C8N6Y4*-ru^9@YsUWhFJ0q zD)4yq@@TlWCcoIN_at|iey{NAVr?JxG8&8u0}gm!FsQeqo3?}NyU@qR7G34mM)mZK z#)=WfEEZaLOz;3hC-7rK+w%Qn;fPg1ILgWc4l7?IvADn= z$T~BvEV{Q_8-tMnN9cxqv8<~5nW5)L`+kwcCA|*G1zZ}!r&(MN<`A~t(! z*O)EB-yY*O32gk`ZkK^o=VN5@z`C(kmW`{YHcpxq8@mGb3r4MNykP7I`2@2@=q<>> zi)Xs|)-{ZqC)TB_$!4n9jOAz3s^=RjU>?C{vYdC1nyh+n%WSe=-rKex3rt#LHgB1K ze8K#>A{xyJ6k5qZ&?Cw--aEuh@EA7@rp)_!L#@1 z@Yorlxl)%Dw9;Lx?t;AfaNSb37_J&3o6{&xxvn`%iFuDTvP{^vB;iD3pg;0ES024_;)$GX_?QNoy?C?MaMi&5M+% z)fJu5hqY@$1u2>~h{g-L>W3j2NLW+u!Q_`uBh)vevYE_Jp|j#O`Civ^w;-sgjT z5?iql8-B;;&@wW%Su6{0W+9$)Nl2J5EW{Gn>a(L;uBCuOph!3s*Ukc25z=o6L^FZOy2AwLp%+HIpKtVe?( zm@L=<67EI#gz_o+hPoP7AudfemE77-hS5WTOEZ97SuEj5%pVqVwQEUCEbBrPvS#SD z>)^5>@J2%OJUc+b0n&SB_4$;B|P)H z*p6zbSZ!HNV!2c~RliPes8|uVsa8yEoV!K1q$%cymT2P^HdMZ-b>(^>5CS1UrU}(N zYku>TIXVI!gjuy@N6Wa1mL+f}SFY%Yb(h{UZF+)psPFyBmQ)bEfXzG8;KK3=uCJhH zR0)C~MqxSR4IY|+Uc*KnMhXIoI@;?jw{|hd;GJM$=JXkYWsUt5~bObRKU>h6}9d7NSE@D1}Kh$>z)A>nsO^NT$uf9><2ZuCa zHMb|eao|Q0)?mbOuL}K9uxlS`8V5T@VhH=;09JQn8!r4O5^MmbcI|;?BhCXc%!|aD73i=jqE^MLlwMX{NIJS0cY|0uAQ*5l-gE+R>{<*Q5 zv9Z-tW0SVT_CFV!Je~h2g5q8zwZCuQk^OU%+l6@`ZNnOutmNe}ubOm-AKN#-Y10ax zf@qf5#!o?fRW%Dbiq%wX=H{lF$*~D5Gd4&+vTr4?4bim587rHfoySsK$=HDxjxMh_ z`r=YFEjD*)Z0g)2)pOv%q!x*G9h-)!Z{yLOvl^EyMcuM$6jl14+VEOzN`%T2SLm4F zco_!o9=_nkJp7-Sps;sgOB3s(AOQT(y_O{bY;EzE4;05-V&<`aPok3910{Dgz8AdniMP46#Pwk|5h#2lO~J4u~IRPjUxx4+pTB30ozx#V|n9G*4iS>L1$_m zMqU(snRI<}lcH(c1aBrb0cuwhKDNy;S(29>CKa~z;iVFxQ?O~x{wGC9v$KyD8{Od)`j4;vaf|_H4yQ8 zBK~Y18*TE?{w&%Ahr3Yr6hy$<9=jeqw5SR}49@l*gPs*xc(%s>RO5QXSZkd3A~tL2 z2jN(U``mJsvHKhW1DoMN&(s)f2F`9;x3Qt(VABBvejg-R`lod2uv_vEgz z&Cax=AhkxeZ~qrsrj}5g8TtC3TTJok2yM{uWAl<4xbvH0A_5`NNt`!i)`IA3{1S={FZqecsLQjd(~T-w^!@$ z?cC5ZeyiApFg=kwtw`WWr}PY!lp#_Aro634$?>1$X5`I*Xn9$r*iSnK2t6zJm1ENk z!E0U-Jc0cg#8^bz7_PMS8ZiznD20igEDe-UAShyt1x`}a$t#+s-5mgtUyhhD5quY- z!y0sOC8{HsnZlY0&5J4{K%Zuv@%iNxq&Eg}3y5Y76-Hqc!~VzL%1Yc11-0L6-AE5& zClp(1>@6+D1SLW?LMBDAk3rg%jB5(agAr5+6_sf)bkM;WUulRmx+ww)Vk$PmQuS-A z$_V=cLK~DKNFA!k59NyOc%fOL4U@=9+xKCL+YXb4Wd-}sQ|edKE(oHir_$oXa{X4* z7D@UYXc2aeD`^X)MhK9n7@>U>j-7V%1z!k#AYxJ|etQRPW>Z)2OVh3N*4i#-xQA8y|bzs?vqh#hX7FK?mob+ zt0R=4T~B;VQU0VfILK10A1JbbP6W}Zo*%)+w~r~o)QwH5I<{bi9kD~U?4_`h?bAxJ zN$c=^Y)b`#Bk9W@-s?rMorkvY&A3Hul9gNd2%P=?J+-@Fw!uum>ST}zCmoG7%nV5q zY)V8Ue81P@`GKfk$1W@$1cFs4=7nm;N18g+FBidNILXAcv;$FS@Dqk(_DiNH++d!Z}7*Aqqo7Kb?aQBsNsCR%I4cJR^K(XD-lA1*>Xj#N)?oH^_0ioNs* zFXCs~xS+CW{nXghgYj>!6cHF9@r3IpS*MSJzVc8Wj^l(7_^4yGP(C`Ub?lGF>(dc% zRp`m{!I(yD7-@VgS#boZMCU;;8b>1$LE+Y}7>GbE3{(nphhE3#EZfeocMzOL;~^Zt zp7XT>+j|Nqx)W1cDcp2kL~@SCks{j*hA0;r9CUUI$MG=Y2Vx}w0}bJzxVz8V(T3dx zn@x-n_&E6~qq$^;AYfn|+*vppgdZl6U9oHp^^1AhXHi4tbJR!Iw}^+WW1nAdUOR^Z z*jJCGL2&%p#rP$Du%~5;J%j(CJE~n0!VV}!I3n^qzZ`9d(ijm3buJu8Gni*Io$6ufOKTd_e-nh`E69KtcD5IUi=3&q?ncWdVjp>a`+ zQ4k5Cli?mS<5|&#aV?+^8+;GW{c+fitqka|)O7Rjwg#~NeyJ7PEY^xq`m?E3!20iU z{0%Jz1<^aww;rsRewYxTi5ZjrOvY`T43{PZ`L-8dCs6$&v-*gwuumouhFiNTnctfP zG9G723@kP12TWX%66>p*3ik9HrPO0$umGcM|g zA9v6rO~dDl&9jQQti3qlWW{H?wVvEu#KJ*i_oW4J(m@~ktEJcx2_=Y*9ei>T#UHL) zyMy}xUi$R9J|RGpTpWFS>ap3=j!vG`xOf9~S7%%N#CZVM^HgwxRL>Du*^h#z10152 zuzXGkY&Sjn`^jyt3x7WAnBbvB!KBG!*xkb2K14XM1r{yODXtw0a&bJ17VknKVwR(z zPB1J!yo)HnUMPt&MjyRmtR!b@4wVOR& z>1YpHi`A!v1Z5PDHmBvP&{pD@P~rpz2s6?PDhrPpp%&aaGEk`=@d?e=W9I6RcteW+ z!Q|mj)0;J!r3vq()fQ?>L08E~ebN)ASJE8Fnvg@m&8SaW(EzV`%S;^M8Q)ShJ}s~M znY_~dcoIfgfgk2R{GEOZw2h2{Gv8d<(CC1XTn0}9LgmUyW5VH&U4Voc^$zO^QqY=* zZcZQ6ZRV=LoM++KV6~b&<33^1bQf8@q(Q5pW}#y7OSK4HVw>>*#UjDV6mu`;VPRt1 zlXLwR7}OI@)r;tFOI4e;`%ZECCJo`cGT}wIHV%RXMU*z$PP4RL>@Nw3xFh)cVMU2K zz653@3`$ckK#BGi)}clC0cC?s>+U*tr*qEK@jvSTyr~kBuFyLU3=I|c3mH>Efu z1q3mI+O1unh3&IzxFM>Cg zn8G`XdWs*DnwF650&*Os?F)|7?&?AlcfwT7H$7nnM^nY7ym?~^x<)1eWbe4Ot+saU z+SN*yfji?jj-7_6%p;MJ>D@)`zkB;5CSDXelj zWO3~vgcj481MCRXiTom8pj4y~!2x}&^6*EIbc8lAAc4i|)s2&%i%s9sIC*U2;>p;~ z#K9>}DFUmyY4fV1`<{taZ;DM>OGfzBl#`;hYu9c+x?@Yzx^<27XVA5G4lgtOkz&-8 zPCJM4f`~T3reSGl^r1yCJBwjnVy_VUUI?;{mWq8u>(Er)<`TEorCT(DgHc8BQc;qC zKK?)f8VySXEyg|rsEJ<+k!c6ZN=_gG+bbFo$0Be{3Q;KV)?jJxDT|8zFUnA0?t~d3 z+!VXtBBcs?0Y7;Cky5OY5n_xk8N$L?H)CG|4}$iXs5_CchQeUr)uoGJIbqtO-JkXd z?eUdRE*Dw{m|csXl0e~6kTZ@e0dvf)`K^Ods~ak& zr)*LrrxL*~2E0Y%#r_5DqBMyo(NKYN2=m3B2u>r+#$$_3+ASOks~Re1HdIv6fdok5 zQ4QiFR5}hBG*7|tN;ntRt!aL)>cre4EiWLtrdnJvb9~F9vCXSz2_t(+b<4!@2|lRq z_m_FY(cJ!|b)&>ncNIC|(9f)AL2b5FBzZix|atxMB#9)4vQqa|)5V@mMg% zAK@tb5f;%S6iXp~h$lY7+Kr=qemulz{cN%NJs^Cw@G^^#8#YGk$#|5Yqt&Xjn2n*q;Q{# zj3V#|nn^`GWpvKU5K;R&f}7!PErEl#%u`N|SI(qR8t{}wuwsNu7j7uQUdrt8xAT_>kz_+@uZ6;Ufo^HCAj!41$P9m_me~ust?m*O7hC z+ni6lk_JcjW6L(%Fih{J?Gu~UOks=^>7$FPkIh@0co|^~A0b?I@Xm(veEC5-?ZItA zEP|~QXlFm|pNn6vqCk8@Z1gATh`}R#ew-KpvkQ^nhqR(l6A2v#BtbP`HMM4xl4Mh_$!sVy?tZMPfY}PQPZm451_}MI#gojt?dbO`HVl#vVj*3L&9> zqtGs`a{RD?dI*sV?@jLsVkaS;=9z8MyVGkx;$;a_b}w# zSTqKCGT`?JLE~V%(CR}N5v+O2a7YFjt*l2I|1(_w$PookvOk!jhKBWe+>e}drU=^< z(DS-SC?!l_2*V(UacfsZF!U+ZGG#y%i~Ji_-Xhao%8867r>Y{6G(-Fmh728Qf=7Uo z7txU>+HQl6f*ONb+K%6Gwwt!!%-lw}Xab@=?}k1JSSknmnt?*{$kG`kEbr-r5oRMx zS)u#H_t?*26_s>-VeKv)QVK%730MC$Ddq-Q8K%-gQi*Ue_HB{tOQ^fHqJh9z$v|#6OH}s6^tN?XmsH^9M5k)nLXMDB?nl`U&b*{e&N2`yGt%!@R*$T?C z0noH|8~z>x9@YiI%4aix=J&zaq4VK@G)?B^zR`B}1H_jjognYiQFNiDBlGcN!n}_O z-k{uT@w5rpyBSuyIM0U=E(&xf&pS=;mZcw|SY!Cvv6Gp8W`}Pc7P+}Dz_eZ-Mcf>w zZX9e!2g4x44s9@0LYf)9&yyf6FEMkLhzS&D5l>)qe1@kTVv*5`77uQ1_z;gj;zt@x zEEr(WVB^EvK8o4Ld?YmY;E=Srhe)R!(@*ZnD+^d~eP}S4`^i8}s3_DmHtY~2;zz12 zGy=CZCn%orF~28PQ5(VMoALC>w_d%>TnEsZWsz#j$-F*-r)xTm+`Ni??p5QPr*5F# zNCX=lpSz=Z>K@5C{k}nP-V}T4YCweYG31=LG7MsEj9}+6)|BsuWB$ZhJzZkL`>0c~ zMUUVH>eAH5@55|Qt48|~rOx=g4?_^-104<)^S1{<7`rgn`*B9NjoG^dArhp4 zg0Nulf%V6&?9iwAJD$B(%;u%hNKyPxcg26CFZ7OgeI@!;H(9$q|340iGafW`{YdTf z2YLET{OQaGtz|3ym6w|%H6cVZ$VlxR^6FaCMbbA($gF8cYG*xY=|MP06JX9KA7z5= zKT`X~gF-Egr07LTL{9d3!iGIkkXrlnT_WLpa|dq-rmK7(=b^@=OxGu6D(?a}mvQ2? zX6kZsOyWkEl}=jXayri+&s_dQVtj%~V2Vnci7MeS7HR#=U-1RjayX2J$Q*7uIaIhq z;@QTjc?kXy4wp;-lsTj)>r9bh0GYp$58O-u9@mlLyNBqjhfK7Ho}B$#yQP)hZ>6Ub zHdx-$`f~PFvKp<*#xt#&VIpWP_W;tbz`=~eg66N{IoTIsQpNbNzCr*xY%VyNk<0}{ zfa4SG2w2fOlu1!QP&!%xO;@J5#=1o$;oh*{A~1zW!ish0d(a4?R3GdC<-iYEos_pL zIm;q!&)BNU#upYhE?&o%;Tjmbu}KS%JBY>2dhJ85;e6vN^JP@)#cNDBK3mkdZVuP<=z+C% zO-;}x6Jxu#nI2-R6B49W*%i0Z5mjf_T^wJsD*o(zMC6bSKl_w{X0|)Z6d8}AjJ#Ym zy3EXni|l9czY1Ty$a#y*-}<0Xany@50HZK$=xd}&D%0x@)Gou>ptWXdTsq)G5R_yR zh7%tW!ewUSTrtoP$43IKAEf0PTQ{_W(K&GwZjPjusD?Sv;ClA8S__dE5+Q@;$tcrq zWT0ZyVp+hvmp0`TlUTW3L2+Y}>~F=Y z6H_C6@d*_|ekxRhQccD00>^?lI3;$N?CQ9+iDqXcMai0JXlXMgo{-LZ3i*ishsGI# z11HcpSi_l52Z3`z#Aw#;MPh4_sJH`tOHj042UIc~H%)N)-N2c2@_s)kGK)m zWmW=EVcMJV`g|p7(PkCs1_e=UTVmOk{tT5{n`R9QE7VuaG1v;i;s8fx(3c1a6_Y3> zK;vwobZlDG(1TY3U~$Ob>%sPPa4F#;dX)weL(^%YIEb0V27j>*5}DaXajSTD2$jq# z6cJfCvSsG;vu}-I)~Xy;$xdvVRL2e?%CS8bo0RyB($HZ4t{@P7++xY!tU1UW8CIZ} zH8#lGhVx^B%*Rm)N0sMsy8zqbYJ}qUo8O!$| z9x-lfc*G45ohfE0_`U5h!xG}w)?KZ8LJ(F9gNeaUdvbgV%dNe23ae`?j~BA{TluIf zld?^p7|bS4C?#c2wE}y|F&@XMn3jACY}5&Fe8u=!)sEP#N!Z)t%9*FAk`k`2$CQSN z!m6H-O+MO`cq4P_NX|)?7B*3;&Fb0byv$w{Ibm`13K?VZ&Vy-b@2ZVEC7#*LOtp=W zW-F~DI}xnRjw0e+kl9Z#rco|7_#=>*qINVOWwG&vn^?sDc*00yqc)Xynl`|Xx_?QC9Y2S=~u!Zrao(Q&K zIVm}=w{~IUlJKxH+34IBE-(*n+4Jp*Ii{>Cq`fp=4cs!R&K2#J`dR^8BA3Jw+&Aym?~_gf@oY;H{={H3PmxcrN0V&Lzi$GQy4mwo`n8Q zKsBc#`~`}}6BZeLlXNiLMSu`bTii6$RYAHmUQaS#f<;j?FTSsY>|;u)CsYxSAM?PO zTU&H${c<~PFKt&N8y)^Ny-#-B3Z2{#=ecl1>+odC*-inXA~YP=?x$UB+AvDZ&5k^z zNQ^fZ9w|z4hZQBF{yE4$QTp)I6SI?2Qh3UdXYQJx2we>s%Bd#~79iM_&lJ#ZI^ti2 zN1c-wXGq~^c5b|W*@=lm3d!|PUp+e6#b@A<1s?+DIRP=e%{bxR}QEsucY^I;S^ zQRcxZF&J#N2=2+z2b3?LZfxGx%oeC8Cjv==C~B(`$o`RXV9is^FF}DD(!LLTiC6G@ zJNUgse2z@FWB+&=N2`u@G4XmLei@N@8LyRi-9*=1XTO+(vvK2;j&RlET|n4VfHt&( z`|38E2iCOf2Ei79RSknjtk02TM+7!Q9m0GdI|-fSO?X8Iw&QvxzG@=?hTC_eFg;uy zkHzOTKOo2%Os^zD+(%FQr9-p}U`g}MAZ@36HybG=#jA+i+BH4tRZ!whLyQPW`!e=l za9sklDZn>RwKA+%2BonzT6=v^AM^b{3>c5-qt^lLnJ;GAEMIqVo%OnlAtcXOL*jYH3c&eS4akF+WL7$TRlrSwE6LyK!e)4jFAio;8ND-d?flMh}eZiI<00}(!7GjIHG;Ig!g4l`! zv2hb9SF(UKsR+C^TX8Yt;afN_IDWTj!P28I)@UL20^mU>XG7-vpgzhWi#@*po!!$T z^g0P_e}~UeAq5Mh^ zR208a2s@x&ti1f3qszc^q16;ttzuav);nSh^D0TSCmhDY7Aq-pyDZ@(5Dnd+_zEep z=`IvbBF3;!dxA%p86PC_BgZx$Xxh3=ED6?%xWuuvFrXw12ul#J^TVsp#!=GbqjT3` zpo-vx%@mG=c*W!sLbQ=duTVRPMFmDarD;gatsJ!8XjWxe|9BZ7a)0T^XYOd8K8Ni7 z1a&9&Et^+Q!?)P9Tti92)^0J65ZSw$W8>dqwL&jXOE_a$VjAHX5}X#z;HWRPt#84blhL?sd@RpO2j%==2R3jO^Q5L{!rL3J!e&-Li_OPvt(MX94MA)<+ zLj_J(jE)ju(f}a`kQa9#2QV~ge8`w1lE$M4?_wc4)_jasEH$Mc5N0U8um+`lf{C&% zTSg%7L?*t3&B}5tPQTOf(ETv&$nrc$2BwI(MvnaL{L3Udi(oalWOlmnlB97~5q z`P4t9Ah2_wnOmr~ElUTT0Eb{FaoUvLRzX$3*(m#9RDHE}e>d!V;wU=;D`7UFQ;Ki~ zw*VR1JP|}LflOv3Hgzc`Z@YKZXnAFENAVfhjxbWn}g%$ViDKzkLcy zF7Xv)ba0;DNCABX-;eg7Z7i`;D-74Zh)__3IhilBf>uj-3mHZ>UZw-@AV;|f$6U($ z$ZYc}^}UVe!cb^AiX(>^N0p_+jC9@~du{|rFC!yIlhC2K3;|Vc&B*0dWM*(APH@km z7mz`*RUX8@$Xb*9W-{1m;(c@ttyyLNFTR$nH%11YB*N;4j01kv^S;*Z}LROGZWp3oAZ@g zY0|lV$^nP{5KK~s78SvKB;%1nI?Wv`krM(ls`*0NGPgdE!p-o$Yja1+-he`1LC@HU zvWf5Mur^w711qIl z($%n?c<0BhmG!c{S1CEsV7NlJlHG@fma8F%@ivEf?g8wf0(4fURU}QTrr0 z8IXzj$|&zed;u+H5o>V5)zzL%M6sDcwx_j~P`g$bvxzWtBQya!6xc2h@1Uf&d-zNu zVD^Q6wzG&)*XJW=N#dJ^;H4LS{&;QNdN+z@r|k*9@S0IbTq25@oy@H*)>14<=;1U= zX7hz+C*%!Fm&w6$isQw+uvFu&`i%L zj_))n#1hx`cKrM^nt3vw-rR-tc&HEq);t7{jbGtPh7ULKooF;&(kszGxCA#ehG^XD zo9KK-DnZNWHT}G0)~({Xw%l52!r-Sxg`KSm5uG&f#Xx5V0R|EIP)#0S$s~NP>_!#F zaooG=#lUBOY67B}|LTS0SE-TxiUaj#t|lvNFV&sEF?tE_YD#gLp6D<=(Oqi$7U}%I zoh?edo;aZfZtW4_zY-z)c9x}lGF#C-NZ=HIo0{!MwEvXgK`czl`h=us<|GB{wnFO` zz^Vi)1g|WF%fkchVv!qOaEh8S=|=O8c=1y~z*9&E5XpTJrdQC~?|wocHc~23qF5UO zv6`kl{aFMZS>KsCY28{dHldmmI5_6`L^W=zb`{cjOZJ8IO;q=k9d$TP&*Y(oBF~XnBq5~Q zd~H>K1U&GhN$Hm0fq@bb3Ae&nq{0P5uoUrtum~}jVTy~~tL9BGn?i5k0H@wAWni>J zd;;ZB!W%;Iu26DR*wd~yTN^}qC}FpoZL}8|!jCAbO7FhHs5UdFn6JFT+K++|X!`{n ziUc1>l8I9SNOXx?c#z;P0jLBiqQqHGOet1Znuo$DpJ_^UX^x>vQ396K36mxzv-?n` z+O=FK5GQ3a#T&A4CofWbicF&MX;tuy!XxbL>sEcm-ajqutm*(#c4_=|gDX!>U_vSmBkl`xqhk-9#Na$SL zTP&t9f15*z@`Z{MoWiXgAAGN3UPkJx4GrUPY8C&-@@bErI#tseEA>63n7@g`GvOz~ z1Z*BqNog}u%!o{DCkm4cPQxUqXe+Jvp_l$s}Gv)_YPf}OY* z-n@Nh%c5D7;2ya@6J85;e9pAy7v{gWyPEUgk8fExCvA4H#o7p8`4~9gp_7uPcFfy6 zx0BBv|AF*)xzHHS&gmNkwS*Nj#sWq1;BXFDgJAp;{0g&r&SB^}0!lbxYO0!j>jZd-rY`r;X__W7XYH4{poj}8VcOQZyEjKm_8 z3=z_9I7z@79+#z}>9sZGbncM+?>IMUZL&bs#b0ukhhx%s&9{dxz!3#+v@D8MbU8B8 z^(gY?BR94m84}E}UbZxZOFV*MK;}px76%5RR`YzAcWf0#RtNd@gxYay-Dv@wy!54a zY)_t!RcYh$v5iYtHqPH1o3#p?FR@wE8pqE}F)L_B@6x#L#rTCLo*C!~B#1W7m~>?C zB(@DqJ3)Yvbb&ZB1&o++Cx4rWi5bt*R=1|rDU8$v zBqCdCY9~f&aFIxnB0)l=)MBH%v#Jt>LM>TcRSB@F*&eI}NPq&k10sk;0vC|PLV^nb zf}pJe#veQ}2Ez`2wcTJ93PLe#e{tBK?BD;Kd+&QMGphiwyJsRCh*lF>neW|q-(Ai< z%m4gOG-N@2aHOl0EL^sTO;m?w&)F9gRpuC9r648nOgs6#iLu72hP1U{2$M#&+R~`l zE~i%#6KQmzFxD$S$1UAANU`2t6`%CkN{6f+vHA)7w%(`1w#oS|KQzRN1q@^m>23yF z8OqwN@I8(+>s>YWo$OQM2i+Xq`d8CKvYYKyzKJ_8BKY#ys%Fm)@30FkS1WlAfA%2p z42phhXDj8go1`gW7gK|N4kq=6lMG#^F(lOr_6sp%#6y|YiGiDz#DfpA9zn+m0w&iL zMA;R{d%1wsMRp?D5HN&{FU}?3&$nSnQL#4w9(1e0Zd`wr2ugJ8a7)-Kl9BJu_mN#BTGm zgj(_nc?>kr4JLXURF%|eVW-68@$R}#l5k-)tHt@yLP9koJ#eINA`mYZCOk-Kn+S25 zt`z0Dtvg~OU~b!1Q^X8avt8NweTYz1y(W&}w5Ql;kRT&*i8C1Z#UdNRc_?0ST%wpy za9~Ot6Xlp&_;N)qe7RE86Om4{B(0UQQIh}1NGV)qJTiga7Y&pxPhwX$`_M#iQF`LR z?js|X|1^WprHT(Acg_;5cV@a|$#h)E4t$R*+Q_a44f1vI+pOJ30@v)rE!ksOG zrJCJP9!e3qbP@|dLt1uo+{$RPAV^VmJzVgf$3D?|BaJCnhf+-UaEXJCw{ z25cmb-@7@Iw}1aG_v2Io;rTd|KC!m%>}JX_w3NB-psI0reD!{#5|`09(DaQa+)5hF zqJ|{RteXA!{4XsfS}capc)NZSGaL!`K`uPcp3#qmJyXqY^lea36{Kv0v_+o&?t~Jl zo#UDrK^ynA8_xCur>K%g@}lqI!ZVM$@t+KSkGFcC&;N$$;=%=86X5}n50Xomz9N37EV9CWqRE!tvzk;<7>}wy_Syo zxvXBD&SF4~p~4H*7{F@=-r)rhTm8ZB*ohk%*!$WnJJ0-U!CKB#T zT|~_(TE@^>1;rAISMqn}9iq1Nf1l-1jsp9$vqIKz+6#<;6t`_CO$Ois>%ssOQQEIT zzl~xZqkFm8Tsi_&cyXlZNFYq4x{MZ4Uc}6()}2Zp2b!u>!jZyd@L5`r&^ug8$|@Z= z+N~-_q_;^?!^A&*V`cJ?%12s8oZiQKsZ0I`CXxky1n)mt!#SYR-th#afCd-7Fg zjf^84$V_J2=8%OKY7Zt#V( zoA!UQ@kQ9k7ImTt*CrQcaGP@a%E#I#+qc7HCTA-tK*dy^HXp2AXkfztEKEs8Noy&F zc~d0ze~yvZHjZ+k3jq@j$Wk_!Y|d9MWu|0xlL8llvJ4K$agIyz+WLUj%U=V?T)T#?#aQ#n-S4~>muam&41&CVsECwHzBrsI?{ zCfp$NgkqG8P*_*pFqbdiu}!0>gK|gNgR))OWzyjWfg2$%R_S`73aFVEQgd1-4_Cw* zoX?VTK)$4gc*1ERrmU_haX`Cl@(=|P+hWYw|M;2nUSQ!GDsAjF#FG3*`m)(Z}ZW%YW7~{itKz;^wMBqt3x$7 zyKewgRl|!FC3@WwLw)5g(eT2ABbRehVPnvVUW8tQNI4zUrB37Ld@r@b= zRL7u@jXhgRf!$g6M=7uX>iCKQ>z{wTa zl`jl*{$IXQiv|9EcNX4x+at2-h-;beFy$?q|F%HezvxOWyILXw`Kup*e~2ruI98Ev z|2rl9?k`*uYd(_Hy1(dYfFpBdHlI2p*stE%!*JljedJbGq?8fo*W3mXl*h(l<6r&Y{NYcqa-yX;w*xBs0)E_fS1*2&yl&Lz;w8BoCjap(50=nY zWSjNFZ!!6SLQbt-kL=60p>%V@m3<75v)Xl6WwvK|n|ai-WD;i!?@q9x`EAc^NhkBD zvpLw3awQ+p4RaVyp_)=2Sop$E1qYGGPo7k)?KaaR`{L58P~)?k&p&0MHx)I40Wo)O zUWN9XeZG^rm^49hGv)X-H)B{zq(9+(j4Exla?3b|z{*;4K#}p7n+e)U9)+;L(<;P| z88}$wkNk;fh_{?dem|Dnv=K?AwdD*^;=_LQosUm!lc#P6r4hu)PFl(IbI0;~Q;oBG zyj6GFwKw_k8KD%(t5ai^r0LA8p}mN?PhH4H674$Fq+~i)LUneALlxn3lmJUmB@~?x zN%h=0ZgJgk4I9DfTNUH*49)s#0~)SAcYyEIQ~|G0&AK({z}L(bX1l<0t>s|LOQbbd zV!;KLp~1<6ll%I5orK78GudX;ik!fBGzlIi&*+oH;)?TZB674lKf?exh;Wt1HE^gz z#6aaXvlKD*%4|NkTa>Y>jUM>k=W@0o2u6u`VH@L;1EqR@DB(RqKMPbnp#v-vxL@P) zk)hhemZa^T`p8h<mQ~f8Bu_SnNu6io=yX-v&=mUS&=R-6|$JQM*Uh7r3NVf5O*e zZ~<-HcwxhvhUYs$WV7sL(vy_I8H-(({W!gWkR|y_3RT@MZvYDSb^$l%m8``r?|jp< z?@$nPe<91$Wte4oTCL2S)+Jlv0ix)`fKVWy-GX=n;Tp(DnDN9oE1;Xf-eT4!+kz%) zeshwIQ2*PG$f-m$^fA#LPX)8bxy#g9DBkKx;{)+*&D<3-2*a=zq1Ir*FM^ZY2y1&N zs`+}>LSzk2;X^a`&tTHKQ7*ENIY4K}fUoZp&Y_LZ0>TdY74TT-KrdAGRE^_8!X|7O zJW^hOw~7Al@JO$K6)xR#WB)t=hd$D(cz0uEaKk!CZU>j)#g)&UaVeHa4%U92s7cvk zZzQI5QlPHLP(LK={6A*!D|lTEumCy}I0k}z4+NM%eaK!jR28w&PsfosZ=GfZNE1h* z(+=QYqLw(BGM>A24a|tAGCxQzzP}sNCnDP+&Fa-{Q>S()0u%$?Eh$`F=>aWw$yVm= zu~QGuMUog8Zo)gHq^_1H_#qgWOZZJn#=p<})Vlc2%OYVs^C;hQ*7>2ABJV9d_si7z z$a;7+op0w&qyye^x&I%Z=s=k0gXAYJ9gJ_02orztnbzYq9;iU?ITW2L@eoc)r#aLX zcdA4ktj?4eDGEREYf_q;pS*>**hmBHpJjUIJc%*JHs3VHhx)bUxBmMkOZtUCj|2iVGiHsV7I=6m-AK41bUvbFDXW=5TSAH3>bTog-0KP99dlnNbVJ z;q1N&e#H4k#2!<8U(bL@Ja{-2N~DYmVxhVOIz+p%MU4{IQ7UcYudH=iOhYg#eAXX= zm6JD%$^+J($S&rI2xM4Ru@WA_VR5 zA!|Xv!5Pxbr5DC5ij?WekF^1~A^jTM&q?8H;Xq{J&;RBjkjV4}rp5AGb7-cAI-aLm zdB89{1V#&NW2l$GKB{KFN%V(+N(%N2Nlz?5d#=oMIPV*RlKs2W9hL?~ zxZ50gbmi_vo%cvM7p{uwaC2ZfQ~@=IE2(C2LBVzG(u!M>UF*RNT!QuardCe(>C<}*(d*MRpk^+y)d>c}H$_|u4mnn*y&d+f; z52s;$@Ct&(L!ro($f;N!gHO+AxcxbOt%9{uU^C=<3zD|-8OpYa zL^iUBWVcWT5LQF({!hegIRDbR#_nOom2|mzGK+0|u8Otr|H_QD5M)=*Lx__m7+6|} zO7x+e++?u?*p-P3=X-O9EV8CUS#hPd%u8NaT5uid3J3efLELbBUNu+Y7ndscnIqcX zu_w0;l}dw(u!j$Fy?W*=eaYb!ua7^XQA8NCXX@)$u8x91wRcw`J< zuauO?t9tGEhS^PXW%;q)+4&=VU=myN{IV}CZFi`+sxR(b){+p1)$EG|VWxNPp1ecfCu>|pk_>4O@jz?xSEzs-S+um1KesO=srq1_6~Wg8s+%l@Ks zz~PmfJ37&%3PK+)#Xq_#0Q_)$6!r(~hiZ2F`D;YHM{*6EgJ;ZF$!Sg^$5Qg{YTb|> zn1`@Pp$kJBa>>u4YWDevV^2U}Uvd=l92sQqe9mEv4hUye`68S-`h+}DU+^Cj4BLNa z`Ar>ue&*0#UGk-$*Lv!!nd*p_#^I_pW~D0hjLE}8pp(CtgOg)N>XqfJw61zDNre=y z26fDmOjZ{)`^aNNeM1Es%KM*=STj;B7 z_PMt^(9aaGl+|ouV3EQ4 zZzB0%{G$@Ht(f5RovSf5;mt zOC0ajYD%X4f&E^VHTG-7xBT%#!XiW&;%SLVhH#}~S*`GvKX|A`kZ|3o7?+0X{m7LS z*>?(ID9ra7wX=GX`V@)~8A?gW<~sa|(GcM%2*`n>J3c<~T2i1mu)Jil*L6=}pKNgm zv1~XseRRjvx@`$jFk_Y5z07ZlwPZJ^KnBbmBjn;50>%&nv8E;g3FYZhit|hlzlKOh zy&o!tg45sM%9!zD1OUT=6i4333)o{+poy&}pE=O!*~$35PHuCfYUfDge2l%wQ+lZ^ zq!6q5)vMXk=z>;Z9a9bzKi3EkD4wpA|I`Cq(@JpcUZtD!5x%XX3zruftHFp=LzzW+ z3(eT7w0y@#FQ-LR=AaC{WoqZ9mTX_*;Grt|`Xi~n@;pw`?AG5NgQz$bJh3eN?d!~A zxOeC5CX(;*9fp$WbGi$&r3DAu=tTEKor37+HZ<0r-E8B7zb%d_tS%~(sv@gBa=N)C z16Y4ayAz5jiFK93?Y?2S3D|v@6ANc&-5vcoc4$+poU{2&k)Uuoms~vjL3moUz~-DG zD;_wz96ayZkzYiNs|xDPcUV4~)FHx5tu`vnHeI&hQ`l9ur zkD#3m4u7xmkiQA{TQ^o@!vYHWxO*rXz`l!6glh=ntGZUAN40WL^E;$M!YUKjp~-Be zKdo3KFa?!U7~G@mq>XxV>HJPrWvqX&r=`Jcg+C|N^y~N#Dg=@jI)C$Ihw_A}^}j4O zl|7uQ!JKV05DiFP8AW}y+a@t zlJtR;J2~Im$$6%jDXh|}`!mOrw2OZbk{OHLu!WoV!s4ST>#?;?+>P@NGaVUOBa&s> zk9m`=kE&+PAE+K@m9!w_(eLwhvzqP5?oAnU#bv_j zPB8#<5}E53OFi2leA^QJAo*3VoYy+Z|1`nU_+fb z^Yql_m!`Kqck#fHnIi|~4bp{j>F(J1@tGGKCpEKf^UUcJ;X&9O9YaFZVAp_77#QuxoLDnD)*Ob1vkUdJF}4ODq+GbS-DOB39Jx9JYR#3bJW#Zv zCNnyqTk1p2G3eyDN*4f^;a5g>bZqkA7=oR$ta#nNaSwiI*bch;#?bcAbb(M>R-cl% zo1;y#_2C~%L(wgxma$lN&kY{VAX`*~*0LeiK$&3vx>3-WeR9QFqIqc)D=TYu6;5El zwnlHwYpQ_6jrR}=amq~kDWk?_!JdqDELlCETO4M5*M*G`Q$mCJF8^g%ryhU7C?@xT zv5oXz^?gNBJYCOqtya1OTbF|E0?1T|12#()hfLRps)b zXT<3B$~rmtQY1vAU*%dSOKxFA1~JQxL4||Vssz?oE6t>_mh(@^#Qj9f`bZ?kIBJZk zyh#sJDxcp!$_7d$oKob1R9K5%2tsPn-M84RDiETSRSa>XGURWZeFk7Piy#pTrLC%a z+3)TV+`*vV6*!K&Nfzye$^RUj$!qH4cv^>Q<0OyrHL7fVXs`~$;17a@j%Ewowl>&k zLKp{F)a_c;^fH~7`m9XdciCG^8-+uVVk!X@ZTf0<7xaSKHd{`CqIA>!~X|pX=V{9#J%nf_DBWJ8)lf2f?o}ks(Oo#s5pA7s)&oG?9 zhkI(2Vx}TfW%ATWV@>_s)?^Oy9c3KYsoIjwdD^@aJq}Vo@b$8@VO_LB;o5;qo1@x~ zSoRiq9Qtl$fsfRJ8!HR!4fP?u;sOeb{FtnAQSP#JWk$j((L-~bM7oIhOf396iubyw zHczK+y$2XC91yzI9RRAlM)+|Q+&f&$zNIG*{bv6>jVvj+0)&8a7Xadk?delL-`wBE zMA>G2J?=&2-vpNn=^*>x#3P{T@-dlX(tkGl?jH83fp$WrP@@;X0dVK2G9V0@zG=W2L$vmbwE2FxVe(a zB_D!sL0ELefW!u0@y}a$8(gBiGtX<>JGtfToBcQtdNeZ0olqI<>*x4DSab=WCj>-* zEC5*O8=0rUqnR7*GN5xCU4L;NHwZ6Clj`t8_bA8Y>N$U?EWV}LH_%gAynKAHtAXLO zc-cr}7^JI?rCW=YzyIz1I5(hk@6eP#yt4Sgkkt0a)vr~*nqBX4)d&Cj7+b32^;Hq} z>h)F8eO*@klaPm>B>44JaeY<%umwW$9iFD6x`S|^JG1;c}kp}*TlS#_R`%1jUJo1*!bFI@bj zF8c4Na}Z}G7;s1?0J%i8W;xqfEx9&_}39s+qU&28{$w6(Uo2IrNoPO>- zzfV*l)Ny$K)Wr{uIAp?air;J{*ruCq4OFULl)?JjKW2m>U6UV(QIh#oHnCx~)1NBw z5Hm!1^Sf^s=o$~G$R{YvfR7OqZgriORA)f|iQ7l;ObMRKUx_>cTTNfa8c6bO4pg({ zaU5gmg`PS!#3v71ENZxqk=JIVtK$qU>mt(P;}69ZuM65LF{t1xJ``M&LediYVQ1O9 zs-Oa>j>*@?n2v6oD}W-swt`yYZx6xd^afC%7rKY%(|Q6@Oc3Fk%1d{T)N2IELj?u( zG;tba1MPr{3mcy{mh{I81ry8@N&)E&uUyzbJ?X8+KM*ccmFQ5br&K3l`pr`;ntAFZ zTt2z|^3!`jgcs{1JVWW8J+u2?{N(Wy@|DJG-kyCH$Ej7~DV9oz8C=K32fV`-T;r~_%4gU=xaCVCid_U9|6yfzL5hWsiYo8ItGjZDyVUar-XIc|COJSPB zm-uG{@Nk62y6pVk;vSFn4{}cnL6Z%k3WCIiIawWWiNxSC17oUcojY01AT3Veb1Bz4 zNS7f|TB{t~VJlvR3k>J0G+irlKscj$Zr@mQM3rAuqS;EpP}jiz&FdOi(g@fpX@Vl=edN*>)XPuE@gDzgAb06t)Wl?M|uKRg^O@FP56Ni zTXUXO?q@z^$}V{=dJ@00m!isPHM=he5lhSV1{W{0+7gTmXFOPVGI8bN9ziOEa;40J zx4PJ4DmG31V-`*)G@`L~;t|7Ng>KTGB759hIQBW*>5B^;euLxCds|9=&hEMusX^#K z>%gbY9lGS`%Yb0{}QD@MXbASy+6EFh=~_>59d=! z`21N6H1CNIi*cHQ%mEuF0$O=}rCl7`6(~>qISDvsqUjaH*Wsvh-1C#Q4Qj1uuMw}v z7gta~im_z_f}xD0)iu!U3QCBLxGk-FZdJ{^L}3ydu@g^zkY~K_# zqm@>N8Lb1Yhajd>Jx>sSM zC|Kn*5EGosuul zs+&6aT*y@-ecs5Qz6MG7!6YJQ4sIdjX{y-Kzzn|eu?ri#z|CWrVQ_?hs4zDn>`t8H z+0WbM*}=-?XSWjp+cUcxFzo)y?Cy1lL)5g{lW+51gU)Vx+k#>!V;cyOz4-R*#`OWj zlXFI8YobDCcw|xFcQI6FcX!uUSJtwYyJd=vT6~4dhbmjeYVMwpNhYGe$>R*-U`?8v zrKF>!tsU>D@X&G9EW8 z)(^Dg=#RFEE$Tgls%ji_Wk@nUMN_{3QNt6@pZ1G9#Kwc7_*Q1MMeJjF(iOy^QM9?U6h#@T{>MUJ0 zf(EP-fI}>B3tZr@0W~@X$sZL~v3ekE8+8#YgRXG2|$L#I@# z{)1;FOurb-!u6EiU`K$7DP9%o*x&i{T9@jxqt{XEZv?~&pGf*VFoF9<5|UZ3k4g+m zOiC=e`Dm4Wb7fHM>3817aNQ0UF5;{?Dz6BFX+-pq#M!%7;Vr=;Xc2}5!x0!H_+s=t zoH@7MIXFypFvG)y0dum-e5`OFtf>JJkZ(cd63j?+D>B0F@49_(c=9#Gh1LCu!;aWQ zn^P>Z!MM{3cxFMQQ_0%SBJ7Uaf!Dxy0L~_~gd>OWdzicN%9^Iiy9KEwz(8{jx%HRr zVk;SpF1cJ(T|9)I28O0Xm3P%6*g$1hK@hFz0R{K=tL7emGW9=7QYlz}j-WZYwXIP5 zC&v7*f_V<4iJ8UECbRH|Kd%ipy87yD_@2hO4QDrZt2!5F1*e?i@1YjEWKonU$uKO5 zl{+GD93yHr0t2$?(zAMHpF?W4lwCSt41_;zQR(bYJ&k2j;> zs3q)Glwbpb$58$lkn+L)_)aY&t;PCESvl09jQYA13YR>1}Ut{C#}l6eixxJF*8+mHeBelDQgoY2&L?TOXC1_w=)F&3cQt{mHscT7Unpru^ayLs_kaqPcCDH` zIMmzM3m99*xdH5cLQzmjU}xtv?MxD>uRgg?e&Ppg;1Ml!&g?$f@r6URzZ=k`nX03DsQ>5OLOM#qOiMqt}f$$Ndr8gLUA7sTXiY)q|)rhgmOMJ}kG&(1%SOC$GSwU~rxM^=eb6+HPrmG)FZky43r z1JJ5gv_pkepaU_dk{Kt=;*^r~j@($TUP%io!i#Hvag+aL} z`o#llFg#|X4BGc^#~0s4b{FDaM!RbD2!C*gFts_??sq7(ViTR zuI)A{@dIdZFF##i$4yCwZ@0Jj$>S#x8df8T5{&zwEf`SWdO(3I4eEHu8CG6l(+nUi zqGD>{w{KJQ6b$Z_CM523Gk-K4e}4W&-*UEhPiiYyq-;pLfS^{z&5yOe1A2@KkCqIS z=qtkfDHth#a&L6u*uFJKsizjUt(eJoDY{E2Ce+xijZ^O#gmXO_BE;}SE$&8KG)SVm z$i19$LvlRgf-QV%44|V^*c-gznA|{XQC2uYdjRs+tG(4qb#x8K>|eOC5@^QF1r)qw zX={h@^ZW2PJP!Q$;)at`r`Js#e4A|?yx31|4<8PmT=?;sZBV0H>&E!-)9?Ue9G}|v z9+?0%GIeZ+(8llYz4Y9+OZyMgRCsFeCRzBJN{lmxO`bYpGC?5@ZlCWR>7iVpRa*`g6^G3uQR`^MUb|j0bWHF zyMUJpPD@1*UzvJ^nBf^P+$A^v2J*a-%ZDruxegarcoDN14=utAW>o0U|H`EBk?1RX zJq8s>(3r!x+>p)g-x+Dl$;jCIqz4tlE9a(XC`5Pp*p3hq`0a55kUQSK{KPYsc}8&H z_=y4~x_Qi~8a;<8x^Q;a*6;fMuV$Osq`6r-IDYPh0oHXhdbseu$eY<`Xa!g7WT5)+ zqC$sX8Y8s{bP@?PehyAE8MQ;TiM6T`N5S|Z^Pr95cdPURVeUV>naw&JS7$RCwZ1TA z)S91+f7u=Z-XJrMubm$;E{yb>enOaO!>}sS@$yp#~^-lo26v&g~oENE@;NA##Deyfm8@ zz6CroFb-ac%ndpIIy>&}2w{yUKlu3lgYE9Sshz*z6mp1%oOGw2nfY)h$5}ckvDK&d z8aa84vsg>%j_ECr%^Z5G12p8!c0U;X@XMR|Q5hhjs4hl3M!Aa042u_y1?dGg@&j&E z9v@DS)paPt_1b$Yv!dQjF4nSK5Z+4=GZyt1yW%|8&rAvac#%B)fuP0Bph z{|`6TqREi9IRdAJs)-Wpu;EMLWTr{<01hQ0gE?9Ie;yZD@c)?b_4Va0N=?ecVTBR& z@CBxIAt4}_FFv}4EjZ~h^7~>Z#~+ny+a3qGQL4Tbq97eO2eBxMaT;y^1MC5O0-kc{ zHHRP(6ADhh9aFa9`S;2aSV0nRvw{P_a*qmL%WBqpS7VR}h6I;HYaZn2X(Cd!*@mz$ z{YM`-g)cab@C1N#v25Ne0bQ^LsGE_8m1XGX?s27M7fpXZ2csO7n$(F8gPIgXpye@W zjvy4!+}In6mB4EE5U$STFbHRRl9_HexZq7Ok(R0rPJ`k3!BZbR4OlB(nXL#iyWm?0 zkBD7%?5lhgFC6h;%FMQxiWD0&uW$3V)hcZluFM8vlsbi1=I{J}={i zn$#nO0xY#HZ>=2HxH$eQZZLws$mBSIWHm>hM$SYbH-q~(e0c;fhv@j(-Mn9YG!_H6 z(U>gC4H64))<7FRk|erx`$Duw;yR*q3X(fM%-kZC<*L8!d=`@XId+Ev;pNu!JbD1E zO^$>5N}Et^FUpNJdGs|62X(xi8j(gzQLPJvM~_p|`VA|ht!*LYtz8Y?tO)}oIp=4KE4m0RQa}6E^CbTkB>DuEFyQJjuA4?EwtYm@x+LD zbw13hu^}AB94?KXp0h6y)HH~|=ola=Wqb7FT3UEB4wCKJatDFS?eycxccG~3UZo%% z?0SX>K*<*Y2FyhQZyWP5E1fK64g6?jAw$22nFPT-q)_nP;y_?7M!*-~dB-0ndkehe ze9)?)iKZ3jsb&u^W6l7~;HbgbjecL_5RW>cp5J+vIkz;?eURSDc@&m`SpAC5 zstO)0tPvaZju5ML*)lOp$^(@Sl3+pTIeI4x7lJGY%WhFZLW8#CQl&jzAy?GsVknb( zDc3hz`OWLU*?;qI_W$O6j-)FA7Y2XOpt9d6el1K2Tks&a@KB}GhGPcBP>a3z`ql>( zgyB++1n878ZoDEY>)*8;LYxFh#0~Y694F?lNO-_y+w>fxj!OT zObI<7!ItdBFk~EwjWOCqJM=x@AaC#}T@}J>XjzN#V+gMsas5o7!1jp+6%4jHnJ{|* z295Mio|a~-yU&s+j?N%9HokgTM8=VKxa}=2iu!C3nW5$&X)@L9cox$t*!<)n$y9R(6w(NO z6BWi%QVJp0YUQT_@rHH5u@=HN4u!_Hw#clyJc1)ac{%Yk&O<_2 z1wC$*H89FXSuO@vi_Z*Qt7cDUtyxcYBs#_fc75V7z<)UaWg5kEk}Zra=7v)QX#2ho zC#bh^;>64=F}9QLO<^OTE4b0rthZliJbNN5=2QjWnIn!VO}O)Q=k)i!aiHq_w4gE_ zKqI9t?l>HVD}|eM$nSVu{WdKmPIcy!#DOmO+oEV&P_$%CA0_6|jRRu9v| zr5dclN36;t{%}_}qbXd?&ZRBK;0pD~QH`@v`@^F{!BCakNShGAgHZILARdarC<%2? zpHL#Baw~i@==UZ2HR=&@!#a73@wB)n$BR$^sTT2Bw3@aggNd#9-(?^K z5HZAuxh`U;&3UbE*U5e)KP89`6cwLT#7J8bUA1yIy2f8MWgg4w$qi%D>+0R=d3+gp zHZi+Ru}Jo|#X#)AzOL}0jGQJoT5Q*V#_dJ5z>`wW>jn_=OyMI;NQM=tmFX>t1E^c%|EPGfBV)4v%frM5V2#s z!mB17FoYhhOL&_vZ#x-!mV2dBXHq88|Byw0L3B3bUS@+QAbs>4q-3Runpor%D(oK5 z>%ze=7Zx)DjlDcEPH>QaRJfAqIUlE>8=;596-bpxp6J6*iWS2-5Dw(AqO!A~n(EV~oge{b-mE0(ek@n)& zS0aG^PJRvBF!Gc8uIF-ob$DWMpBJ8(Z+Vwq?|$a$lR!+n(6x=Z7UXLlRsX$Ut}+sx1GjB_@y><_35^}^JC$`g_JQ> zsoq8$G;oVYw$AowDiA&?$Y&hjtRR6uDDaDgx*@?iqbpOVx#z8F_TOZ8)rega3Kc6D zF$@G%uVehc3kh*-Rn+{{%fkUzm(E(bg%C$rrxuM3N^p;1je2mx1ljIW?hh$=a?~F< z`Eb5?x3paAgb&IYYIm1)UMb5?Z)XA;)a6|H_$VK`c&yRD+iKDMY9(9Zx~OBFQNx`7 zFoX#TY57y{y)?D?y`V`RJPFl>jLPr3&ggJw-ED-23IW)yu0>8iBL}HBFcSerp@E;2 zl)S)SC^x-pW^8OnJS*7--Okm&rU8i9^_o9@#>gZ7M2xAi8nvsEJy2G=M)9(^(&Q9} z5g;Td!!mCl^I@>!0HMkPjnD#27{G2EZFEJ+{51Pe9C=fHT0lOe#Eaz+b*KRM3E5_N zP6)%2sw7j?kUm^i0n1Ja8zDk#Fqi&$Ss#%*BSCX?`ZwfTv$(2yEUb=7pQCOtqa%$b zrV)oaf(oS}z=k-SdlVXvFW5ZJyHiEn%VeEB3UULAB!m#T<%|V~lidbnQRW$O& zaI`7HO4PTuhJW{u?$X;%ES# z57kD%RO8QJGVUu)2I%Pod(l)I*`h^KZK@T|UsLCBuw{fR&VVse;Xt{wg0z6D+15FD z0g%mzY~(w#HD?9*XfxlwZSpp!R@MatbhR*=f~@$Z7HUP*BSDJ?rkGSyTmybVq0#LT(-yeGu@lyXmnYfWQ zKz42+ZCCd!k1@_BWyq+Z`$8`6k|ElW6+o*kH+>}x0h=5KC<)x;!5nTPk;M=p^Qfdv zPK?~cJ}ez*0q|K6Q)6u<%al4V!P-+=$bGjLTxD$jW*3FZa?X)xlEq<{$f1{Ro0+T4 z%m-Nysp`v*QxwvWi(m&yEzu$_Mj-=VkY(Sxyz}xevYvvSX^xj-SkdExK)1;-67*0a z&4pab4oSJ~1denuk^Fon4+Z^Q3kkj1A96CV=;K&!*XvyL4Cd%BB>M2n|spPd}#fS^M4Ha3&-fCD!Vt?SN81c_@xHa?&mtD=I&8&%u57>v)?BqZA}EQXeBSjbGC zkLn|;8q!25Yav#KgnAcMQl;W{v@4M*nIkBR#$UqiDVd{VFi%YtwMr8HmzBJqgH$hc zE|7W@Ds^LR-I||GrF*wciVszVe^B-8N^jTl06i{A|+?{H3(Xc=r5vSMo;} zPir0@i+&Z}JAXG7A*A3};l1p)v4-{As~4@vz7ZNvlvY%jDIQ>4thv^jGDIcm1|Mx( zk(J+Qb)Cyf1;4($oXWwZU4}w|QMuNc61>Y1&j|Ov(}X8iYhbU66~0`Xmel{UQ-HgF zQ%AxFN2D(wI)3r(W3Cjt?yPISop`?qZ-l~LK{d8BpmVCR9F9x8s+Syu5i+O{V?B|3 z8w0<7wpAYly{P$B>2hhT=Oxt^54Om+Ik*v|UewDzni3lTV+MaW&C$Jn5PHRuUQ!f; z%8H*YmGqJ~uM^YMLgx}kUk&=`NFNw<6k3Y~7R0gY2$$S0NZCXel~?KtI%q4izRB9} zCs`ZPfKwg~p{~4Gmos^{lXN2hmmy9k6fLHM(0}Cm;97L?aZnC`TFz}48pr%E$kI+Q zyKjg0X0(FVr?IwbT_!Ott}2b&YkDAMS%Y{Dzy`E1Zijf2PzH%j+mq-ZfhwtcZmkF1 zFAos~S}0GuOYjC#sageOr=nd^(HqCAj+KXzhktx8yNId8n31+tj^9*PQsBbA5298_ zG6lP5UVilA3(v*V&$TYhMYhYu$F@ShNMuC2MAuCneLY=gIV|ZSg(!Y?TGxFA*MEI@ z^6^@{RKuo%@5G;;n|4gh$z-UONmQ~00Pw^jRw}#Pc(Kaq@+$n<#(`+NC*5enSeNE$r>T=@o=@;;R5*jY(AKwU#6!1rH zZJON=T=lK3_$y7l*!u>4N9?RZV0Ym%#&MLOtzx_Mow0zcWfUMO#`o*bZ zTc%!m9->h$pW6B4$EV>MeS&L0KJoI!-KRhPz(@>l)M^Ic7?pqGO~{zo4evz1L=(wX zB#ck)Ay7(@2IXZc2o%!46*nS5l?unoozlyBLb*%_eb>@)^RmFi!?S z2;vhj+0GCL*wp4XNSG^al&{Zj+H;w$@%+xRr~H#APpCXSl!M3j<9gq2eWtGjE9$*a8A4gqZr z<8_EzBe{6ZfR`IoE?(Oua-g!CHbMmT8hyruJ^KQ^w!2B*2*Moed<4fP z&bILy@*QeWcErmWMOT!fOL7O3BkCI`Y0>oP4|IM2)OY;kC(9NtUlgZ>FMH}TvhZ2~ zO#`niKqr~}m3!n0A6o_F%Gk85l8YY3!Pc}JPa7THi zM^<+4sxcg`G}IWO(CMbk{RIN1=?n@B%DRVThAVEAdMTC` zs>Qn8qJjz$P=^k7jseUdt{!F01{Z5|>DvWKT<71 zb;2^0J9i=sP2P*gwouQowIh9_>dG52&hN>O>lO)*4xaF8`nA8= zBMRkIm+kBm_*W>CVsZRt7*Mi1@t+JS!AxgsUWd)DuB>YGuz+gq!&}Y%L*}4y6olm_ zDHp51SHOcWNIhJj11~_pE4OJ)f_vfx%y~=D6=mH$Ha`IRqVT=K{n9XswLwM^9AlLQ zZA)^2)}OAn_1CFRqd^fA?*Ns+gR9xeEE@B`(9zlTGE(THxB+O}31iOo70foh76&69 z9P9(R1h}0|f&54F@s*H@HS$ecuX&caHre14!os%_QMNZ>ucu;j$&-ZLU_Ed8%Asyo zp>GC74ls1{!h`pNhzf;^?!;)lOOG2-!(r9L>CIU15|F-?-ohv?+uuM>0G}x8YqJUL zC@Tc`(<>BeMP|=N!Ng1F2N$own4<``0^jqoo_w{gaUS4sWfCN33678lAUm(UZ(%RG zn3{Z*IERrNa2tMo_ktD0RW&=4l@H4!wkS9v+uc@$Z%UAOZ?IGC$Jaab(65_XcM!hc z$baAwbSMxuS;8%RbHx9TaU|!%z|}FfUyirGk@*>|ej6OIC1q+pm_6Q4VcwHg%jBp_4aN)O{}35P(uV8Lq%`#4&&Z49c} z+ePUSgh#Hb_&V+k($A+67HU?p+=m4bf`!&5LEHjv>jgW0wZd20e6+$oh6ZcI zO3E=H&rQhAIqPRiu?x9y7JG*w5R9lN8mDyUxmsu&!)kUcTW%Vk7T*m<$Q2NrNYeIP z0^cQb6t%=_(_z1~UR*zm;mni)>oNw8p~0GiNMjrb(olt8iJ8aKy(MSi&&zt<7<^B- z>MS9osDt{6U=j=XhfM;OfniwIq@=l@#1Y4aW&^q<2MK;Jgw$qE z%HT`}B{RL;p2}BJmu^E(Ssu7NOrK%Z_1H7hWxU~!Z90Z{?q3%a6%H~&hCM>d z1>FtnM`;N)@N`gcs2k3CeFI!&&^qEEH~)rARXtbrM8iWu1Mwj&I2n48xr4!N9RjatQzDZnD4b-FrTBvtmFaA<=-CL zBzo9Sp53!>_U)~UI-cCT6TdC|28jua#CoQjgX1UC@tf@Jz8JR$lP-D}

    atVm+*N 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

    E-dX(#V9smO0CBt?_5MK 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

    gt|@rrlN16 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

    9zD!W!R&0Y)Zpyd+2o5G-fcVmRv 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

    x4)BdgdV_?M1t7FU}ls>IKNlf6BeA(7z)_? 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�Eh=}1aUP&S)O7&BA2tA#8ZAv9MV>9F@1Kg`uF*oJI?5B&T>J_$yo z@>G@(f%!Cc!J^ySc6WHi2%dyiA?blOX(5NVT;ysb8P3??98MYh!kksNvr(I*W?K!6 zA{_BU$l8n3q84luj<)37;yh#WJ)jy4wE~vMylhwo9Imc<319aoLC%W@UyqD?1t*>j zkp7*e>AC6UOOF{SoYI6#h(($^A3Dkw`}e(q%+X+lfpDb zLnL;i0X<|heW;@wR*v?BR^|q>R)7|VN1Y-y8yS{ts--9&1*>V-R$6W?cH0Dyb%WSF zc+v{Ah!V&z3rIY;Fts4F+YB!=dx6#GTnKaWX~^ORHF{Y{+v*IRm3k>ixFMq+30lP2 z6U9ot8`<2D-HxjGG!nY8r5z>YGwQU#Is7uRyFt8M;es=)LR?Jg>S>)-KSYMH6vEWv zx{^T|J6P&2P~zRd@L&%Hgy?OYEIMGuhhm1iY?5{%ps>d0)Q9Esg=@R+!8VjJI2$wG7kZYYBC z??jLrsp~0Y?0H(xK-{qUYo#|w#M{}`Meby6^0WKbQ`MJM<5BfZwJ!GiMAV2PMs?S0 zV9%oEBYdbsI??wH#ze zN=o-IUb z3WjH*(G=PvgJGblFPzciZ+g_Q8@QMfuUZ8@T`yQ5pRgb=eO8=Xyc~1D8_khRQB;9( z2xbk>OjS3nH^OruQGlhxB&h$gZfcZ>W3KptQN9gZ)U5m_`?a9%&(ysO6Rk!qEJASi ziB1C10`rC4nGEbAsP%Ybx&+z!1lwF(D?S&AN6tWg-4_REe`iZ|U1SZj2iK(v5&1T< zj?&2=%%VGdI|W|J&mP>N1UoG}Y9Aqc?_lXVQ^L|G7ugFI%|2aAiaQyQIMgZ?l)>)N z`Co-G<_?foqELv|MOGpExL{diQ7&-Yg4mUSlZhImhtM?+&zHg>BOyD;KZ8uKAekyW z%9x$gM0`?%;=Zs5&!TN3BW$lRPx(WxYdtw&HYj04fRUk%YPl}kVx z-P^tTdi?z#VKA{;S*V>;ZmdDp+05#Xk5bD$RUFQpBzmA3m1oqHT_rdn z*;@qZ%gB2$?HeFFkZO7`q&I)Ua6(we^qp`jb0DkNBqb|5Q2@-98t@R}FeDjjfw*mW z0Y!5KY;|luS4&p8Hq`1GWE@Tn-fjU|4tarEf}N*2EIPNRfD8#{BR@n|iFos8W&ag7 z0k%i(z$s5jxIBNRc~EjIBOfB!;BYdsf%=NEi^Fo3NPE+GF4u83UBOO3!ULGli`END zyR(r%JnD)i@K}jbE!?fQB72`8eZQI)`_fFGiOT@;qyTkv|~Xw(_5o)nF7_68v&1iS5OphKX?mqiw0CQAk3nHs4;-}5QG^6{|&rqgZ@ph?U@-k;f!mK zIpyOutg=?3H=>N~t8JnKkc8B;d<0Xvh!yn318BEIn8SYxL6_r`8MvLrfz<7xS`e{A z0`#O2G3WR>t-!INuaCA0j%WtYNsvNfQ4deR07v5%LJ8J~Q;`4xX>H)xVIe>e#Hmgp z2ws6ZNOwyx^x-HHD4-Cuive5NwL-32_FR%;&cWfI=wavj^+~+|2A>vuD!LN3u@}&R z{H#3#c#z#Kq`04Q&-@?rX}jR%Zjr!SfWzPD(HhxqYu zh39s}-NCW3E;>lU2o}IYMx)Hx-Su^JJw&t4_HrAj_yT2}9pULk7d!KH-)J9tKe>)S zuG3~;XE-YC^D0u`FR;B^f7cPpGy%;dSWTY^9>;0b&1|s%VrG!x!Z^MW*R*;ZN-oC0 z`#4tM%}qbJs3a{(+_A6}VLK_zJ8_jV*jP4U%-L&#iPvF2GM>s{%?#2C#hV!%+Kvku z&>nwzcG@Z{2&;^!K-iXG-luB?ega@&s5TKH49btiSMj<*QG51KsC*lTs;uRddXtJz z+)nJkR%6;PFSQkVl=1i{ioLKF^m{uo)Fh zvFL;iB__7#26zQ%_T3~(wNJ&jvO$c<507@^1*|K96od~5Qf}K zWHEgJ-NL!ymu`1E9*RDevlP|}_AyJZ2OymfY7I-4a6+LHv9l@2h{n|`(d)O~=S z;&*19WtdQXS~G5ldtdgJdO~x25{T7@w84O9qA3JN5`WHAEV&qXf-z@OzJIiMRb&2w zc@frUL()%lCEUp;n$ADD|A`Q&>;SCKUtf%Y6Ukh*Kc`I4j+ccV$_9B$`>VDQe2c|B z0}zCXOXDrLMM8wBKK1eoH#WDyQMh!v1qL*;!TlbqlKfn>R7_x0xJp=WcgwvN;i12K zZ39NfYC+6Nu?rVvACMh&q0$PKALKvqmqo<#iG5`*XAdmoOr(`SQc7`W*D2~X>pl^P zvle(iyGdnsNaEe+SSMTeDG;U%1tsk4i(>?}K51Ik=0izzoUCahgQE&!!oPh4u zmY`8s_R-c@NoQPuDNB1)wFv-H7;?+>#v$xbn@v|Pcadj58v5|t_EAwCBiMnx0x9e* z9-7AMxq||!Twi6#0aKq{+^)610HzMZ0M0^9;liIux44a$-W(OuHzkE-CZp7_9YB~2 zcH9suP=i9b(d1y>Kwk?E>3*&{q_GwRzLYzL(A#rHxeN!rW3-j$8iGu22QLe>g6Sun}ZYY_ebBQ~=sVuuFh{DGL@>FmHcif|OWeSvsKr;9&+3Fq+uy^>zp�H?s7>kZa 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

    j5h_yN4(`Z(zwoll0)mCy`^ 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 z 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

    P!%aBS7G9X@ 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 z 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

    `$7q0mOk)0&n7L;_vmCI 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

    S!LAcQfFx?Hrq0eITQ>_vDsF1 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 z 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 @@ -14,11 +12,6 @@ internal abstract class ChakraJsRtJsEngineBase : InnerJsEngineBase /// protected JsSourceContext _jsSourceContext = JsSourceContext.FromIntPtr(IntPtr.Zero); - /// - /// Flag indicating whether debugging started - /// - private StatedFlag _debuggingStartedFlag; - /// /// Script dispatcher /// @@ -38,19 +31,5 @@ protected ChakraJsRtJsEngineBase(JsEngineSettings settings) _dispatcher = new ScriptDispatcher(settings.MaxStackSize); #endif } - - - /// - /// Starts debugging - /// - protected void StartDebugging() - { - if (_debuggingStartedFlag.Set()) - { - InnerStartDebugging(); - } - } - - protected abstract void InnerStartDebugging(); } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index f6b8db4..4402099 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Extensions; @@ -73,6 +72,11 @@ public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) if (_jsContext.IsValid) { _jsContext.AddRef(); + EdgeJsContext.Current = _jsContext; + if (_settings.EnableDebugging) + { + EdgeJsContext.StartDebugging(); + } } }); } @@ -200,27 +204,6 @@ private static bool CanHaveReferences(EdgeJsValue value) } } - /// - /// Creates a instance of JS scope - /// - /// Instance of JS scope - private EdgeJsScope CreateJsScope() - { - if (_jsRuntime.Disabled) - { - _jsRuntime.Disabled = false; - } - - var jsScope = new EdgeJsScope(_jsContext); - - if (_settings.EnableDebugging) - { - StartDebugging(); - } - - return jsScope; - } - #region Mapping private WrapperException WrapJsException(OriginalException originalException, @@ -347,10 +330,13 @@ private WrapperException WrapJsException(OriginalException originalException, { EdgeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); sourceLine = sourcePropertyValue.ValueType == JsValueType.String ? - sourcePropertyValue.ToString() : string.Empty; ; + sourcePropertyValue.ToString() : string.Empty; + if (sourceLine != "undefined") + { + sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); + } } - sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } @@ -377,6 +363,9 @@ private WrapperException WrapJsException(OriginalException originalException, { wrapperScriptException = new WrapperInterruptedException(CommonStrings.Runtime_ScriptInterrupted, _engineModeName, originalScriptException); + + // Restore a JS engine after interruption + _jsRuntime.Disabled = false; } else { @@ -428,10 +417,8 @@ private WrapperEngineLoadException WrapDllNotFoundException( if (originalMessage.ContainsQuotedValue(DllName.Chakra)) { - description = string.Format(CommonStrings.Engine_AssemblyNotRegistered, DllName.Chakra) + - " " + - string.Format(CommonStrings.Engine_EdgeInstallationRequired) - ; + description = string.Format(CommonStrings.Engine_AssemblyNotRegistered, DllName.Chakra) + " " + + CommonStrings.Engine_EdgeInstallationRequired; message = JsErrorHelpers.GenerateEngineLoadErrorMessage(description, _engineModeName); } else @@ -453,11 +440,6 @@ private WrapperEngineLoadException WrapDllNotFoundException( #region ChakraJsRtJsEngineBase overrides - protected override void InnerStartDebugging() - { - EdgeJsContext.StartDebugging(); - } - #region IInnerJsEngine implementation public override bool SupportsScriptPrecompilation @@ -470,18 +452,15 @@ public override PrecompiledScript Precompile(string code, string documentName) { PrecompiledScript precompiledScript = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - byte[] cachedBytes = EdgeJsContext.SerializeScript(code); + byte[] cachedBytes = EdgeJsContext.SerializeScript(code); - return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e, documentName); - } + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); } }); @@ -492,19 +471,16 @@ public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue resultValue = EdgeJsContext.RunScript(expression, _jsSourceContext++, - documentName); + EdgeJsValue resultValue = EdgeJsContext.RunScript(expression, _jsSourceContext++, + documentName); - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -515,16 +491,13 @@ public override void Execute(string code, string documentName) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsContext.RunScript(code, _jsSourceContext++, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + EdgeJsContext.RunScript(code, _jsSourceContext++, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -533,21 +506,18 @@ public override void Execute(PrecompiledScript precompiledScript) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, - _jsSourceContext++, precompiledScript.DocumentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } - finally - { - GC.KeepAlive(precompiledScript); - } + EdgeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + finally + { + GC.KeepAlive(precompiledScript); } }); } @@ -556,62 +526,60 @@ public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId functionId = EdgeJsPropertyId.FromString(functionName); + + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId functionId = EdgeJsPropertyId.FromString(functionName); + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); + } - bool functionExist = globalObj.HasProperty(functionId); - if (!functionExist) - { - throw new WrapperRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), - _engineModeName - ); - } + EdgeJsValue resultValue; + EdgeJsValue functionValue = globalObj.GetProperty(functionId); - EdgeJsValue resultValue; - EdgeJsValue functionValue = globalObj.GetProperty(functionId); + int argCount = args.Length; + if (argCount > 0) + { + int processedArgCount = argCount + 1; + var processedArgs = new EdgeJsValue[processedArgCount]; + processedArgs[0] = globalObj; - if (args.Length > 0) + for (int argIndex = 0; argIndex < argCount; argIndex++) { - EdgeJsValue[] processedArgs = _typeMapper.MapToScriptType(args); - - foreach (EdgeJsValue processedArg in processedArgs) - { - AddReferenceToValue(processedArg); - } + EdgeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); + AddReferenceToValue(processedArg); - EdgeJsValue[] allProcessedArgs = new[] { globalObj } - .Concat(processedArgs) - .ToArray() - ; + processedArgs[argIndex + 1] = processedArg; + } - try - { - resultValue = functionValue.CallFunction(allProcessedArgs); - } - finally - { - foreach (EdgeJsValue processedArg in processedArgs) - { - RemoveReferenceToValue(processedArg); - } - } + try + { + resultValue = functionValue.CallFunction(processedArgs); } - else + finally { - resultValue = functionValue.CallFunction(globalObj); + for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + { + RemoveReferenceToValue(processedArgs[argIndex]); + } } - - return _typeMapper.MapToHostType(resultValue); } - catch (OriginalException e) + else { - throw WrapJsException(e); + resultValue = functionValue.CallFunction(globalObj); } + + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -622,26 +590,23 @@ public override bool HasVariable(string variableName) { bool result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); - bool variableExist = globalObj.HasProperty(variableId); + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + bool variableExist = globalObj.HasProperty(variableId); - if (variableExist) - { - EdgeJsValue variableValue = globalObj.GetProperty(variableId); - variableExist = variableValue.ValueType != JsValueType.Undefined; - } - - return variableExist; - } - catch (OriginalException e) + if (variableExist) { - throw WrapJsException(e); + EdgeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = variableValue.ValueType != JsValueType.Undefined; } + + return variableExist; + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -652,18 +617,15 @@ public override object GetVariableValue(string variableName) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableName); + EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableName); - return _typeMapper.MapToHostType(variableValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + return _typeMapper.MapToHostType(variableValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -674,27 +636,24 @@ public override void SetVariableValue(string variableName, object value) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { + EdgeJsValue inputValue = _typeMapper.MapToScriptType(value); + AddReferenceToValue(inputValue); + try { - EdgeJsValue inputValue = _typeMapper.MapToScriptType(value); - AddReferenceToValue(inputValue); - - try - { - EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); - } - finally - { - RemoveReferenceToValue(inputValue); - } + EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); } - catch (OriginalException e) + finally { - throw WrapJsException(e); + RemoveReferenceToValue(inputValue); } } + catch (OriginalException e) + { + throw WrapJsException(e); + } }); } @@ -702,23 +661,20 @@ public override void RemoveVariable(string variableName) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); - if (globalObj.HasProperty(variableId)) - { - globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); - } - } - catch (OriginalException e) + if (globalObj.HasProperty(variableId)) { - throw WrapJsException(e); + globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); } } + catch (OriginalException e) + { + throw WrapJsException(e); + } }); } @@ -726,17 +682,14 @@ public override void EmbedHostObject(string itemName, object value) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); - EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + EdgeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); + EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -745,17 +698,14 @@ public override void EmbedHostType(string itemName, Type type) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - EdgeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); - EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + EdgeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); + EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -767,7 +717,7 @@ public override void Interrupt() public override void CollectGarbage() { - _jsRuntime.CollectGarbage(); + _dispatcher.Invoke(_jsRuntime.CollectGarbage); } #endregion @@ -819,6 +769,7 @@ private void DisposeUnmanagedResources() { if (_jsContext.IsValid) { + EdgeJsContext.Current = EdgeJsContext.Invalid; _jsContext.Release(); } _jsRuntime.Dispose(); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs index c9150df..9eefe16 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs @@ -8,75 +8,75 @@ internal static class EdgeJsErrorHelpers /// /// Throws if a native method returns an error code /// - /// The error - public static void ThrowIfError(JsErrorCode error) + /// The error code + public static void ThrowIfError(JsErrorCode errorCode) { - if (error != JsErrorCode.NoError) + if (errorCode != JsErrorCode.NoError) { - switch (error) + switch (errorCode) { #region Usage case JsErrorCode.InvalidArgument: - throw new JsUsageException(error, "Invalid argument."); + throw new JsUsageException(errorCode, "Invalid argument."); case JsErrorCode.NullArgument: - throw new JsUsageException(error, "Null argument."); + throw new JsUsageException(errorCode, "Null argument."); case JsErrorCode.NoCurrentContext: - throw new JsUsageException(error, "No current context."); + throw new JsUsageException(errorCode, "No current context."); case JsErrorCode.InExceptionState: - throw new JsUsageException(error, "Runtime is in exception state."); + throw new JsUsageException(errorCode, "Runtime is in exception state."); case JsErrorCode.NotImplemented: - throw new JsUsageException(error, "Method is not implemented."); + throw new JsUsageException(errorCode, "Method is not implemented."); case JsErrorCode.WrongThread: - throw new JsUsageException(error, "Runtime is active on another thread."); + throw new JsUsageException(errorCode, "Runtime is active on another thread."); case JsErrorCode.RuntimeInUse: - throw new JsUsageException(error, "Runtime is in use."); + throw new JsUsageException(errorCode, "Runtime is in use."); case JsErrorCode.BadSerializedScript: - throw new JsUsageException(error, "Bad serialized script."); + throw new JsUsageException(errorCode, "Bad serialized script."); case JsErrorCode.InDisabledState: - throw new JsUsageException(error, "Runtime is disabled."); + throw new JsUsageException(errorCode, "Runtime is disabled."); case JsErrorCode.CannotDisableExecution: - throw new JsUsageException(error, "Cannot disable execution."); + throw new JsUsageException(errorCode, "Cannot disable execution."); case JsErrorCode.HeapEnumInProgress: - throw new JsUsageException(error, "Heap enumeration is in progress."); + throw new JsUsageException(errorCode, "Heap enumeration is in progress."); case JsErrorCode.ArgumentNotObject: - throw new JsUsageException(error, "Argument is not an object."); + throw new JsUsageException(errorCode, "Argument is not an object."); case JsErrorCode.InProfileCallback: - throw new JsUsageException(error, "In a profile callback."); + throw new JsUsageException(errorCode, "In a profile callback."); case JsErrorCode.InThreadServiceCallback: - throw new JsUsageException(error, "In a thread service callback."); + throw new JsUsageException(errorCode, "In a thread service callback."); case JsErrorCode.CannotSerializeDebugScript: - throw new JsUsageException(error, "Cannot serialize a debug script."); + throw new JsUsageException(errorCode, "Cannot serialize a debug script."); case JsErrorCode.AlreadyDebuggingContext: - throw new JsUsageException(error, "Context is already in debug mode."); + throw new JsUsageException(errorCode, "Context is already in debug mode."); case JsErrorCode.AlreadyProfilingContext: - throw new JsUsageException(error, "Already profiling this context."); + throw new JsUsageException(errorCode, "Already profiling this context."); case JsErrorCode.IdleNotEnabled: - throw new JsUsageException(error, "Idle is not enabled."); + throw new JsUsageException(errorCode, "Idle is not enabled."); #endregion #region Engine case JsErrorCode.OutOfMemory: - throw new JsEngineException(error, "Out of memory."); + throw new JsEngineException(errorCode, "Out of memory."); #endregion @@ -86,36 +86,36 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.ScriptCompile: { EdgeJsValue errorObject; - JsErrorCode innerError = EdgeNativeMethods.JsGetAndClearException(out errorObject); + JsErrorCode innerErrorCode = EdgeNativeMethods.JsGetAndClearException(out errorObject); - if (innerError != JsErrorCode.NoError) + if (innerErrorCode != JsErrorCode.NoError) { - throw new JsFatalException(innerError); + throw new JsFatalException(innerErrorCode); } - string message = error == JsErrorCode.ScriptCompile ? + string message = errorCode == JsErrorCode.ScriptCompile ? "Compile error." : "Script threw an exception."; - throw new EdgeJsScriptException(error, errorObject, message); + throw new EdgeJsScriptException(errorCode, errorObject, message); } case JsErrorCode.ScriptTerminated: - throw new EdgeJsScriptException(error, EdgeJsValue.Invalid, "Script was terminated."); + throw new EdgeJsScriptException(errorCode, EdgeJsValue.Invalid, "Script was terminated."); case JsErrorCode.ScriptEvalDisabled: - throw new EdgeJsScriptException(error, EdgeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + throw new EdgeJsScriptException(errorCode, EdgeJsValue.Invalid, "Eval of strings is disabled in this runtime."); #endregion #region Fatal case JsErrorCode.Fatal: - throw new JsFatalException(error); + throw new JsFatalException(errorCode); #endregion default: - throw new JsFatalException(error); + throw new JsFatalException(errorCode); } } } @@ -216,21 +216,5 @@ public static EdgeJsValue CreateUriError(string message) return errorValue; } - - /// - /// Sets a exception - /// - /// - /// Requires an active script context. - /// - /// The error object - public static void SetException(EdgeJsValue exception) - { - JsErrorCode innerError = EdgeNativeMethods.JsSetException(exception); - if (innerError != JsErrorCode.NoError) - { - throw new JsFatalException(innerError); - } - } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs deleted file mode 100644 index 95d3b56..0000000 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -using MsieJavaScriptEngine.Utilities; - -namespace MsieJavaScriptEngine.JsRt.Edge -{ - /// - /// “Edge” scope automatically sets a context to current and resets the original context - /// when disposed - /// - internal struct EdgeJsScope : IDisposable - { - /// - /// The previous context - /// - private readonly EdgeJsContext _previousContext; - - /// - /// Whether the structure has been disposed - /// - private StatedFlag _disposedFlag; - - - /// - /// Initializes a new instance of the struct - /// - /// The context to create the scope for - public EdgeJsScope(EdgeJsContext context) - { - _disposedFlag = new StatedFlag(); - _previousContext = EdgeJsContext.Current; - EdgeJsContext.Current = context; - } - - #region IDisposable implementation - - /// - /// Disposes a scope and sets the previous context to current - /// - public void Dispose() - { - if (_disposedFlag.Set()) - { - EdgeJsContext.Current = _previousContext; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index eed2633..f9e22ce 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -239,7 +239,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) EdgeJsErrorHelpers.CreateError(string.Format( NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) ; - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -314,7 +314,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) EdgeJsErrorHelpers.CreateError(string.Format( NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) ; - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -398,7 +398,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); } - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -449,7 +449,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); } - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -522,7 +522,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); } - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -576,7 +576,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); } - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -661,7 +661,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); } - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); return EdgeJsValue.Undefined; } @@ -703,21 +703,21 @@ private static void SetNonEnumerableProperty(EdgeJsValue objValue, string name, private static void CreateAndSetError(string message) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateError(message); - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private static void CreateAndSetReferenceError(string message) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateReferenceError(message); - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private static void CreateAndSetTypeError(string message) { EdgeJsValue errorValue = EdgeJsErrorHelpers.CreateTypeError(message); - EdgeJsErrorHelpers.SetException(errorValue); + EdgeJsContext.SetException(errorValue); } private static EdgeJsValue CreateErrorFromWrapperException(WrapperException exception) diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 9d34b29..ec20e8e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; using System.Text; using AdvancedStringBuilder; @@ -83,6 +82,26 @@ public ChakraIeJsRtJsEngine(JsEngineSettings settings) if (_jsContext.IsValid) { _jsContext.AddRef(); + IeJsContext.Current = _jsContext; + if (_settings.EnableDebugging) + { + if (Utils.Is64BitProcess()) + { + var processDebugManager64 = (IProcessDebugManager64)new ProcessDebugManager(); + IDebugApplication64 debugApplication64; + processDebugManager64.GetDefaultApplication(out debugApplication64); + + IeJsContext.StartDebugging(debugApplication64); + } + else + { + var processDebugManager32 = (IProcessDebugManager32)new ProcessDebugManager(); + IDebugApplication32 debugApplication32; + processDebugManager32.GetDefaultApplication(out debugApplication32); + + IeJsContext.StartDebugging(debugApplication32); + } + } } }); } @@ -235,27 +254,6 @@ private static bool CanHaveReferences(IeJsValue value) } } - /// - /// Creates a instance of JS scope - /// - /// Instance of JS scope - private IeJsScope CreateJsScope() - { - if (_jsRuntime.Disabled) - { - _jsRuntime.Disabled = false; - } - - var jsScope = new IeJsScope(_jsContext); - - if (_settings.EnableDebugging) - { - StartDebugging(); - } - - return jsScope; - } - #region Mapping private WrapperException WrapJsException(OriginalException originalException, @@ -378,9 +376,12 @@ private WrapperException WrapJsException(OriginalException originalException, IeJsValue sourcePropertyValue = errorValue.GetProperty(sourcePropertyId); sourceLine = sourcePropertyValue.ValueType == JsValueType.String ? sourcePropertyValue.ToString() : string.Empty; + if (sourceLine != "undefined") + { + sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); + } } - sourceFragment = TextHelpers.GetTextFragmentFromLine(sourceLine, columnNumber); message = JsErrorHelpers.GenerateScriptErrorMessage(type, description, documentName, lineNumber, columnNumber, sourceFragment); } @@ -407,6 +408,9 @@ private WrapperException WrapJsException(OriginalException originalException, { wrapperScriptException = new WrapperInterruptedException(CommonStrings.Runtime_ScriptInterrupted, _engineModeName, originalScriptException); + + // Restore a JS engine after interruption + _jsRuntime.Disabled = false; } else { @@ -507,26 +511,6 @@ private WrapperEngineLoadException WrapTypeLoadException(TypeLoadException origi #region ChakraJsRtJsEngineBase overrides - protected override void InnerStartDebugging() - { - if (Utils.Is64BitProcess()) - { - var processDebugManager64 = (IProcessDebugManager64)new ProcessDebugManager(); - IDebugApplication64 debugApplication64; - processDebugManager64.GetDefaultApplication(out debugApplication64); - - IeJsContext.StartDebugging(debugApplication64); - } - else - { - var processDebugManager32 = (IProcessDebugManager32)new ProcessDebugManager(); - IDebugApplication32 debugApplication32; - processDebugManager32.GetDefaultApplication(out debugApplication32); - - IeJsContext.StartDebugging(debugApplication32); - } - } - #region IInnerJsEngine implementation public override bool SupportsScriptPrecompilation @@ -539,18 +523,15 @@ public override PrecompiledScript Precompile(string code, string documentName) { PrecompiledScript precompiledScript = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - byte[] cachedBytes = IeJsContext.SerializeScript(code); + byte[] cachedBytes = IeJsContext.SerializeScript(code); - return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e, documentName); - } + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); } }); @@ -561,19 +542,16 @@ public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue resultValue = IeJsContext.RunScript(expression, _jsSourceContext++, - documentName); + IeJsValue resultValue = IeJsContext.RunScript(expression, _jsSourceContext++, + documentName); - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -584,16 +562,13 @@ public override void Execute(string code, string documentName) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsContext.RunScript(code, _jsSourceContext++, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + IeJsContext.RunScript(code, _jsSourceContext++, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -602,21 +577,18 @@ public override void Execute(PrecompiledScript precompiledScript) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, - _jsSourceContext++, precompiledScript.DocumentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } - finally - { - GC.KeepAlive(precompiledScript); - } + IeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + finally + { + GC.KeepAlive(precompiledScript); } }); } @@ -625,62 +597,60 @@ public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId functionId = IeJsPropertyId.FromString(functionName); + + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId functionId = IeJsPropertyId.FromString(functionName); + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); + } - bool functionExist = globalObj.HasProperty(functionId); - if (!functionExist) - { - throw new WrapperRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), - _engineModeName - ); - } + IeJsValue resultValue; + IeJsValue functionValue = globalObj.GetProperty(functionId); - IeJsValue resultValue; - IeJsValue functionValue = globalObj.GetProperty(functionId); + int argCount = args.Length; + if (argCount > 0) + { + int processedArgCount = argCount + 1; + var processedArgs = new IeJsValue[processedArgCount]; + processedArgs[0] = globalObj; - if (args.Length > 0) + for (int argIndex = 0; argIndex < argCount; argIndex++) { - IeJsValue[] processedArgs = _typeMapper.MapToScriptType(args); + IeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); + AddReferenceToValue(processedArg); - foreach (IeJsValue processedArg in processedArgs) - { - AddReferenceToValue(processedArg); - } - - IeJsValue[] allProcessedArgs = new[] { globalObj } - .Concat(processedArgs) - .ToArray() - ; + processedArgs[argIndex + 1] = processedArg; + } - try - { - resultValue = functionValue.CallFunction(allProcessedArgs); - } - finally - { - foreach (IeJsValue processedArg in processedArgs) - { - RemoveReferenceToValue(processedArg); - } - } + try + { + resultValue = functionValue.CallFunction(processedArgs); } - else + finally { - resultValue = functionValue.CallFunction(globalObj); + for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + { + RemoveReferenceToValue(processedArgs[argIndex]); + } } - - return _typeMapper.MapToHostType(resultValue); } - catch (OriginalException e) + else { - throw WrapJsException(e); + resultValue = functionValue.CallFunction(globalObj); } + + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -691,26 +661,23 @@ public override bool HasVariable(string variableName) { bool result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); - bool variableExist = globalObj.HasProperty(variableId); + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + bool variableExist = globalObj.HasProperty(variableId); - if (variableExist) - { - IeJsValue variableValue = globalObj.GetProperty(variableId); - variableExist = variableValue.ValueType != JsValueType.Undefined; - } - - return variableExist; - } - catch (OriginalException e) + if (variableExist) { - throw WrapJsException(e); + IeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = variableValue.ValueType != JsValueType.Undefined; } + + return variableExist; + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -721,18 +688,15 @@ public override object GetVariableValue(string variableName) { object result = _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableName); + IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableName); - return _typeMapper.MapToHostType(variableValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + return _typeMapper.MapToHostType(variableValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); @@ -743,27 +707,24 @@ public override void SetVariableValue(string variableName, object value) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { + IeJsValue inputValue = _typeMapper.MapToScriptType(value); + AddReferenceToValue(inputValue); + try { - IeJsValue inputValue = _typeMapper.MapToScriptType(value); - AddReferenceToValue(inputValue); - - try - { - IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); - } - finally - { - RemoveReferenceToValue(inputValue); - } + IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); } - catch (OriginalException e) + finally { - throw WrapJsException(e); + RemoveReferenceToValue(inputValue); } } + catch (OriginalException e) + { + throw WrapJsException(e); + } }); } @@ -771,23 +732,20 @@ public override void RemoveVariable(string variableName) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); - if (globalObj.HasProperty(variableId)) - { - globalObj.SetProperty(variableId, IeJsValue.Undefined, true); - } - } - catch (OriginalException e) + if (globalObj.HasProperty(variableId)) { - throw WrapJsException(e); + globalObj.SetProperty(variableId, IeJsValue.Undefined, true); } } + catch (OriginalException e) + { + throw WrapJsException(e); + } }); } @@ -795,17 +753,14 @@ public override void EmbedHostObject(string itemName, object value) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); - IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + IeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); + IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -814,17 +769,14 @@ public override void EmbedHostType(string itemName, Type type) { _dispatcher.Invoke(() => { - using (CreateJsScope()) + try { - try - { - IeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); - IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } + IeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); + IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); } }); } @@ -836,7 +788,7 @@ public override void Interrupt() public override void CollectGarbage() { - _jsRuntime.CollectGarbage(); + _dispatcher.Invoke(_jsRuntime.CollectGarbage); } #endregion @@ -888,6 +840,7 @@ private void DisposeUnmanagedResources() { if (_jsContext.IsValid) { + IeJsContext.Current = IeJsContext.Invalid; _jsContext.Release(); } _jsRuntime.Dispose(); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs index e3e3f31..4432941 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs @@ -8,75 +8,75 @@ internal static class IeJsErrorHelpers /// /// Throws if a native method returns an error code /// - /// The error - public static void ThrowIfError(JsErrorCode error) + /// The error code + public static void ThrowIfError(JsErrorCode errorCode) { - if (error != JsErrorCode.NoError) + if (errorCode != JsErrorCode.NoError) { - switch (error) + switch (errorCode) { #region Usage case JsErrorCode.InvalidArgument: - throw new JsUsageException(error, "Invalid argument."); + throw new JsUsageException(errorCode, "Invalid argument."); case JsErrorCode.NullArgument: - throw new JsUsageException(error, "Null argument."); + throw new JsUsageException(errorCode, "Null argument."); case JsErrorCode.NoCurrentContext: - throw new JsUsageException(error, "No current context."); + throw new JsUsageException(errorCode, "No current context."); case JsErrorCode.InExceptionState: - throw new JsUsageException(error, "Runtime is in exception state."); + throw new JsUsageException(errorCode, "Runtime is in exception state."); case JsErrorCode.NotImplemented: - throw new JsUsageException(error, "Method is not implemented."); + throw new JsUsageException(errorCode, "Method is not implemented."); case JsErrorCode.WrongThread: - throw new JsUsageException(error, "Runtime is active on another thread."); + throw new JsUsageException(errorCode, "Runtime is active on another thread."); case JsErrorCode.RuntimeInUse: - throw new JsUsageException(error, "Runtime is in use."); + throw new JsUsageException(errorCode, "Runtime is in use."); case JsErrorCode.BadSerializedScript: - throw new JsUsageException(error, "Bad serialized script."); + throw new JsUsageException(errorCode, "Bad serialized script."); case JsErrorCode.InDisabledState: - throw new JsUsageException(error, "Runtime is disabled."); + throw new JsUsageException(errorCode, "Runtime is disabled."); case JsErrorCode.CannotDisableExecution: - throw new JsUsageException(error, "Cannot disable execution."); + throw new JsUsageException(errorCode, "Cannot disable execution."); case JsErrorCode.HeapEnumInProgress: - throw new JsUsageException(error, "Heap enumeration is in progress."); + throw new JsUsageException(errorCode, "Heap enumeration is in progress."); case JsErrorCode.ArgumentNotObject: - throw new JsUsageException(error, "Argument is not an object."); + throw new JsUsageException(errorCode, "Argument is not an object."); case JsErrorCode.InProfileCallback: - throw new JsUsageException(error, "In a profile callback."); + throw new JsUsageException(errorCode, "In a profile callback."); case JsErrorCode.InThreadServiceCallback: - throw new JsUsageException(error, "In a thread service callback."); + throw new JsUsageException(errorCode, "In a thread service callback."); case JsErrorCode.CannotSerializeDebugScript: - throw new JsUsageException(error, "Cannot serialize a debug script."); + throw new JsUsageException(errorCode, "Cannot serialize a debug script."); case JsErrorCode.AlreadyDebuggingContext: - throw new JsUsageException(error, "Context is already in debug mode."); + throw new JsUsageException(errorCode, "Context is already in debug mode."); case JsErrorCode.AlreadyProfilingContext: - throw new JsUsageException(error, "Already profiling this context."); + throw new JsUsageException(errorCode, "Already profiling this context."); case JsErrorCode.IdleNotEnabled: - throw new JsUsageException(error, "Idle is not enabled."); + throw new JsUsageException(errorCode, "Idle is not enabled."); #endregion #region Engine case JsErrorCode.OutOfMemory: - throw new JsEngineException(error, "Out of memory."); + throw new JsEngineException(errorCode, "Out of memory."); #endregion @@ -86,36 +86,36 @@ public static void ThrowIfError(JsErrorCode error) case JsErrorCode.ScriptCompile: { IeJsValue errorObject; - JsErrorCode innerError = IeNativeMethods.JsGetAndClearException(out errorObject); + JsErrorCode innerErrorCode = IeNativeMethods.JsGetAndClearException(out errorObject); - if (innerError != JsErrorCode.NoError) + if (innerErrorCode != JsErrorCode.NoError) { - throw new JsFatalException(innerError); + throw new JsFatalException(innerErrorCode); } - string message = error == JsErrorCode.ScriptCompile ? + string message = errorCode == JsErrorCode.ScriptCompile ? "Compile error." : "Script threw an exception."; - throw new IeJsScriptException(error, errorObject, message); + throw new IeJsScriptException(errorCode, errorObject, message); } case JsErrorCode.ScriptTerminated: - throw new IeJsScriptException(error, IeJsValue.Invalid, "Script was terminated."); + throw new IeJsScriptException(errorCode, IeJsValue.Invalid, "Script was terminated."); case JsErrorCode.ScriptEvalDisabled: - throw new IeJsScriptException(error, IeJsValue.Invalid, "Eval of strings is disabled in this runtime."); + throw new IeJsScriptException(errorCode, IeJsValue.Invalid, "Eval of strings is disabled in this runtime."); #endregion #region Fatal case JsErrorCode.Fatal: - throw new JsFatalException(error); + throw new JsFatalException(errorCode); #endregion default: - throw new JsFatalException(error); + throw new JsFatalException(errorCode); } } } @@ -216,21 +216,5 @@ public static IeJsValue CreateUriError(string message) return errorValue; } - - /// - /// Sets a exception - /// - /// - /// Requires an active script context. - /// - /// The error object - public static void SetException(IeJsValue exception) - { - JsErrorCode innerError = IeNativeMethods.JsSetException(exception); - if (innerError != JsErrorCode.NoError) - { - throw new JsFatalException(innerError); - } - } } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs deleted file mode 100644 index b53bab8..0000000 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; - -using MsieJavaScriptEngine.Utilities; - -namespace MsieJavaScriptEngine.JsRt.Ie -{ - /// - /// “IE” scope automatically sets a context to current and resets the original context - /// when disposed - /// - internal struct IeJsScope : IDisposable - { - /// - /// The previous context - /// - private readonly IeJsContext _previousContext; - - /// - /// Whether the structure has been disposed - /// - private StatedFlag _disposedFlag; - - - /// - /// Initializes a new instance of the struct - /// - /// The context to create the scope for - public IeJsScope(IeJsContext context) - { - _disposedFlag = new StatedFlag(); - _previousContext = IeJsContext.Current; - IeJsContext.Current = context; - } - - #region IDisposable implementation - - /// - /// Disposes the scope and sets the previous context to current - /// - public void Dispose() - { - if (_disposedFlag.Set()) - { - IeJsContext.Current = _previousContext; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index ea7ae37..ccf5ebc 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -234,7 +234,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) IeJsErrorHelpers.CreateError(string.Format( NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) ; - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -309,7 +309,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) IeJsErrorHelpers.CreateError(string.Format( NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) ; - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -393,7 +393,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); } - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -444,7 +444,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); } - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -517,7 +517,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); } - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -571,7 +571,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); } - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -656,7 +656,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); } - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); return IeJsValue.Undefined; } @@ -697,21 +697,21 @@ private static void SetNonEnumerableProperty(IeJsValue objValue, string name, Ie private static void CreateAndSetError(string message) { IeJsValue errorValue = IeJsErrorHelpers.CreateError(message); - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private static void CreateAndSetReferenceError(string message) { IeJsValue errorValue = IeJsErrorHelpers.CreateReferenceError(message); - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); } [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] private static void CreateAndSetTypeError(string message) { IeJsValue errorValue = IeJsErrorHelpers.CreateTypeError(message); - IeJsErrorHelpers.SetException(errorValue); + IeJsContext.SetException(errorValue); } private static IeJsValue CreateErrorFromWrapperException(WrapperException exception) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 383c8b9..b954150 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -21,7 +21,8 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error that occurred during the recursive execution and evaluation of JS files (while without correct handling of host exceptions). + 1. Slightly improved performance; +2. In JsRT modes the `CollectGarbage` method is called synchronously again. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 49c13e6..f93a473 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -38,8 +38,7 @@ public sealed class MsieJsEngine : IDisposable /// /// Unique document name manager /// - private readonly UniqueDocumentNameManager _documentNameManager = - new UniqueDocumentNameManager("Script Document"); + private UniqueDocumentNameManager _documentNameManager = new UniqueDocumentNameManager("Script Document"); /// /// Flag that object is destroyed @@ -1428,6 +1427,8 @@ public void Dispose() _jsEngine.Dispose(); _jsEngine = null; } + + _documentNameManager = null; } } diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 08f86e0..ad5041e 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -31,7 +31,7 @@ internal sealed class ScriptDispatcher : IDisposable /// /// Queue of script tasks /// - private readonly Queue _taskQueue = new Queue(); + private Queue _taskQueue = new Queue(); /// /// Synchronizer of script task queue @@ -83,7 +83,7 @@ private void VerifyNotDisposed() /// private void StartThread() { - while(true) + while (true) { ScriptTask task = null; @@ -102,16 +102,7 @@ private void StartThread() if (task != null) { - try - { - task.Result = task.Delegate(); - } - catch (Exception e) - { - task.Exception = e; - } - - task.WaitHandle.Set(); + task.Run(); } else { @@ -134,28 +125,14 @@ private void EnqueueTask(ScriptTask task) } /// - /// Runs a specified delegate on the thread with modified stack size, - /// and returns its result as an . - /// Blocks until the invocation of delegate is completed. + /// Executes a script task /// - /// Delegate to invocation - /// Result of the delegate invocation - private object InnnerInvoke(Func del) + /// Script task + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + private void ExecuteTask(ScriptTask task) { - if (Thread.CurrentThread == _thread) - { - return del(); - } - - ScriptTask task; - - using (var waitHandle = new ManualResetEvent(false)) - { - task = new ScriptTask(del, waitHandle); - EnqueueTask(task); - - waitHandle.WaitOne(); - } + EnqueueTask(task); + task.Wait(); Exception exception = task.Exception; if (exception != null) @@ -169,8 +146,6 @@ private object InnnerInvoke(Func del) #error No implementation for this target #endif } - - return task.Result; } /// @@ -191,7 +166,16 @@ public T Invoke(Func func) throw new ArgumentNullException(nameof(func)); } - return (T)InnnerInvoke(() => func()); + if (Thread.CurrentThread == _thread) + { + return func(); + } + + using (var task = new ScriptTaskWithResult(func)) + { + ExecuteTask(task); + return task.Result; + } } /// @@ -208,17 +192,22 @@ public void Invoke(Action action) throw new ArgumentNullException(nameof(action)); } - InnnerInvoke(() => + if (Thread.CurrentThread == _thread) { action(); - return null; - }); + return; + } + + using (var task = new ScriptTaskWithoutResult(action)) + { + ExecuteTask(task); + } } #region IDisposable implementation /// - /// Destroys object + /// Destroys a script dispatcher /// public void Dispose() { @@ -237,6 +226,8 @@ public void Dispose() _waitHandle.Dispose(); _waitHandle = null; } + + _taskQueue = null; } } @@ -247,55 +238,195 @@ public void Dispose() /// /// Represents a script task, that must be executed on separate thread /// - private sealed class ScriptTask + private abstract class ScriptTask : IDisposable { /// - /// Gets a delegate to invocation + /// Event to signal when the invocation of delegate has completed /// - public Func Delegate + protected ManualResetEvent _waitHandle = new ManualResetEvent(false); + + /// + /// Exception, that occurred during the invocation of delegate + /// + protected Exception _exception; + + /// + /// Flag that object is destroyed + /// + protected StatedFlag _disposedFlag = new StatedFlag(); + + /// + /// Gets a exception, that occurred during the invocation of delegate. + /// If no exception has occurred, this will be null. + /// + public Exception Exception + { + get { return _exception; } + } + + + [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] + protected void VerifyNotDisposed() { - get; - private set; + if (_disposedFlag.IsSet()) + { + throw new ObjectDisposedException(ToString()); + } } /// - /// Gets a event to signal when the invocation of delegate has completed + /// Runs a script task /// - public ManualResetEvent WaitHandle + public abstract void Run(); + + /// + /// Waits for the script task to complete execution + /// + public void Wait() { - get; - private set; + VerifyNotDisposed(); + + _waitHandle.WaitOne(); } + #region IDisposable implementation + /// - /// Gets or sets a result of the delegate invocation + /// Destroys a script task /// - public object Result + public virtual void Dispose() { - get; - set; + if (_waitHandle != null) + { + _waitHandle.Dispose(); + _waitHandle = null; + } + + _exception = null; } + #endregion + } + + /// + /// Represents a script task with result, that must be executed on separate thread + /// + private sealed class ScriptTaskWithResult : ScriptTask + { /// - /// Gets or sets a exception, that occurred during the invocation of delegate. - /// If no exception has occurred, this will be null. + /// Delegate to invocation /// - public Exception Exception + private Func _func; + + /// + /// Result of the delegate invocation + /// + private TResult _result; + + /// + /// Gets a result of the delegate invocation + /// + public TResult Result + { + get { return _result; } + } + + + /// + /// Constructs an instance of script task with result + /// + /// Delegate to invocation + public ScriptTaskWithResult(Func func) + { + _func = func; + } + + + /// + /// Runs a script task + /// + public override void Run() + { + VerifyNotDisposed(); + + try + { + _result = _func(); + } + catch (Exception e) + { + _exception = e; + } + + _waitHandle.Set(); + } + + /// + /// Destroys a script task + /// + public override void Dispose() { - get; - set; + if (_disposedFlag.Set()) + { + base.Dispose(); + + _result = default(TResult); + _func = null; + } } + } + + /// + /// Represents a script task without result, that must be executed on separate thread + /// + private sealed class ScriptTaskWithoutResult : ScriptTask + { + /// + /// Delegate to invocation + /// + private Action _action; /// - /// Constructs an instance of script task + /// Constructs an instance of script task without result /// - /// Delegate to invocation - /// Event to signal when the invocation of delegate has completed - public ScriptTask(Func del, ManualResetEvent waitHandle) + /// Delegate to invocation + public ScriptTaskWithoutResult(Action action) { - Delegate = del; - WaitHandle = waitHandle; + _action = action; + } + + + /// + /// Runs a script task + /// + public override void Run() + { + VerifyNotDisposed(); + + try + { + _action(); + } + catch (Exception e) + { + _exception = e; + } + + _waitHandle.Set(); + } + + /// + /// Destroys a script task + /// + public override void Dispose() + { + if (_disposedFlag.Set()) + { + base.Dispose(); + + _action = null; + } } } diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 98ff841..add53c3 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,8 @@ ============= RELEASE NOTES ============= - Fixed a error that occurred during the recursive execution and evaluation of JS - files (while without correct handling of host exceptions). + 1. Slightly improved performance; + 2. In JsRT modes the `CollectGarbage` method is called synchronously again. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index f320f37..6cbb8fb 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -40,7 +40,6 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() } #endregion -#endif #region Recursive calls @@ -98,6 +97,7 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() #endregion +#endif #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index 62577e3..e55b5e6 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -40,7 +40,6 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() } #endregion -#endif #region Recursive calls @@ -98,6 +97,7 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() #endregion +#endif #endregion } } \ No newline at end of file From d3a7ba8ca714719b251fcf307e54bfb7bdf4ea5d Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 20:03:36 +0300 Subject: [PATCH 181/238] In tests was added the .NET Core App 3.0 target --- build/common.props | 4 +-- global.json | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 +-- ...criptEngine.Test.ChakraActiveScript.csproj | 2 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 +-- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 +-- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../FileSystemTestsBase.cs | 28 ++++++------------- .../MsieJavaScriptEngine.Test.Common.csproj | 14 ++++------ 10 files changed, 25 insertions(+), 41 deletions(-) diff --git a/build/common.props b/build/common.props index e83d6ab..83ed444 100644 --- a/build/common.props +++ b/build/common.props @@ -7,11 +7,11 @@ $(DefineConstants);NETFULL - + $(DefineConstants);NETSTANDARD - + $(DefineConstants);NETCOREAPP \ No newline at end of file diff --git a/global.json b/global.json index 1d4db8d..8061d05 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.2.109" + "version": "3.0.100" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 70c4a27..06e90c2 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.3 - net461;netcoreapp2.0 + net461;netcoreapp2.0;netcoreapp3.0 Exe true false diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 320e7e1..8157fd6 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0 + net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 1.0.16 Library true @@ -14,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 6152d0f..8984e6e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index c4a8b84..5c649a0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0 + net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 1.0.16 Library true @@ -14,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 86d08b3..4fc75a5 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0 + net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 1.0.16 Library true @@ -14,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index c67660e..4a0a3fd 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index 2f5ef07..bb8bfa6 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -1,38 +1,26 @@ -#if NET451 || NETCOREAPP +using System; +using System.IO; +#if NETCOREAPP1_0 + using Microsoft.Extensions.PlatformAbstractions; -#elif NET40 -using System; -using System.Text.RegularExpressions; -#else -#error No implementation for this target #endif -using System.IO; namespace MsieJavaScriptEngine.Test.Common { public abstract class FileSystemTestsBase : TestsBase { -#if NET40 - /// - /// Regular expression for working with the `bin` directory path - /// - private readonly Regex _binDirRegex = new Regex(@"\\bin\\(?:Debug|Release)\\?$", RegexOptions.IgnoreCase); - -#endif private string _baseDirectoryPath; protected FileSystemTestsBase() { -#if NET451 || NETCOREAPP +#if NETCOREAPP1_0 var appEnv = PlatformServices.Default.Application; - _baseDirectoryPath = Path.Combine(appEnv.ApplicationBasePath, "../../../../"); -#elif NET40 - string baseDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; - _baseDirectoryPath = Path.Combine(baseDirectoryPath, "../../../../"); + string appDirectoryPath = appEnv.ApplicationBasePath; #else -#error No implementation for this target + string appDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; #endif + _baseDirectoryPath = Path.Combine(appDirectoryPath, "../../../../"); } diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index b6da9df..a119ff0 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0 + net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 1.0.16 Library true @@ -15,9 +15,9 @@ - - - + + + @@ -26,14 +26,10 @@ - + - - - - From 3e64477a7c24e9dbb707e3d9847fd5669aa702ec Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 20:10:21 +0300 Subject: [PATCH 182/238] In tests the .NET Core App 2.0 target was updated to version 2.1 --- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 06e90c2..b5f6910 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.3 - net461;netcoreapp2.0;netcoreapp3.0 + net461;netcoreapp2.1;netcoreapp3.0 Exe true false diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 8157fd6..e72d189 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 5c649a0..4d6eb32 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 4fc75a5..cf28ba8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index a119ff0..63fbbf3 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.3 - net40;net451;netcoreapp1.0;netcoreapp2.0;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library true From 9c7f14bd11b0c5a8aaaffdfd404dd8188ee95e49 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 20:21:10 +0300 Subject: [PATCH 183/238] PackageIconUrl -> PackageIcon --- images/MsieJavaScriptEngine_Logo_128x128.png | Bin 0 -> 3256 bytes .../MsieJavaScriptEngine.csproj | 20 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 images/MsieJavaScriptEngine_Logo_128x128.png diff --git a/images/MsieJavaScriptEngine_Logo_128x128.png b/images/MsieJavaScriptEngine_Logo_128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..d53d47138872eec6d896e702d4f70c16e5caa582 GIT binary patch literal 3256 zcmZ`*cQo5wAODH1)GUwDn$=Pd+IsAwR;f{&wyJ8YS&uy`v}$i!t2Ih%uhyy}_Ey9m z2@y#Mg2adrZ{C03bKdVc_j}L%-gCb9GwwO}#+w*FVqxNA0sw$TUr*bNGK2p+7^o?k zu$E2)0FZ`>p@j}*sjja6b9{%A|6k<)M*Yv$=MGF%RkA zAdc#Wu?4@;mPxa2IZNC7XQ*8wr5IKQ3;PE5`Lc3yMt)lkGl_$aEFaDy2$OI;X8-Ku z?4o;azqAL_Gq)dKhxjpuT|ymI4{m2RZ<-~{lt3{1N9RxkA-!oMxp4zBgUfC~&TSm! zwxP~1E{P=aANb)eo)lcVTGWO93c>U*9GsIc4+!U(&B(lVRQ(8c20@rvC!CYXIlnfi z;CP#q+09*IT-`bbN2K6S`?+y=d>&K19$2#4IEu|`-o&4r2baPqXHBmYDEKS-w$`?f z(R;+$+Vx*kyPo+=U%N3Bf)wJHmzNY}j6O`8#zQHjp2R`T6K0HKp$0M2lnxX~W(iQs z#96DPSqc%0q}dngb5_Z-enl%~Js67wsCnXycfm4pml*VQmD1KSX~rRI!M|w5ICeU# z1xdcVytp7YPwYHRnR}Tzum67PQS=l=$%yapfZ|oxoJ9)4w4ca?dISYL1zYt1_IcWz z^T)+^RclA57a^svu~j^U3q_Vst(z2~z!h+cP{+gzibuWk`;XsGlg`O=$fNCpv$n}S zG>*7`M55?i-n-?IzcjRT;PYjQXQwQB}92`5l&T}B@xc1|n%x7~9WDbnTrLcLW^ zl&9PwcYiZub3h1W!iJO8i0tzHb6{TxPpz|4v3n($dX3dVMWv?qp?Gv^U!Qb1TXC@(gtmhaMSOH)Q;A+|2NcvB7Odhh-J2=ah8_G zn7r1IFpK)t-X78PiO#B2!x&>!cpP+Yfr38>bMZ3sU+;;z!Xte?NP;e}swI{mdkk5V z|K6@DZpTq0%jU1T@Vau0!*?!S9}h;xsQPPth>`|TmCFF^vMceb{sA`c2W}Vhq{Y@I zFajB**<|3dnMr#sqviQzrkfl%G!acD=Bp1HSEBJvv5)w{4k6uOP?Qp+x>6Tbl+D{- z1?HC{2p>**MIx0P(6?v|sbUryn)uT`?S(1AJJ{!b^7VMI%TCt1V4wF+HOov9&AVGe zIZX*Z_FLf-v1Ar0v}Rl}{s@}vbhk=^&ZxOpFi!9pOqngUgUF98gUJd1{%~raq|jr#UpGQ-iG#%*+WbYYDtsl&-#rD#GUn0xjt=#Udy`IRWW`{I z(hn8rlQU;y;X28|#PpX=XWnfmFoi3EZ==~lF`u8@&z&C63sX-W^`(nPEt^t%Up$R- zlmNXJ`FyUTss1!IG3hQ7Ut94}JmgIYC~tAaW2nQ+MXER4`s<^A-I=a&*?vvxXALWP z6_p7%H3nbztAVe$784~27O4#4OqK1MTDh~I*JIMx-7k7KPdCbU@-dCdxqm~lWBU~6 zseHABo$URCeO&&zKl8!{F2ez=Id;0~X0{8ux1SBkL`=E;Y)6#w7f|;FZ-xK;NlAw|qz)DG9!x5$)jN;!q+tm6u<* zMXfpVxlb2u4h#&WuQ_5Ey9BG^p+EwSKW#Q5I7XGhFkHMV-|- zevG{s)o+-QTKoqy+*RslDjFKQvS$+Yy$57VcQB}IO{Y@->UAT&>M@P*%0N`S7)~Sd zn{UGDZ!K_sxQJqjrr*Df9oLsxq`8$UgI*T?16*(AjxfCj_P-$K9|LALAp_Si103`z zH1G-gknuO3Q&acS)2Om~{{e|dVxAFrE!LTEv(-Sn`r&Ej0}(}bQggkxbFjd&)TRVD zPt3k}KQiQekf~r#vZOQkq{;;tjW^)lsKlRfUODZXKXA?|$MYJ0 zcJzE5-Q4@vbO2+)P}Qx~E*>whDTRxoy29;xQVvo z>Qq|fNB@4SdUp>n_)d5odr>@fORIR2$_Fi-3v8j}-KSkPVb!ZP920ke819t@=?eU5 zpEAAkR)3%;#)49uSDEdsZG7iyq(xuZt^lYUMf{i{MlFuLfy$;IB~gRS zgX83ZFvzZjVaDjfPZ{&cGWqXIDw0c&99$Xf<*wrdgdQlT7+rVV^7Hr>RBheBjJBd0 z*?m=&9<2vBS=IOPsUrW#0OVX2VR zSUY?Gac#PulgHb4^f&8W-Jn>fQCr093ik2C zp<@?3SVLgKmc^mgm~$>Nz)*bPz_h21o(!cvlX)le5MA>nn8~NE;)8I zKz%=0GBTd?{bKFhyNQCwPU%pFx4u1BG;59w)D=LUe%TK`72E+FJPZa;LoW|7`x9qw zhFRUTOS2?*;|fV8!QXYT3D3?UZ#1wVDvMAmKOKS?1kpyq|u3$oRN=|gSQ0{HX~ zS%%+Z?~*7t^|Q6Aa#I}hkS}+}jkRRbUK?u5L-I=}x)W=<@ns#zx^D&HY~f*) zGd_@lDBxh+PQV$i3JAUZsl?vo1)&t_1^5S8Ra>L^EMD97+l2^?VK!Ym%v+mC>DJ!u z4hjsF5*DL3XQhdVfFTuyaKae=rz2m4OPe#9hmL0J+y0lcuL^Kf-I|zRPV@ zX?=@BT0Ve(XABE!z>91|cs@xwrLhX=dL_I#9&lkQJ*U6t3SYJ6HsoU!k<2}3(E6bn z@CX}RsQWGYiD|H`l!WFK8#G0)5u&H;r$@!}xq4`tR&g21{KBtM7(LpXR9|HHM^lkb z;SZdrUcMjH|1;bEwrgFKE8m_)qn)cN^83>S4I7RK(^!+mCJ9_=eqHrDTWVR3Ttqua zTt_$VOv-*&3daB$$=p>l_)c~3#@u<{%T$y#o^$@=bWYC?aMs?SQ^!IfP3cht6;XNG z`+neAHMc>YM}Fp0QR}A4C1>k5$$MOLx@PJ(cjT4(Rk&?(SczP03ixabqGxxw7hS~J z1Z@yi0G%=2p0<@})r};bk$c1M56=zaBD%)%1bfSBOgEu2uMD1mM8a0-VVr4tz0Va@ z0tenadn{dcpxi^7K5fmr&D2fs)_DM zYkKC57uiEQs*7n7a@Xb!-f2FQ)Zt@Ok@@YOV>y6z@=4fz`}Bu$O_=NoHK?Th5hO(w zRMhE=^yA<+_H1>H^R<|g#ol}KLICENSE.txt false https://github.com/Taritsyn/MsieJavaScriptEngine - http://i.imgur.com/cbiHK.png + icon.png https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra @@ -56,19 +56,25 @@ - - readme.txt + + $(PackageIcon) true - - + false + + $(PackageLicenseFile) true false - - + + / true false + + + + readme.txt + true From 757a0f9467fe97b34fdc0e55713f3bd6ba5747aa Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 20:28:15 +0300 Subject: [PATCH 184/238] Enabled a SourceLink in NuGet package --- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 9 +++++++-- src/MsieJavaScriptEngine/readme.txt | 3 ++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 6ef8ab9..691e0d8 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -20,12 +20,16 @@ icon.png https://github.com/Taritsyn/MsieJavaScriptEngine git + true + true + snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Slightly improved performance; -2. In JsRT modes the `CollectGarbage` method is called synchronously again. +2. In JsRT modes the `CollectGarbage` method is called synchronously again; +3. Enabled a SourceLink in NuGet package. en-US ../../nuget - true + true false false @@ -37,6 +41,7 @@ + diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index add53c3..5862351 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -22,7 +22,8 @@ RELEASE NOTES ============= 1. Slightly improved performance; - 2. In JsRT modes the `CollectGarbage` method is called synchronously again. + 2. In JsRT modes the `CollectGarbage` method is called synchronously again; + 3. Enabled a SourceLink in NuGet package. ============ PROJECT SITE From 5a4cfaa551242b725074b36c2fdfaefebb51c4ee Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 20:49:14 +0300 Subject: [PATCH 185/238] Version 3.0.4 --- CHANGELOG.md | 5 +++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 14 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 338ce81..8e420bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,11 @@ Change log ========== +## v3.0.4 - October 9, 2019 + * Slightly improved performance + * In JsRT modes the `CollectGarbage` method is called synchronously again + * Enabled a SourceLink in NuGet package + ## v3.0.3 - April 28, 2019 * Fixed a error that occurred during the recursive execution and evaluation of JS files (while without correct handling of host exception) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 691e0d8..5e3cdec 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.3 + 3.0.4 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 5862351..52d53da 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.3 + README file for MSIE JavaScript Engine for .NET v3.0.4 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index b5f6910..fd390f5 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.3 + 3.0.4 net461;netcoreapp2.1;netcoreapp3.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index e72d189..151f9f5 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.3 + 3.0.4 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 8984e6e..a5efb7d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.3 + 3.0.4 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 4d6eb32..4571cd9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.3 + 3.0.4 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index cf28ba8..4542640 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.3 + 3.0.4 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 4a0a3fd..9e3be05 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.3 + 3.0.4 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 63fbbf3..c8fb940 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.3 + 3.0.4 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library From f95e5e19f3bc6edf560f41dc7a6ebdc25beea47e Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 21 Oct 2019 19:51:47 +0300 Subject: [PATCH 186/238] 1. Fixed a error that caused a crash during finalization; 2. In JsRT modes during calling of the `CollectGarbage` method is again not performed blocking. --- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 295 +++++++++-------- .../JsRt/Edge/EdgeJsScope.cs | 51 +++ .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 308 +++++++++--------- .../JsRt/Ie/IeJsContext.cs | 23 ++ src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 51 +++ .../MsieJavaScriptEngine.csproj | 5 +- src/MsieJavaScriptEngine/readme.txt | 6 +- .../CommonTestsBase.cs | 11 + 8 files changed, 469 insertions(+), 281 deletions(-) create mode 100644 src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs create mode 100644 src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 4402099..af448cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -72,10 +72,13 @@ public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) if (_jsContext.IsValid) { _jsContext.AddRef(); - EdgeJsContext.Current = _jsContext; + if (_settings.EnableDebugging) { - EdgeJsContext.StartDebugging(); + using (new EdgeJsScope(_jsContext)) + { + EdgeJsContext.StartDebugging(); + } } } }); @@ -452,15 +455,18 @@ public override PrecompiledScript Precompile(string code, string documentName) { PrecompiledScript precompiledScript = _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - byte[] cachedBytes = EdgeJsContext.SerializeScript(code); + try + { + byte[] cachedBytes = EdgeJsContext.SerializeScript(code); - return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e, documentName); + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); + } } }); @@ -471,16 +477,19 @@ public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue resultValue = EdgeJsContext.RunScript(expression, _jsSourceContext++, - documentName); + try + { + EdgeJsValue resultValue = EdgeJsContext.RunScript(expression, _jsSourceContext++, + documentName); - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); @@ -491,13 +500,16 @@ public override void Execute(string code, string documentName) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsContext.RunScript(code, _jsSourceContext++, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); + try + { + EdgeJsContext.RunScript(code, _jsSourceContext++, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -506,18 +518,21 @@ public override void Execute(PrecompiledScript precompiledScript) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, - _jsSourceContext++, precompiledScript.DocumentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } - finally - { - GC.KeepAlive(precompiledScript); + try + { + EdgeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + finally + { + GC.KeepAlive(precompiledScript); + } } }); } @@ -526,60 +541,63 @@ public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId functionId = EdgeJsPropertyId.FromString(functionName); - - bool functionExist = globalObj.HasProperty(functionId); - if (!functionExist) + try { - throw new WrapperRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), - _engineModeName - ); - } + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId functionId = EdgeJsPropertyId.FromString(functionName); - EdgeJsValue resultValue; - EdgeJsValue functionValue = globalObj.GetProperty(functionId); + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) + { + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); + } - int argCount = args.Length; - if (argCount > 0) - { - int processedArgCount = argCount + 1; - var processedArgs = new EdgeJsValue[processedArgCount]; - processedArgs[0] = globalObj; + EdgeJsValue resultValue; + EdgeJsValue functionValue = globalObj.GetProperty(functionId); - for (int argIndex = 0; argIndex < argCount; argIndex++) + int argCount = args.Length; + if (argCount > 0) { - EdgeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); - AddReferenceToValue(processedArg); + int processedArgCount = argCount + 1; + var processedArgs = new EdgeJsValue[processedArgCount]; + processedArgs[0] = globalObj; - processedArgs[argIndex + 1] = processedArg; - } + for (int argIndex = 0; argIndex < argCount; argIndex++) + { + EdgeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); + AddReferenceToValue(processedArg); - try - { - resultValue = functionValue.CallFunction(processedArgs); - } - finally - { - for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + processedArgs[argIndex + 1] = processedArg; + } + + try { - RemoveReferenceToValue(processedArgs[argIndex]); + resultValue = functionValue.CallFunction(processedArgs); } + finally + { + for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + { + RemoveReferenceToValue(processedArgs[argIndex]); + } + } + } + else + { + resultValue = functionValue.CallFunction(globalObj); } + + return _typeMapper.MapToHostType(resultValue); } - else + catch (OriginalException e) { - resultValue = functionValue.CallFunction(globalObj); + throw WrapJsException(e); } - - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); } }); @@ -590,23 +608,26 @@ public override bool HasVariable(string variableName) { bool result = _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); - bool variableExist = globalObj.HasProperty(variableId); + try + { + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + bool variableExist = globalObj.HasProperty(variableId); + + if (variableExist) + { + EdgeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = variableValue.ValueType != JsValueType.Undefined; + } - if (variableExist) + return variableExist; + } + catch (OriginalException e) { - EdgeJsValue variableValue = globalObj.GetProperty(variableId); - variableExist = variableValue.ValueType != JsValueType.Undefined; + throw WrapJsException(e); } - - return variableExist; - } - catch (OriginalException e) - { - throw WrapJsException(e); } }); @@ -617,15 +638,18 @@ public override object GetVariableValue(string variableName) { object result = _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableName); + try + { + EdgeJsValue variableValue = EdgeJsValue.GlobalObject.GetProperty(variableName); - return _typeMapper.MapToHostType(variableValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); + return _typeMapper.MapToHostType(variableValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); @@ -636,24 +660,27 @@ public override void SetVariableValue(string variableName, object value) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue inputValue = _typeMapper.MapToScriptType(value); - AddReferenceToValue(inputValue); - try { - EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + EdgeJsValue inputValue = _typeMapper.MapToScriptType(value); + AddReferenceToValue(inputValue); + + try + { + EdgeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + } + finally + { + RemoveReferenceToValue(inputValue); + } } - finally + catch (OriginalException e) { - RemoveReferenceToValue(inputValue); + throw WrapJsException(e); } } - catch (OriginalException e) - { - throw WrapJsException(e); - } }); } @@ -661,20 +688,23 @@ public override void RemoveVariable(string variableName) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue globalObj = EdgeJsValue.GlobalObject; - EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); + try + { + EdgeJsValue globalObj = EdgeJsValue.GlobalObject; + EdgeJsPropertyId variableId = EdgeJsPropertyId.FromString(variableName); - if (globalObj.HasProperty(variableId)) + if (globalObj.HasProperty(variableId)) + { + globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); + } + } + catch (OriginalException e) { - globalObj.SetProperty(variableId, EdgeJsValue.Undefined, true); + throw WrapJsException(e); } } - catch (OriginalException e) - { - throw WrapJsException(e); - } }); } @@ -682,14 +712,17 @@ public override void EmbedHostObject(string itemName, object value) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); - EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); + try + { + EdgeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); + EdgeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -698,14 +731,17 @@ public override void EmbedHostType(string itemName, Type type) { _dispatcher.Invoke(() => { - try + using (new EdgeJsScope(_jsContext)) { - EdgeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); - EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); + try + { + EdgeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); + EdgeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -717,7 +753,7 @@ public override void Interrupt() public override void CollectGarbage() { - _dispatcher.Invoke(_jsRuntime.CollectGarbage); + _jsRuntime.CollectGarbage(); } #endregion @@ -769,7 +805,6 @@ private void DisposeUnmanagedResources() { if (_jsContext.IsValid) { - EdgeJsContext.Current = EdgeJsContext.Invalid; _jsContext.Release(); } _jsRuntime.Dispose(); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs new file mode 100644 index 0000000..13bbea0 --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs @@ -0,0 +1,51 @@ +using System; + +namespace MsieJavaScriptEngine.JsRt.Edge +{ + /// + /// “Edge” scope automatically sets a context to current and resets the original context + /// when disposed + /// + internal struct EdgeJsScope : IDisposable + { + /// + /// The previous context + /// + private readonly EdgeJsContext _previousContext; + + /// + /// Whether the structure has been disposed + /// + private bool _disposed; + + + /// + /// Initializes a new instance of the struct + /// + /// The context to create the scope for + public EdgeJsScope(EdgeJsContext context) + { + _disposed = false; + _previousContext = EdgeJsContext.Current; + EdgeJsContext.Current = context; + } + + #region IDisposable implementation + + /// + /// Disposes the scope and sets the previous context to current + /// + public void Dispose() + { + if (_disposed) + { + return; + } + + EdgeJsContext.Current = _previousContext; + _disposed = true; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index ec20e8e..a199e1e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -3,12 +3,10 @@ using AdvancedStringBuilder; -using MsieJavaScriptEngine.ActiveScript.Debugging; using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; -using MsieJavaScriptEngine.Utilities; using WrapperCompilationException = MsieJavaScriptEngine.JsCompilationException; using WrapperEngineException = MsieJavaScriptEngine.JsEngineException; @@ -82,24 +80,12 @@ public ChakraIeJsRtJsEngine(JsEngineSettings settings) if (_jsContext.IsValid) { _jsContext.AddRef(); - IeJsContext.Current = _jsContext; + if (_settings.EnableDebugging) { - if (Utils.Is64BitProcess()) - { - var processDebugManager64 = (IProcessDebugManager64)new ProcessDebugManager(); - IDebugApplication64 debugApplication64; - processDebugManager64.GetDefaultApplication(out debugApplication64); - - IeJsContext.StartDebugging(debugApplication64); - } - else + using (new IeJsScope(_jsContext)) { - var processDebugManager32 = (IProcessDebugManager32)new ProcessDebugManager(); - IDebugApplication32 debugApplication32; - processDebugManager32.GetDefaultApplication(out debugApplication32); - - IeJsContext.StartDebugging(debugApplication32); + IeJsContext.StartDebugging(); } } } @@ -523,15 +509,18 @@ public override PrecompiledScript Precompile(string code, string documentName) { PrecompiledScript precompiledScript = _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - byte[] cachedBytes = IeJsContext.SerializeScript(code); + try + { + byte[] cachedBytes = IeJsContext.SerializeScript(code); - return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); - } - catch (OriginalException e) - { - throw WrapJsException(e, documentName); + return new PrecompiledScript(_engineModeName, code, cachedBytes, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e, documentName); + } } }); @@ -542,16 +531,19 @@ public override object Evaluate(string expression, string documentName) { object result = _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue resultValue = IeJsContext.RunScript(expression, _jsSourceContext++, - documentName); + try + { + IeJsValue resultValue = IeJsContext.RunScript(expression, _jsSourceContext++, + documentName); - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); + return _typeMapper.MapToHostType(resultValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); @@ -562,13 +554,16 @@ public override void Execute(string code, string documentName) { _dispatcher.Invoke(() => { - try - { - IeJsContext.RunScript(code, _jsSourceContext++, documentName); - } - catch (OriginalException e) + using (new IeJsScope(_jsContext)) { - throw WrapJsException(e); + try + { + IeJsContext.RunScript(code, _jsSourceContext++, documentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -577,18 +572,21 @@ public override void Execute(PrecompiledScript precompiledScript) { _dispatcher.Invoke(() => { - try - { - IeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, - _jsSourceContext++, precompiledScript.DocumentName); - } - catch (OriginalException e) - { - throw WrapJsException(e); - } - finally + using (new IeJsScope(_jsContext)) { - GC.KeepAlive(precompiledScript); + try + { + IeJsContext.RunSerializedScript(precompiledScript.Code, precompiledScript.CachedBytes, + _jsSourceContext++, precompiledScript.DocumentName); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } + finally + { + GC.KeepAlive(precompiledScript); + } } }); } @@ -597,60 +595,63 @@ public override object CallFunction(string functionName, params object[] args) { object result = _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId functionId = IeJsPropertyId.FromString(functionName); - - bool functionExist = globalObj.HasProperty(functionId); - if (!functionExist) + try { - throw new WrapperRuntimeException( - string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), - _engineModeName - ); - } + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId functionId = IeJsPropertyId.FromString(functionName); - IeJsValue resultValue; - IeJsValue functionValue = globalObj.GetProperty(functionId); + bool functionExist = globalObj.HasProperty(functionId); + if (!functionExist) + { + throw new WrapperRuntimeException( + string.Format(CommonStrings.Runtime_FunctionNotExist, functionName), + _engineModeName + ); + } - int argCount = args.Length; - if (argCount > 0) - { - int processedArgCount = argCount + 1; - var processedArgs = new IeJsValue[processedArgCount]; - processedArgs[0] = globalObj; + IeJsValue resultValue; + IeJsValue functionValue = globalObj.GetProperty(functionId); - for (int argIndex = 0; argIndex < argCount; argIndex++) + int argCount = args.Length; + if (argCount > 0) { - IeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); - AddReferenceToValue(processedArg); + int processedArgCount = argCount + 1; + var processedArgs = new IeJsValue[processedArgCount]; + processedArgs[0] = globalObj; - processedArgs[argIndex + 1] = processedArg; - } + for (int argIndex = 0; argIndex < argCount; argIndex++) + { + IeJsValue processedArg = _typeMapper.MapToScriptType(args[argIndex]); + AddReferenceToValue(processedArg); - try - { - resultValue = functionValue.CallFunction(processedArgs); - } - finally - { - for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + processedArgs[argIndex + 1] = processedArg; + } + + try { - RemoveReferenceToValue(processedArgs[argIndex]); + resultValue = functionValue.CallFunction(processedArgs); + } + finally + { + for (int argIndex = 1; argIndex < processedArgCount; argIndex++) + { + RemoveReferenceToValue(processedArgs[argIndex]); + } } } + else + { + resultValue = functionValue.CallFunction(globalObj); + } + + return _typeMapper.MapToHostType(resultValue); } - else + catch (OriginalException e) { - resultValue = functionValue.CallFunction(globalObj); + throw WrapJsException(e); } - - return _typeMapper.MapToHostType(resultValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); } }); @@ -661,23 +662,26 @@ public override bool HasVariable(string variableName) { bool result = _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); - bool variableExist = globalObj.HasProperty(variableId); + try + { + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + bool variableExist = globalObj.HasProperty(variableId); + + if (variableExist) + { + IeJsValue variableValue = globalObj.GetProperty(variableId); + variableExist = variableValue.ValueType != JsValueType.Undefined; + } - if (variableExist) + return variableExist; + } + catch (OriginalException e) { - IeJsValue variableValue = globalObj.GetProperty(variableId); - variableExist = variableValue.ValueType != JsValueType.Undefined; + throw WrapJsException(e); } - - return variableExist; - } - catch (OriginalException e) - { - throw WrapJsException(e); } }); @@ -688,15 +692,18 @@ public override object GetVariableValue(string variableName) { object result = _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableName); + try + { + IeJsValue variableValue = IeJsValue.GlobalObject.GetProperty(variableName); - return _typeMapper.MapToHostType(variableValue); - } - catch (OriginalException e) - { - throw WrapJsException(e); + return _typeMapper.MapToHostType(variableValue); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); @@ -707,24 +714,27 @@ public override void SetVariableValue(string variableName, object value) { _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue inputValue = _typeMapper.MapToScriptType(value); - AddReferenceToValue(inputValue); - try { - IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + IeJsValue inputValue = _typeMapper.MapToScriptType(value); + AddReferenceToValue(inputValue); + + try + { + IeJsValue.GlobalObject.SetProperty(variableName, inputValue, true); + } + finally + { + RemoveReferenceToValue(inputValue); + } } - finally + catch (OriginalException e) { - RemoveReferenceToValue(inputValue); + throw WrapJsException(e); } } - catch (OriginalException e) - { - throw WrapJsException(e); - } }); } @@ -732,20 +742,23 @@ public override void RemoveVariable(string variableName) { _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue globalObj = IeJsValue.GlobalObject; - IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); + try + { + IeJsValue globalObj = IeJsValue.GlobalObject; + IeJsPropertyId variableId = IeJsPropertyId.FromString(variableName); - if (globalObj.HasProperty(variableId)) + if (globalObj.HasProperty(variableId)) + { + globalObj.SetProperty(variableId, IeJsValue.Undefined, true); + } + } + catch (OriginalException e) { - globalObj.SetProperty(variableId, IeJsValue.Undefined, true); + throw WrapJsException(e); } } - catch (OriginalException e) - { - throw WrapJsException(e); - } }); } @@ -753,14 +766,17 @@ public override void EmbedHostObject(string itemName, object value) { _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); - IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); + try + { + IeJsValue processedValue = _typeMapper.GetOrCreateScriptObject(value); + IeJsValue.GlobalObject.SetProperty(itemName, processedValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -769,14 +785,17 @@ public override void EmbedHostType(string itemName, Type type) { _dispatcher.Invoke(() => { - try + using (new IeJsScope(_jsContext)) { - IeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); - IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); - } - catch (OriginalException e) - { - throw WrapJsException(e); + try + { + IeJsValue typeValue = _typeMapper.GetOrCreateScriptType(type); + IeJsValue.GlobalObject.SetProperty(itemName, typeValue, true); + } + catch (OriginalException e) + { + throw WrapJsException(e); + } } }); } @@ -788,7 +807,7 @@ public override void Interrupt() public override void CollectGarbage() { - _dispatcher.Invoke(_jsRuntime.CollectGarbage); + _jsRuntime.CollectGarbage(); } #endregion @@ -840,7 +859,6 @@ private void DisposeUnmanagedResources() { if (_jsContext.IsValid) { - IeJsContext.Current = IeJsContext.Invalid; _jsContext.Release(); } _jsRuntime.Dispose(); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 1dd91cd..0aed8ff 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -333,6 +333,29 @@ public static void StartDebugging(IDebugApplication32 debugApplication) IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication)); } + /// + /// Starts debugging in the context + /// + public static void StartDebugging() + { + if (Utils.Is64BitProcess()) + { + var processDebugManager64 = (IProcessDebugManager64)new ProcessDebugManager(); + IDebugApplication64 debugApplication64; + processDebugManager64.GetDefaultApplication(out debugApplication64); + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication64)); + } + else + { + var processDebugManager32 = (IProcessDebugManager32)new ProcessDebugManager(); + IDebugApplication32 debugApplication32; + processDebugManager32.GetDefaultApplication(out debugApplication32); + + IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsStartDebugging(debugApplication32)); + } + } + /// /// Adds a reference to a script context /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs new file mode 100644 index 0000000..fcc534a --- /dev/null +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs @@ -0,0 +1,51 @@ +using System; + +namespace MsieJavaScriptEngine.JsRt.Ie +{ + /// + /// “IE” scope automatically sets a context to current and resets the original context + /// when disposed + /// + internal struct IeJsScope : IDisposable + { + /// + /// The previous context + /// + private readonly IeJsContext _previousContext; + + /// + /// Whether the structure has been disposed + /// + private bool _disposed; + + + /// + /// Initializes a new instance of the struct + /// + /// The context to create the scope for + public IeJsScope(IeJsContext context) + { + _disposed = false; + _previousContext = IeJsContext.Current; + IeJsContext.Current = context; + } + + #region IDisposable implementation + + /// + /// Disposes the scope and sets the previous context to current + /// + public void Dispose() + { + if (_disposed) + { + return; + } + + IeJsContext.Current = _previousContext; + _disposed = true; + } + + #endregion + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 5e3cdec..1e54b85 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,9 +24,8 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Slightly improved performance; -2. In JsRT modes the `CollectGarbage` method is called synchronously again; -3. Enabled a SourceLink in NuGet package. + 1. Fixed a error that caused a crash during finalization; +2. In JsRT modes during calling of the `CollectGarbage` method is again not performed blocking. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 52d53da..7fe8712 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,9 +21,9 @@ ============= RELEASE NOTES ============= - 1. Slightly improved performance; - 2. In JsRT modes the `CollectGarbage` method is called synchronously again; - 3. Enabled a SourceLink in NuGet package. + 1. Fixed a error that caused a crash during finalization; + 2. In JsRT modes during calling of the `CollectGarbage` method is again not + performed blocking. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index ea8777b..71485fc 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -12,6 +12,17 @@ namespace MsieJavaScriptEngine.Test.Common [TestFixture] public abstract class CommonTestsBase : FileSystemTestsBase { + #region Creation of engines + + [Test] + public virtual void CreationOfEngineWithoutDisposingIsCorrect() + { + MsieJsEngine jsEngine = CreateJsEngine(); + jsEngine.Execute("var a = 1 + 1;"); + } + + #endregion + #region Evaluation of scripts [Test] From d6ff483a424a317a543cd302c877c99b8340519e Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 21 Oct 2019 20:04:26 +0300 Subject: [PATCH 187/238] Version 3.0.5 --- CHANGELOG.md | 4 ++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 13 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e420bc..fd35914 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## v3.0.5 - October 21, 2019 + * Fixed a error that caused a crash during finalization + * In JsRT modes during calling of the `CollectGarbage` method is again not performed blocking + ## v3.0.4 - October 9, 2019 * Slightly improved performance * In JsRT modes the `CollectGarbage` method is called synchronously again diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 1e54b85..1e21e51 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.4 + 3.0.5 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 7fe8712..b71aab5 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.4 + README file for MSIE JavaScript Engine for .NET v3.0.5 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index fd390f5..9256dcc 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.4 + 3.0.5 net461;netcoreapp2.1;netcoreapp3.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 151f9f5..720e5bc 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.4 + 3.0.5 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index a5efb7d..1ea4846 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.4 + 3.0.5 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 4571cd9..9a9afc3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.4 + 3.0.5 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 4542640..c6072b7 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.4 + 3.0.5 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 9e3be05..8306746 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.4 + 3.0.5 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c8fb940..f76d221 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.4 + 3.0.5 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library From 3930d87b2407bbbc6d04d0976f3b2440b01d1dc4 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 16 Dec 2019 19:38:45 +0300 Subject: [PATCH 188/238] Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` class --- global.json | 2 +- .../Helpers/ReflectionHelpers.cs | 17 ++++++++++- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 5 ++-- .../Interop/FileManager.cs | 10 ++++++- .../Interop/Person.cs | 11 +++++++ .../Interop/Product.cs | 1 + .../InteropTestsBase.cs | 29 ++++++++++++++----- 8 files changed, 63 insertions(+), 15 deletions(-) diff --git a/global.json b/global.json index 8061d05..ca8af83 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.0.100" + "version": "3.0.101" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index c8994c1..d5b89d8 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -70,6 +70,11 @@ public static MethodInfo[] GetFullyFledgedMethods(MethodInfo[] methods) public static void FixFieldValueType(ref object value, FieldInfo field) { + if (value == null) + { + return; + } + Type valueType = value.GetType(); Type fieldType = field.FieldType; @@ -86,6 +91,11 @@ public static void FixFieldValueType(ref object value, FieldInfo field) public static void FixPropertyValueType(ref object value, PropertyInfo property) { + if (value == null) + { + return; + } + Type valueType = value.GetType(); Type propertyType = property.PropertyType; @@ -107,6 +117,11 @@ public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] para for (int argIndex = 0; argIndex < argCount; argIndex++) { object argValue = argValues[argIndex]; + if (argValue == null) + { + continue; + } + Type argType = argValue.GetType(); ParameterInfo parameter = parameters[argIndex]; @@ -149,7 +164,7 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu } Type[] argTypes = argValues - .Select(a => a.GetType()) + .Select(a => a != null ? a.GetType() : typeof(object)) .ToArray() ; var compatibleMethods = new List(); diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 1e21e51..6905be5 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,8 +24,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Fixed a error that caused a crash during finalization; -2. In JsRT modes during calling of the `CollectGarbage` method is again not performed blocking. + Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` class. Special thanks to Vanjoge. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index b71aab5..cac393a 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,9 +21,8 @@ ============= RELEASE NOTES ============= - 1. Fixed a error that caused a crash during finalization; - 2. In JsRT modes during calling of the `CollectGarbage` method is again not - performed blocking. + Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` + class. Special thanks to Vanjoge. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs index 9f4a63b..a2796b9 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs @@ -1,18 +1,26 @@ using System; using System.IO; +using System.Text; namespace MsieJavaScriptEngine.Test.Common.Interop { public sealed class FileManager { public string ReadFile(string path) + { + return ReadFile(path, null); + } + + public string ReadFile(string path, Encoding encoding) { if (path == null) { throw new ArgumentNullException("path"); } - string content = File.ReadAllText(path); + encoding = encoding ?? Encoding.UTF8; + + string content = File.ReadAllText(path, encoding); return content; } diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs index c5d3862..761673a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Person.cs @@ -14,15 +14,26 @@ public string LastName set; } + public string Patronymic + { + get; + set; + } + public Person() : this(string.Empty, string.Empty) { } public Person(string firstName, string lastName) + : this(firstName, lastName, string.Empty) + { } + + public Person(string firstName, string lastName, string patronymic) { FirstName = firstName; LastName = lastName; + Patronymic = patronymic; } diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs index e86e463..b9c96b4 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Product.cs @@ -3,6 +3,7 @@ public sealed class Product { public string Name; + public string Description; public double Price; } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 4dc1a6e..a37d648 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -69,20 +69,26 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFieldsIsCorrect( var product = new Product { Name = "Red T-shirt", + Description = string.Empty, Price = 995.00 }; - const string updateCode = "product.Price *= 1.15;"; + const string updateCode = @"product.Description = null; +product.Price *= 1.15;"; const string input1 = "product.Name"; const string targetOutput1 = "Red T-shirt"; - const string input2 = "product.Price"; - const double targetOutput2 = 1144.25; + const string input2 = "product.Description"; + const string targetOutput2 = null; + + const string input3 = "product.Price"; + const double targetOutput3 = 1144.25; // Act string output1; - double output2; + string output2; + double output3; using (var jsEngine = CreateJsEngine()) { @@ -90,12 +96,14 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFieldsIsCorrect( jsEngine.Execute(updateCode); output1 = jsEngine.Evaluate(input1); - output2 = jsEngine.Evaluate(input2); + output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); } // Assert Assert.AreEqual(targetOutput1, output1); Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); } #endregion @@ -218,7 +226,8 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorr { // Arrange var person = new Person("Vanya", "Ivanov"); - const string updateCode = "person.LastName = person.LastName.substr(0, 5) + 'ff';"; + const string updateCode = @"person.LastName = person.LastName.substr(0, 5) + 'ff'; +person.Patronymic = null;"; const string input1 = "person.FirstName"; const string targetOutput1 = "Vanya"; @@ -226,9 +235,13 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorr const string input2 = "person.LastName"; const string targetOutput2 = "Ivanoff"; + const string input3 = "person.Patronymic"; + const string targetOutput3 = null; + // Act string output1; string output2; + string output3; using (var jsEngine = CreateJsEngine()) { @@ -237,11 +250,13 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorr output1 = jsEngine.Evaluate(input1); output2 = jsEngine.Evaluate(input2); + output3 = jsEngine.Evaluate(input3); } // Assert Assert.AreEqual(targetOutput1, output1); Assert.AreEqual(targetOutput2, output2); + Assert.AreEqual(targetOutput3, output3); } [Test] @@ -405,7 +420,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect( var fileManager = new FileManager(); string filePath = GetAbsolutePath("SharedFiles/link.txt"); - string input = string.Format("fileManager.ReadFile('{0}')", filePath.Replace(@"\", @"\\")); + string input = string.Format("fileManager.ReadFile('{0}', null)", filePath.Replace(@"\", @"\\")); const string targetOutput = "http://www.panopticoncentral.net/2015/09/09/the-two-faces-of-jsrt-in-windows-10/"; // Act From df4d3e5fada5f3e684bef3cf98fb23d89da96976 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 16 Dec 2019 21:37:19 +0300 Subject: [PATCH 189/238] Version 3.0.6 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 4 ++-- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 14 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd35914..25d47b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.6 - December 16, 2019 + * Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` class. Special thanks to [Vanjoge](https://github.com/vanjoge). + ## v3.0.5 - October 21, 2019 * Fixed a error that caused a crash during finalization * In JsRT modes during calling of the `CollectGarbage` method is again not performed blocking diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 6905be5..c672e5c 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.5 + 3.0.6 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 @@ -39,7 +39,7 @@ - + diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index cac393a..653b378 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.5 + README file for MSIE JavaScript Engine for .NET v3.0.6 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 9256dcc..6b3ce8c 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.5 + 3.0.6 net461;netcoreapp2.1;netcoreapp3.0 Exe true @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 720e5bc..b5fc85a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.5 + 3.0.6 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 1ea4846..996b824 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.5 + 3.0.6 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 9a9afc3..3664afc 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.5 + 3.0.6 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index c6072b7..0aa47c5 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.5 + 3.0.6 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 8306746..74a6d0a 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.5 + 3.0.6 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f76d221..720ac68 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.5 + 3.0.6 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 1.0.16 Library From d389143742d609240c80a1ccc510c7fd2680dccd Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 6 Mar 2020 18:44:40 +0300 Subject: [PATCH 190/238] In tests the .NET Core App 3.0 target was updated to version 3.1 --- build/common.props | 2 +- global.json | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/build/common.props b/build/common.props index 83ed444..bd21b41 100644 --- a/build/common.props +++ b/build/common.props @@ -11,7 +11,7 @@ $(DefineConstants);NETSTANDARD - + $(DefineConstants);NETCOREAPP \ No newline at end of file diff --git a/global.json b/global.json index ca8af83..7031543 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.0.101" + "version": "3.1.101" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 6b3ce8c..8f3c1ac 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.6 - net461;netcoreapp2.1;netcoreapp3.0 + net461;netcoreapp2.1;netcoreapp3.1 Exe true false diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index b5fc85a..98be45f 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.6 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 3664afc..65b4581 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.6 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 0aa47c5..4d209ba 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.6 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 720ac68..1618dd9 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.6 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.0 + net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library true From 99b6cb77131d3e8ee3ecb7124856dc8380472914 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sat, 7 Mar 2020 22:18:58 +0300 Subject: [PATCH 191/238] =?UTF-8?q?Fixed=20a=20error=20=E2=80=9CProgram=20?= =?UTF-8?q?crash=20after=20function=20call=20with=20too=20much=20parameter?= =?UTF-8?q?s=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Helpers/ReflectionHelpers.cs | 6 ++ src/MsieJavaScriptEngine/HostObject.cs | 46 +++++++++++---- .../JsRt/Edge/EdgeTypeMapper.cs | 49 ++++++++++------ .../JsRt/Ie/IeTypeMapper.cs | 49 ++++++++++------ src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 56 +++++++++++-------- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 +- .../InteropTestsBase.cs | 50 +++++++++++++++++ 8 files changed, 186 insertions(+), 75 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index d5b89d8..344af4e 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -113,9 +113,15 @@ public static void FixPropertyValueType(ref object value, PropertyInfo property) public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] parameters) { int argCount = argValues.Length; + int parameterCount = parameters.Length; for (int argIndex = 0; argIndex < argCount; argIndex++) { + if (argIndex >= parameterCount) + { + break; + } + object argValue = argValues[argIndex]; if (argValue == null) { diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 6fd5512..e3a5794 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -28,13 +28,10 @@ internal sealed class HostObject : HostItemBase public HostObject(object target, JsEngineMode engineMode) : base(target.GetType(), target, engineMode, true) { - if (_engineMode == JsEngineMode.Classic) + var del = _target as Delegate; + if (del != null) { - var del = _target as Delegate; - if (del != null) - { - _delegateParameterCount = del.Method.GetParameters().Length; - } + _delegateParameterCount = del.Method.GetParameters().Length; } } @@ -50,15 +47,40 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr if (name == SpecialMemberName.Default && processedTarget is Delegate) { var del = (Delegate)processedTarget; - object[] processedArgs = args; + int argCount = args.Length; + int skippedArgCount = 0; + int parameterCount = _delegateParameterCount; + + if (_engineMode == JsEngineMode.Classic && argCount > 0 + && (argCount - parameterCount) > 0) + { + skippedArgCount = 1; + } + + int processedArgCount = argCount; + if (processedArgCount >= skippedArgCount) + { + processedArgCount -= skippedArgCount; + } + if (processedArgCount > parameterCount) + { + processedArgCount = parameterCount; + } - if (_engineMode == JsEngineMode.Classic - && processedArgs.Length > 0 - && (processedArgs.Length - _delegateParameterCount) == 1) + object[] processedArgs; + if (processedArgCount > 0) + { + processedArgs = args + .Skip(skippedArgCount) + .Take(processedArgCount) + .Select(TypeMappingHelpers.MapToHostType) + .ToArray() + ; + } + else { - processedArgs = processedArgs.Skip(1).ToArray(); + processedArgs = new object[0]; } - processedArgs = TypeMappingHelpers.MapToHostType(processedArgs); result = del.DynamicInvoke(processedArgs); } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index f9e22ce..6d28538 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -217,9 +217,9 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) { EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { - object[] processedArgs = GetHostItemMemberArguments(args); MethodInfo method = del.GetMethodInfo(); ParameterInfo[] parameters = method.GetParameters(); + object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length); ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); @@ -231,6 +231,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) } catch (Exception e) { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; EdgeJsValue errorValue = wrapperException != null ? @@ -241,7 +242,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) ; EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } EdgeJsValue resultValue = MapToScriptType(result); @@ -283,10 +284,12 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) return resultValue; } + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (constructors.Length == 0) { CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - return EdgeJsValue.Undefined; + return undefinedValue; } var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( @@ -295,7 +298,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) { CreateAndSetReferenceError(string.Format( NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - return EdgeJsValue.Undefined; + return undefinedValue; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); @@ -316,7 +319,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) ; EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } resultValue = MapToScriptType(result); @@ -364,11 +367,13 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return EdgeJsValue.Undefined; + return undefinedValue; } object result; @@ -400,7 +405,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) } EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } EdgeJsValue resultValue = MapToScriptType(result); @@ -414,11 +419,13 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return EdgeJsValue.Undefined; + return undefinedValue; } object value = MapToHostType(args[1]); @@ -451,10 +458,10 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) } EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } - return EdgeJsValue.Undefined; + return undefinedValue; }; nativeFunctions.Add(nativeSetFunction); @@ -488,11 +495,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) { EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - return EdgeJsValue.Undefined; + return undefinedValue; } object result; @@ -524,7 +533,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) } EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } EdgeJsValue resultValue = MapToScriptType(result); @@ -541,11 +550,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) { EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - return EdgeJsValue.Undefined; + return undefinedValue; } object value = MapToHostType(args[1]); @@ -578,10 +589,10 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) } EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } - return EdgeJsValue.Undefined; + return undefinedValue; }; nativeFunctions.Add(nativeSetFunction); @@ -614,11 +625,13 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - return EdgeJsValue.Undefined; + return undefinedValue; } object[] processedArgs = GetHostItemMemberArguments(args); @@ -629,7 +642,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) { CreateAndSetReferenceError(string.Format( NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - return EdgeJsValue.Undefined; + return undefinedValue; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); @@ -663,7 +676,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) } EdgeJsContext.SetException(errorValue); - return EdgeJsValue.Undefined; + return undefinedValue; } EdgeJsValue resultValue = MapToScriptType(result); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index ccf5ebc..00256a0 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -212,9 +212,9 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) { IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { - object[] processedArgs = GetHostItemMemberArguments(args); MethodInfo method = del.GetMethodInfo(); ParameterInfo[] parameters = method.GetParameters(); + object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length); ReflectionHelpers.FixArgumentTypes(ref processedArgs, parameters); @@ -226,6 +226,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) } catch (Exception e) { + IeJsValue undefinedValue = IeJsValue.Undefined; Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; IeJsValue errorValue = wrapperException != null ? @@ -236,7 +237,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) ; IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } IeJsValue resultValue = MapToScriptType(result); @@ -278,10 +279,12 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) return resultValue; } + IeJsValue undefinedValue = IeJsValue.Undefined; + if (constructors.Length == 0) { CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); - return IeJsValue.Undefined; + return undefinedValue; } var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( @@ -290,7 +293,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) { CreateAndSetReferenceError(string.Format( NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); - return IeJsValue.Undefined; + return undefinedValue; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitConstructor.GetParameters()); @@ -311,7 +314,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) ; IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } resultValue = MapToScriptType(result); @@ -359,11 +362,13 @@ private void ProjectFields(IeEmbeddedItem externalItem) IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + IeJsValue undefinedValue = IeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return IeJsValue.Undefined; + return undefinedValue; } object result; @@ -395,7 +400,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) } IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } IeJsValue resultValue = MapToScriptType(result); @@ -409,11 +414,13 @@ private void ProjectFields(IeEmbeddedItem externalItem) IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + IeJsValue undefinedValue = IeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return IeJsValue.Undefined; + return undefinedValue; } object value = MapToHostType(args[1]); @@ -446,10 +453,10 @@ private void ProjectFields(IeEmbeddedItem externalItem) } IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } - return IeJsValue.Undefined; + return undefinedValue; }; nativeFunctions.Add(nativeSetFunction); @@ -483,11 +490,13 @@ private void ProjectProperties(IeEmbeddedItem externalItem) { IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + IeJsValue undefinedValue = IeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - return IeJsValue.Undefined; + return undefinedValue; } object result; @@ -519,7 +528,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) } IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } IeJsValue resultValue = MapToScriptType(result); @@ -536,11 +545,13 @@ private void ProjectProperties(IeEmbeddedItem externalItem) { IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { + IeJsValue undefinedValue = IeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); - return IeJsValue.Undefined; + return undefinedValue; } object value = MapToHostType(args[1]); @@ -573,10 +584,10 @@ private void ProjectProperties(IeEmbeddedItem externalItem) } IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } - return IeJsValue.Undefined; + return undefinedValue; }; nativeFunctions.Add(nativeSetFunction); @@ -609,11 +620,13 @@ private void ProjectMethods(IeEmbeddedItem externalItem) IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { + IeJsValue undefinedValue = IeJsValue.Undefined; + if (instance && obj == null) { CreateAndSetTypeError(string.Format( NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); - return IeJsValue.Undefined; + return undefinedValue; } object[] processedArgs = GetHostItemMemberArguments(args); @@ -624,7 +637,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) { CreateAndSetReferenceError(string.Format( NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); - return IeJsValue.Undefined; + return undefinedValue; } ReflectionHelpers.FixArgumentTypes(ref processedArgs, bestFitMethod.GetParameters()); @@ -658,7 +671,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) } IeJsContext.SetException(errorValue); - return IeJsValue.Undefined; + return undefinedValue; } IeJsValue resultValue = MapToScriptType(result); diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 8d5c25a..eb7b737 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -171,32 +171,12 @@ public virtual TValue GetOrCreateScriptType(Type type) /// The mapped value public abstract TValue MapToScriptType(object value); - /// - /// Makes a mapping of array items from the host type to a script type - /// - /// The source array - /// The mapped array - public virtual TValue[] MapToScriptType(object[] args) - { - return args.Select(MapToScriptType).ToArray(); - } - /// /// Makes a mapping of value from the script type to a host type /// /// The source value /// The mapped value public abstract object MapToHostType(TValue value); - - /// - /// Makes a mapping of array items from the script type to a host type - /// - /// The source array - /// The mapped array - public virtual object[] MapToHostType(TValue[] args) - { - return args.Select(MapToHostType).ToArray(); - } #if NETSTANDARD protected abstract EmbeddedObject CreateEmbeddedObjectOrFunction(object obj); @@ -253,11 +233,39 @@ private void EmbeddedTypeFinalizeCallback(IntPtr ptr) embeddedTypeHandle.Free(); } - [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] - protected object[] GetHostItemMemberArguments(TValue[] args) + protected object[] GetHostItemMemberArguments(TValue[] args, int maxArgCount = -1) { - object[] processedArgs = args.Length > 1 ? - MapToHostType(args.Skip(1).ToArray()) : new object[0]; + if (args == null) + { + throw new ArgumentNullException(nameof(args)); + } + + int argCount = args.Length; + const int skippedArgCount = 1; + int processedArgCount = argCount; + if (processedArgCount >= skippedArgCount) + { + processedArgCount -= skippedArgCount; + } + if (maxArgCount >= 0 && processedArgCount > maxArgCount) + { + processedArgCount = maxArgCount; + } + + object[] processedArgs; + if (processedArgCount > 0) + { + processedArgs = args + .Skip(skippedArgCount) + .Take(processedArgCount) + .Select(MapToHostType) + .ToArray() + ; + } + else + { + processedArgs = new object[0]; + } return processedArgs; } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index c672e5c..52d3ec0 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` class. Special thanks to Vanjoge. + Fixed a error “Program crash after function call with too much parameters”. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 653b378..1dc49e6 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` - class. Special thanks to Vanjoge. + Fixed a error “Program crash after function call with too much parameters”. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index a37d648..d708214 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -601,6 +601,56 @@ public virtual void EmbeddingOfInstanceOfDelegateWithoutResultIsCorrect() Assert.AreEqual(targetLogOutput, logOutput); } + [Test] + public virtual void CallingOfEmbeddedDelegateWithMissingParameter() + { + // Arrange + var sumFunc = new Func((a, b) => a + b); + + const string input = "sum(678)"; + JsRuntimeException exception = null; + + // Act + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("sum", sumFunc); + + try + { + int result = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + } + + [Test] + public virtual void CallingOfEmbeddedDelegateWithExtraParameter() + { + // Arrange + var sumFunc = new Func((a, b) => a + b); + + const string input = "sum(678, 711, 611)"; + const int targetOutput = 1389; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("sum", sumFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + #endregion #region Integration From ef2f86a293a43e9482b3ff6fc9b7b722b03c2f01 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Mar 2020 12:51:29 +0300 Subject: [PATCH 192/238] Edge -> Edge Legacy --- README.md | 8 ++++---- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- .../Resources/CommonStrings.Designer.cs | 2 +- src/MsieJavaScriptEngine/Resources/CommonStrings.resx | 2 +- .../Resources/CommonStrings.ru-ru.resx | 2 +- src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx | 2 +- .../Resources/NetCoreStrings.ru-ru.resx | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 ++-- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index c92e4aa..b9a8c9b 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,16 @@ MSIE JavaScript Engine for .NET [![NuGet version](http://img.shields.io/nuget/v/ ![MSIE JS Engine Logo](http://i.imgur.com/T3K5q.png) -This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). +This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee), [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) and [jsrt-dotnet](http://github.com/robpaveza/jsrt-dotnet). -MSIE JavaScript Engine requires a installation of Internet Explorer or Edge on the machine and can work in 5 modes, that are defined in the JsEngineMode enumeration: +MSIE JavaScript Engine requires a installation of Internet Explorer or Edge Legacy on the machine and can work in 5 modes, that are defined in the JsEngineMode enumeration: * `Auto`. Automatically selects the most modern JavaScript engine from available on the machine. * `Classic`. Classic MSIE JavaScript engine (supports ECMAScript 3 with possibility of using the ECMAScript 5 Polyfill and the JSON2 library). Requires Internet Explorer 6 or higher on the machine. **Not supported in version for .NET Core.** * `ChakraActiveScript`. ActiveScript version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 9 or higher on the machine. **Not supported in version for .NET Core.** - * `ChakraIeJsRt`. “IE” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or Microsoft Edge on the machine. - * `ChakraEdgeJsRt`. “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Microsoft Edge on the machine. + * `ChakraIeJsRt`. “IE” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Internet Explorer 11 or Microsoft Edge Legacy on the machine. + * `ChakraEdgeJsRt`. “Edge” JsRT version of Chakra JavaScript engine (supports ECMAScript 5). Requires Microsoft Edge Legacy on the machine. The supported .NET types are as follows: diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 52d3ec0..0f5f80a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -13,7 +13,7 @@ true $(Product) Andrey Taritsyn - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). LICENSE.txt false https://github.com/Taritsyn/MsieJavaScriptEngine diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index a0e8c7c..2a1e873 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -122,7 +122,7 @@ internal static string Engine_AssemblyNotRegistered } /// - /// Looks up a localized string similar to "Try to install the Windows 10 with Edge browser." + /// Looks up a localized string similar to "Try to install the Windows 10 with Edge Legacy browser." /// internal static string Engine_EdgeInstallationRequired { diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index ff836f7..4abc615 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -142,7 +142,7 @@ Most likely it happened, because the '{0}' assembly was not registered in your system. - Try to install the Windows 10 with Edge browser. + Try to install the Windows 10 with Edge Legacy browser. Try to install the Internet Explorer {0} or higher. diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx index 19421e4..6e709db 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx @@ -142,7 +142,7 @@ Скорее всего, это произошло, потому что сборка "{0}" не была зарегистрирована в вашей системе. - Попробуйте установить Windows 10 с веб-браузером Edge. + Попробуйте установить Windows 10 с веб-браузером Edge Legacy. Попробуйте установить Internet Explorer {0} или выше. diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx index 6b88f7b..532bf65 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx @@ -121,7 +121,7 @@ The parameter '{0}' must have a `{1}` type. - Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge or Internet Explorer 11 browser. + Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge Legacy or Internet Explorer 11 browser. During invocation of the host delegate an error has occurred - “{0}”. diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx index a7d1b9c..4b06f90 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx @@ -121,7 +121,7 @@ Параметр с именем "{0}" должен иметь тип `{1}`! - Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge или Internet Explorer 11. + Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge Legacy или Internet Explorer 11. Во время вызова делегата хоста произошла ошибка - «{0}»! diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 1dc49e6..366b3ea 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -12,8 +12,8 @@ DESCRIPTION =========== This library is a .NET wrapper for working with the JavaScript engines of - Internet Explorer and Edge (JsRT versions of Chakra, ActiveScript version of - Chakra and Classic JavaScript Engine). Project was based on the code of + Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version + of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). From e801791a7d7c120619ac4875309ea6efce662ef6 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Mar 2020 13:26:32 +0300 Subject: [PATCH 193/238] Version 3.0.7 --- CHANGELOG.md | 3 +++ LICENSE.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/HostObject.cs | 6 +----- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 6 +----- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 14 files changed, 17 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25d47b0..15c92cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.7 - March 8, 2020 + * Fixed a error “Program crash after function call with too much parameters” + ## v3.0.6 - December 16, 2019 * Fixed a errors leading to null reference exceptions in the `ReflectionHelpers` class. Special thanks to [Vanjoge](https://github.com/vanjoge). diff --git a/LICENSE.txt b/LICENSE.txt index ec5a787..a4ebd14 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2019 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2020 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index bd21b41..d856f2a 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - Copyright © 2012-2019 Andrey Taritsyn + Copyright © 2012-2020 Andrey Taritsyn diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index e3a5794..405f0ad 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -57,11 +57,7 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr skippedArgCount = 1; } - int processedArgCount = argCount; - if (processedArgCount >= skippedArgCount) - { - processedArgCount -= skippedArgCount; - } + int processedArgCount = argCount >= skippedArgCount ? argCount - skippedArgCount : 0; if (processedArgCount > parameterCount) { processedArgCount = parameterCount; diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index eb7b737..4297893 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -242,11 +242,7 @@ protected object[] GetHostItemMemberArguments(TValue[] args, int maxArgCount = - int argCount = args.Length; const int skippedArgCount = 1; - int processedArgCount = argCount; - if (processedArgCount >= skippedArgCount) - { - processedArgCount -= skippedArgCount; - } + int processedArgCount = argCount >= skippedArgCount ? argCount - skippedArgCount : 0; if (maxArgCount >= 0 && processedArgCount > maxArgCount) { processedArgCount = maxArgCount; diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 0f5f80a..d86afd8 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.6 + 3.0.7 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 366b3ea..f283212 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.6 + README file for MSIE JavaScript Engine for .NET v3.0.7 -------------------------------------------------------------------------------- - Copyright (c) 2012-2019 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2020 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 8f3c1ac..737550e 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.6 + 3.0.7 net461;netcoreapp2.1;netcoreapp3.1 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 98be45f..3097fec 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.6 + 3.0.7 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 996b824..9d3949e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.6 + 3.0.7 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 65b4581..15bd8e3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.6 + 3.0.7 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 4d209ba..f9a0d9c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.6 + 3.0.7 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 74a6d0a..4f2026f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.6 + 3.0.7 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 1618dd9..c0989f1 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.6 + 3.0.7 net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 1.0.16 Library From b1ae6c93e0efdf870ebc325ea8de4006ef1ddc96 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Aug 2021 11:59:44 +0300 Subject: [PATCH 194/238] From test projects removed a .NET Core App 1.0 target --- global.json | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 3 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 3 +- .../PrecompilationTests.cs | 2 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 3 +- .../PrecompilationTests.cs | 2 +- .../FileSystemTestsBase.cs | 9 - .../Interop/Drawing/Color.cs | 387 ------------------ .../Interop/Drawing/KnownColor.cs | 12 - .../Interop/Drawing/KnownColorTable.cs | 27 -- .../Interop/Drawing/Point.cs | 79 ---- .../InteropTestsBase.cs | 5 - .../MsieJavaScriptEngine.Test.Common.csproj | 9 +- 13 files changed, 8 insertions(+), 535 deletions(-) delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs delete mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs diff --git a/global.json b/global.json index 7031543..8c83c01 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.1.101" + "version": "3.1.411" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 3097fec..c59833b 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,8 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.7 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 - 1.0.16 + net40;net451;netcoreapp2.1;netcoreapp3.1 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 15bd8e3..dd62bab 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,8 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.7 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 - 1.0.16 + net40;net451;netcoreapp2.1;netcoreapp3.1 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs index 94a1c6d..4d40573 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs @@ -127,7 +127,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() charIndex ; - for (charIndex = 0; charIndex < length; charIndex++) + for (charIndex = 0; charIndex < length; charIndex++) result += possible.charAt(Math.floor(Math.random() * possible.length)); } diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index f9a0d9c..77cb726 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,8 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.7 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 - 1.0.16 + net40;net451;netcoreapp2.1;netcoreapp3.1 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs index 53eda79..5b9cdc4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs @@ -126,7 +126,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() charIndex ; - for (charIndex = 0; charIndex < length; charIndex++) + for (charIndex = 0; charIndex < length; charIndex++) result += possible.charAt(Math.floor(Math.random() * possible.length)); } diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index bb8bfa6..cd82ffe 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -1,9 +1,5 @@ using System; using System.IO; -#if NETCOREAPP1_0 - -using Microsoft.Extensions.PlatformAbstractions; -#endif namespace MsieJavaScriptEngine.Test.Common { @@ -14,12 +10,7 @@ public abstract class FileSystemTestsBase : TestsBase protected FileSystemTestsBase() { -#if NETCOREAPP1_0 - var appEnv = PlatformServices.Default.Application; - string appDirectoryPath = appEnv.ApplicationBasePath; -#else string appDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; -#endif _baseDirectoryPath = Path.Combine(appDirectoryPath, "../../../../"); } diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs deleted file mode 100644 index ecf6dc1..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Color.cs +++ /dev/null @@ -1,387 +0,0 @@ -#if NETCOREAPP1_0 -using System; -using System.Text; - -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing -{ - /// - /// Represents an ARGB (alpha, red, green, blue) color - /// - public struct Color - { - private readonly string _name; - private readonly long _value; - private readonly short _knownColor; - private readonly short _state; - - private static short StateKnownColorValid = 1; - private static short StateARGBValueValid = 2; - private static short StateValueMask = StateARGBValueValid; - private static short StateNameValid = 8; - private static long NotDefinedValue = 0L; - public static readonly Color Empty = new Color(); - - /// - /// Gets a value indicating whether this structure is a predefined color. - /// Predefined colors are represented by the elements of the enumeration. - /// - /// true if this was created from a predefined color by using either - /// the FromName method or the FromKnownColor method; otherwise, false. - public bool IsKnownColor - { - get - { - return ((uint)_state & (uint)StateKnownColorValid) > 0U; - } - } - - /// - /// Gets a name of this - /// - /// The name of this - public string Name - { - get - { - if ((_state & StateNameValid) != 0) - { - return _name; - } - - if (IsKnownColor) - { - var knownColor = (KnownColor)_knownColor; - return KnownColorTable.KnownColorToName(knownColor) ?? knownColor.ToString(); - } - - return Convert.ToString(_value, 16); - } - } - - private long Value - { - get - { - if ((_state & StateValueMask) != 0) - { - return _value; - } - - if (IsKnownColor) - { - var knownColor = (KnownColor)_knownColor; - return KnownColorTable.KnownColorToArgb(knownColor); - } - - return NotDefinedValue; - } - } - - /// - /// Gets a system-defined color that has an ARGB value of #FFFF4500 - /// - /// A representing a system-defined color - public static Color OrangeRed - { - get - { - return new Color(KnownColor.OrangeRed); - } - } - - /// - /// Gets a red component value of this structure - /// - /// The red component value of this - public byte R - { - get - { - return (byte)((ulong)(Value >> 16) & byte.MaxValue); - } - } - - /// - /// Gets a green component value of this structure - /// - /// The green component value of this - public byte G - { - get - { - return (byte)((ulong)(Value >> 8) & byte.MaxValue); - } - } - - /// - /// Gets a blue component value of this structure - /// - /// The blue component value of this - public byte B - { - get - { - return (byte)((ulong)Value & byte.MaxValue); - } - } - - /// - /// Gets a alpha component value of this structure - /// - /// The alpha component value of this - public byte A - { - get - { - return (byte)((ulong)(Value >> 24) & byte.MaxValue); - } - } - - - internal Color(KnownColor knownColor) - { - _value = 0L; - _state = StateKnownColorValid; - _name = null; - _knownColor = (short)knownColor; - } - - private Color(long value, short state, string name, KnownColor knownColor) - { - _value = value; - _state = state; - _name = name; - _knownColor = (short)knownColor; - } - - - private static void CheckByte(int value, string name) - { - if (value < 0 || value > byte.MaxValue) - { - throw new ArgumentException(string.Format( - "Value of '{1}' is not valid for '{0}'. '{0}' should be greater than or equal to {2} and less than or equal to {3}.", - name, value, 0, (int)byte.MaxValue - )); - } - } - - private static long MakeArgb(byte alpha, byte red, byte green, byte blue) - { - return (uint)(red << 16 | green << 8 | blue | alpha << 24) & (long)uint.MaxValue; - } - - /// - /// Creates a structure from the specified 8-bit color values (red, green, and blue). - /// The alpha value is implicitly 255 (fully opaque). - /// Although this method allows a 32-bit value to be passed for each color component, the value - /// of each component is limited to 8 bits. - /// - /// The red component value for the new . - /// Valid values are 0 through 255. - /// The green component value for the new . - /// Valid values are 0 through 255. - /// The blue component value for the new . - /// Valid values are 0 through 255. - /// The that this method creates - /// , , or - /// is less than 0 or greater than 255. - public static Color FromArgb(int red, int green, int blue) - { - return FromArgb(byte.MaxValue, red, green, blue); - } - - /// - /// Creates a structure from the four ARGB component (alpha, red, green, and blue) values. - /// Although this method allows a 32-bit value to be passed for each component, the value of - /// each component is limited to 8 bits. - /// - /// The alpha component. Valid values are 0 through 255. - /// The red component. Valid values are 0 through 255. - /// The green component. Valid values are 0 through 255. - /// The blue component. Valid values are 0 through 255. - /// The that this method creates - /// , , - /// , or is less than 0 or greater than 255. - public static Color FromArgb(int alpha, int red, int green, int blue) - { - CheckByte(alpha, "alpha"); - CheckByte(red, "red"); - CheckByte(green, "green"); - CheckByte(blue, "blue"); - - return new Color(MakeArgb((byte)alpha, (byte)red, (byte)green, (byte)blue), - StateARGBValueValid, null, 0); - } - - /// - /// Gets a hue-saturation-brightness (HSB) brightness value for this structure - /// - /// The brightness of this . - /// The brightness ranges from 0.0 through 1.0, where 0.0 represents black and 1.0 represents white. - public float GetBrightness() - { - double num1 = R / (double)byte.MaxValue; - float num2 = G / (float)byte.MaxValue; - float num3 = B / (float)byte.MaxValue; - float num4 = (float)num1; - float num5 = (float)num1; - if (num2 > num4) - { - num4 = num2; - } - if (num3 > num4) - { - num4 = num3; - } - if (num2 < num5) - { - num5 = num2; - } - if (num3 < num5) - { - num5 = num3; - } - - return (float)((num4 + num5) / 2.0); - } - - /// - /// Gets a hue-saturation-brightness (HSB) hue value, in degrees, for this structure - /// - /// The hue, in degrees, of this . - /// The hue is measured in degrees, ranging from 0.0 through 360.0, in HSB color space. - public float GetHue() - { - if (R == G && G == B) - { - return 0.0f; - } - float num1 = R / (float)byte.MaxValue; - float num2 = G / (float)byte.MaxValue; - float num3 = B / (float)byte.MaxValue; - float num4 = 0.0f; - float num5 = num1; - float num6 = num1; - if (num2 > num5) - { - num5 = num2; - } - if (num3 > num5) - { - num5 = num3; - } - if (num2 < num6) - { - num6 = num2; - } - if (num3 < num6) - { - num6 = num3; - } - float num7 = num5 - num6; - if (num1 == num5) - { - num4 = (num2 - num3)/num7; - } - else if (num2 == num5) - { - num4 = (float)(2.0 + (num3 - num1) / num7); - } - else if (num3 == num5) - { - num4 = (float)(4.0 + (num1 - num2) / (double)num7); - } - float num8 = num4 * 60f; - if (num8 < 0.0) - { - num8 += 360f; - } - - return num8; - } - - /// - /// Gets a hue-saturation-brightness (HSB) saturation value for this structure - /// - /// The saturation of this . - /// The saturation ranges from 0.0 through 1.0, where 0.0 is grayscale and 1.0 is the most saturated. - public float GetSaturation() - { - double num1 = R / (double)byte.MaxValue; - float num2 = G / (float)byte.MaxValue; - float num3 = B / (float)byte.MaxValue; - float num4 = 0.0f; - float num5 = (float)num1; - float num6 = (float)num1; - if (num2 > num5) - { - num5 = num2; - } - if (num3 > num5) - { - num5 = num3; - } - if (num2 < num6) - { - num6 = num2; - } - if (num3 < num6) - { - num6 = num3; - } - if (num5 != num6) - { - num4 = (num5 + num6) / 2.0 > 0.5 ? - (float)((num5 -num6) / (2.0 - num5 - num6)) - : - (num5 - num6) / (num5 + num6) - ; - } - - return num4; - } - - /// - /// Converts this structure to a human-readable string - /// - /// A string that is the name of this , if the - /// is created from a predefined color by using either the FromName method - /// or the FromKnownColor method; - /// otherwise, a string that consists of the ARGB component names and their values. - /// - public override string ToString() - { - var sb = new StringBuilder(32); - sb.Append(GetType().Name); - sb.Append(" ["); - if ((_state & StateNameValid) != 0) - { - sb.Append(Name); - } - else if ((_state & StateKnownColorValid) != 0) - { - sb.Append(Name); - } - else if ((_state & StateValueMask) != 0) - { - sb.Append("A="); - sb.Append(A); - sb.Append(", R="); - sb.Append(R); - sb.Append(", G="); - sb.Append(G); - sb.Append(", B="); - sb.Append(B); - } - else - { - sb.Append("Empty"); - } - sb.Append("]"); - - return sb.ToString(); - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs deleted file mode 100644 index 09a59e5..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColor.cs +++ /dev/null @@ -1,12 +0,0 @@ -#if NETCOREAPP1_0 -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing -{ - /// - /// Specifies the known system colors - /// - public enum KnownColor - { - OrangeRed = 128 - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs deleted file mode 100644 index 162ad55..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/KnownColorTable.cs +++ /dev/null @@ -1,27 +0,0 @@ -#if NETCOREAPP1_0 -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing -{ - internal static class KnownColorTable - { - public static int KnownColorToArgb(KnownColor color) - { - if (color == KnownColor.OrangeRed) - { - return -1286; - } - - return 0; - } - - public static string KnownColorToName(KnownColor color) - { - if (color == KnownColor.OrangeRed) - { - return "OrangeRed"; - } - - return null; - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs deleted file mode 100644 index 1af2144..0000000 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Drawing/Point.cs +++ /dev/null @@ -1,79 +0,0 @@ -#if NETCOREAPP1_0 -using System.Globalization; - -namespace MsieJavaScriptEngine.Test.Common.Interop.Drawing -{ - /// - /// Represents an ordered pair of integer x- and y-coordinates that defines a point in a two-dimensional plane - /// - public struct Point - { - private int _x; - private int _y; - - /// - /// Represents a that has X and Y values set to zero - /// - public static readonly Point Empty; - - /// - /// Gets or sets the x-coordinate of this - /// - public int X - { - get { return _x; } - set { _x = value; } - } - - /// - /// Gets or sets the y-coordinate of this - /// - public int Y - { - get { return _y; } - set { _y = value; } - } - - /// - /// Gets a value indicating whether this is empty - /// - /// true if both X and Y are 0; otherwise, false - public bool IsEmpty - { - get - { - if (_x == 0 && _y == 0) - { - return true; - } - - return false; - } - } - - - /// - /// Constructs an instance of the class with the specified coordinates - /// - /// The horizontal position of the point - /// The vertical position of the point - public Point(int x, int y) - { - _x = x; - _y = y; - } - - - /// - /// Converts this to a human-readable string - /// - /// A string that represents this - public override string ToString() - { - return "{X=" + _x.ToString(CultureInfo.CurrentCulture) + - ",Y=" + _y.ToString(CultureInfo.CurrentCulture) + "}" - ; - } - } -} -#endif \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index d708214..62b5935 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -#if !NETCOREAPP1_0 using System.Drawing; -#endif using System.IO; using System.Linq; using System.Text; @@ -11,9 +9,6 @@ using MsieJavaScriptEngine.Test.Common.Interop; using MsieJavaScriptEngine.Test.Common.Interop.Animals; -#if NETCOREAPP1_0 -using MsieJavaScriptEngine.Test.Common.Interop.Drawing; -#endif using MsieJavaScriptEngine.Test.Common.Interop.Logging; namespace MsieJavaScriptEngine.Test.Common diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c0989f1..f4243da 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,8 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.7 - net40;net451;netcoreapp1.0;netcoreapp2.1;netcoreapp3.1 - 1.0.16 + net40;net451;netcoreapp2.1;netcoreapp3.1 Library true true @@ -26,12 +25,8 @@ - - - - - + \ No newline at end of file From 3975b76bd8c49a564079eddfea79d07cf0661ba6 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Aug 2021 13:28:33 +0300 Subject: [PATCH 195/238] In test projects added support of .NET 5.0 --- build/common.props | 4 ++-- global.json | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 6 +++--- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 ++-- ...MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Common.csproj | 10 +++++----- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/build/common.props b/build/common.props index d856f2a..56932c7 100644 --- a/build/common.props +++ b/build/common.props @@ -3,7 +3,7 @@ Copyright © 2012-2020 Andrey Taritsyn - + $(DefineConstants);NETFULL @@ -11,7 +11,7 @@ $(DefineConstants);NETSTANDARD - + $(DefineConstants);NETCOREAPP \ No newline at end of file diff --git a/global.json b/global.json index 8c83c01..790609f 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "3.1.411" + "version": "5.0.302" } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index d86afd8..9cee985 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -8,7 +8,7 @@ 7.3 Library true - $(NoWarn);CS1591;NU5125 + $(NoWarn);CS1591;NU1605 true true $(Product) @@ -38,14 +38,14 @@ - + - + diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 737550e..534f5de 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.7 - net461;netcoreapp2.1;netcoreapp3.1 + net461;netcoreapp2.1;netcoreapp3.1;net5.0 Exe true false @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index c59833b..5eb2497 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.7 - net40;net451;netcoreapp2.1;netcoreapp3.1 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 9d3949e..9c589e3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.0.7 - net40;net451 + net40;net45 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index dd62bab..3267381 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.7 - net40;net451;netcoreapp2.1;netcoreapp3.1 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 77cb726..bfe4001 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.7 - net40;net451;netcoreapp2.1;netcoreapp3.1 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 4f2026f..d104179 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.0.7 - net40;net451 + net40;net45 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index f4243da..0fb3367 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.7 - net40;net451;netcoreapp2.1;netcoreapp3.1 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true true @@ -14,14 +14,14 @@ - - - + + + - + From 50890dc6ce08b6832b5543e4713578d903f4baee Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Aug 2021 14:28:11 +0300 Subject: [PATCH 196/238] 1. Added a `.editorconfig` file; 2. Unified formatting of different file types. --- .editorconfig | 37 ++++ README.md | 158 +++++++++--------- build/common.props | 24 +-- build/net40-client-target.props | 10 +- build/strong-name-signing.props | 10 +- global.json | 8 +- .../MsieJavaScriptEngine.csproj | 152 ++++++++--------- src/MsieJavaScriptEngine/bundleconfig.json | 26 +-- .../MsieJavaScriptEngine.Benchmarks.csproj | 32 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 28 ++-- ...criptEngine.Test.ChakraActiveScript.csproj | 28 ++-- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 28 ++-- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 28 ++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 28 ++-- .../MsieJavaScriptEngine.Test.Common.csproj | 46 ++--- 15 files changed, 340 insertions(+), 303 deletions(-) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cbaf667 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,37 @@ +# Top-most EditorConfig file +root = true + +[*] +end_of_line = crlf +indent_style = tab +tab_width = 4 +trim_trailing_whitespace = true +insert_final_newline = false + +[*.json] +indent_style = space +indent_size = 2 +insert_final_newline = true + +[*.cmd] +indent_style = space +indent_size = 4 + +[*.{xml,config,csproj,props,targets}] +indent_style = space +indent_size = 2 + +[*.sln] +insert_final_newline = true + +[*.{txt,md}] +indent_style = space +indent_size = unset + +[**/Resources/**] +charset = unset +end_of_line = unset +indent_style = unset +indent_size = unset +trim_trailing_whitespace = unset +insert_final_newline = unset \ No newline at end of file diff --git a/README.md b/README.md index b9a8c9b..9727a00 100644 --- a/README.md +++ b/README.md @@ -36,42 +36,42 @@ using MsieJavaScriptEngine.Helpers; namespace MsieJavaScriptEngine.Example.Console { - class Program - { - static void Main(string[] args) - { - try - { - using (var jsEngine = new MsieJsEngine()) - { - const string expression = "7 * 8 - 20"; - var result = jsEngine.Evaluate(expression); - - Console.WriteLine("{0} = {1}", expression, result); - } - } - catch (JsEngineLoadException e) - { - Console.WriteLine("During loading of JavaScript engine an error occurred."); - Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); - } - catch (JsScriptException e) - { - Console.WriteLine("During processing of JavaScript code an error occurred."); - Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); - } - catch (JsException e) - { - Console.WriteLine("During working of JavaScript engine an unknown error occurred."); - Console.WriteLine(); - Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); - } - - Console.ReadLine(); - } - } + class Program + { + static void Main(string[] args) + { + try + { + using (var jsEngine = new MsieJsEngine()) + { + const string expression = "7 * 8 - 20"; + var result = jsEngine.Evaluate(expression); + + Console.WriteLine("{0} = {1}", expression, result); + } + } + catch (JsEngineLoadException e) + { + Console.WriteLine("During loading of JavaScript engine an error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); + } + catch (JsScriptException e) + { + Console.WriteLine("During processing of JavaScript code an error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); + } + catch (JsException e) + { + Console.WriteLine("During working of JavaScript engine an unknown error occurred."); + Console.WriteLine(); + Console.WriteLine(JsErrorHelpers.GenerateErrorDetails(e)); + } + + Console.ReadLine(); + } + } } ``` @@ -94,49 +94,49 @@ Also, when you create an instance of the JsEngineSettings class: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Property nameData typeDefault valueDescription
    EnableDebuggingBooleanfalseFlag for whether to allow debugging in Visual Studio by adding the debugger statement to script code.
    EngineModeJsEngineMode enumerationAutoJavaScript engine mode.
    MaxStackSizeInt32503 808 or 1 007 616 -

    Maximum stack size in bytes.

    -

    Set a 0 to use the default maximum stack size specified in the header for the executable.

    -
    UseEcmaScript5PolyfillBooleanfalseFlag for whether to use the ECMAScript 5 Polyfill.
    UseJson2LibraryBooleanfalseFlag for whether to use the JSON2 library
    Property nameData typeDefault valueDescription
    EnableDebuggingBooleanfalseFlag for whether to allow debugging in Visual Studio by adding the debugger statement to script code.
    EngineModeJsEngineMode enumerationAutoJavaScript engine mode.
    MaxStackSizeInt32503 808 or 1 007 616 +

    Maximum stack size in bytes.

    +

    Set a 0 to use the default maximum stack size specified in the header for the executable.

    +
    UseEcmaScript5PolyfillBooleanfalseFlag for whether to use the ECMAScript 5 Polyfill.
    UseJson2LibraryBooleanfalseFlag for whether to use the JSON2 library
    diff --git a/build/common.props b/build/common.props index 56932c7..3d8cd31 100644 --- a/build/common.props +++ b/build/common.props @@ -1,17 +1,17 @@ - - Copyright © 2012-2020 Andrey Taritsyn - + + Copyright © 2012-2020 Andrey Taritsyn + - - $(DefineConstants);NETFULL - + + $(DefineConstants);NETFULL + - - $(DefineConstants);NETSTANDARD - + + $(DefineConstants);NETSTANDARD + - - $(DefineConstants);NETCOREAPP - + + $(DefineConstants);NETCOREAPP + \ No newline at end of file diff --git a/build/net40-client-target.props b/build/net40-client-target.props index 85b46db..a6ecf13 100644 --- a/build/net40-client-target.props +++ b/build/net40-client-target.props @@ -1,7 +1,7 @@ - - .NETFramework - v4.0 - client - + + .NETFramework + v4.0 + client + \ No newline at end of file diff --git a/build/strong-name-signing.props b/build/strong-name-signing.props index 5130e09..543e8a3 100644 --- a/build/strong-name-signing.props +++ b/build/strong-name-signing.props @@ -1,7 +1,7 @@ - - ../../build/Key.snk - true - true - + + ../../build/Key.snk + true + true + \ No newline at end of file diff --git a/global.json b/global.json index 790609f..81ef66d 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { - "sdk": { - "version": "5.0.302" - } -} \ No newline at end of file + "sdk": { + "version": "5.0.302" + } +} diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 9cee985..c8c1949 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -1,88 +1,88 @@  - - MSIE JavaScript Engine for .NET - 3.0.7 - net40-client;net45;netstandard1.3;netstandard2.0 - 1.6.0 - 7.3 - Library - true - $(NoWarn);CS1591;NU1605 - true - true - $(Product) - Andrey Taritsyn - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). - LICENSE.txt - false - https://github.com/Taritsyn/MsieJavaScriptEngine - icon.png - https://github.com/Taritsyn/MsieJavaScriptEngine - git - true - true - snupkg - JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error “Program crash after function call with too much parameters”. - en-US - ../../nuget - true - false - false - + + MSIE JavaScript Engine for .NET + 3.0.7 + net40-client;net45;netstandard1.3;netstandard2.0 + 1.6.0 + 7.3 + Library + true + $(NoWarn);CS1591;NU1605 + true + true + $(Product) + Andrey Taritsyn + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). + LICENSE.txt + false + https://github.com/Taritsyn/MsieJavaScriptEngine + icon.png + https://github.com/Taritsyn/MsieJavaScriptEngine + git + true + true + snupkg + JavaScript;ECMAScript;MSIE;IE;Edge;Chakra + Fixed a error “Program crash after function call with too much parameters”. + en-US + ../../nuget + true + false + false + - - - + + + - - - - - - + + + + + + - - - - + + + + - - - + + + - - - - - + + + + + - - - $(PackageIcon) - true - false - - - $(PackageLicenseFile) - true - false - - - / - true - false - + + + $(PackageIcon) + true + false + + + $(PackageLicenseFile) + true + false + + + / + true + false + - - readme.txt - true - - + + readme.txt + true + + - - - + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/bundleconfig.json b/src/MsieJavaScriptEngine/bundleconfig.json index de17583..9153a95 100644 --- a/src/MsieJavaScriptEngine/bundleconfig.json +++ b/src/MsieJavaScriptEngine/bundleconfig.json @@ -1,14 +1,14 @@ [ - { - "outputFileName": "Resources/ES5.min.js", - "inputFiles": [ - "Resources/ES5.js" - ] - }, - { - "outputFileName": "Resources/json2.min.js", - "inputFiles": [ - "Resources/json2.js" - ] - } -] \ No newline at end of file + { + "outputFileName": "Resources/ES5.min.js", + "inputFiles": [ + "Resources/ES5.js" + ] + }, + { + "outputFileName": "Resources/json2.min.js", + "inputFiles": [ + "Resources/json2.js" + ] + } +] diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 534f5de..786b65d 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -1,24 +1,24 @@ - - MSIE JavaScript Engine: Benchmarks - 3.0.7 - net461;netcoreapp2.1;netcoreapp3.1;net5.0 - Exe - true - false - + + MSIE JavaScript Engine: Benchmarks + 3.0.7 + net461;netcoreapp2.1;netcoreapp3.1;net5.0 + Exe + true + false + - + - - + + - - + + - - - + + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 5eb2497..78a820f 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -1,21 +1,21 @@  - - MSIE JavaScript Engine: Tests for Auto Mode - 3.0.7 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 - Library - true - true - false - + + MSIE JavaScript Engine: Tests for Auto Mode + 3.0.7 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + Library + true + true + false + - + - - + + - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 9c589e3..5c17073 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -1,21 +1,21 @@  - - MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.7 - net40;net45 - Library - true - true - false - + + MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode + 3.0.7 + net40;net45 + Library + true + true + false + - + - - + + - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 3267381..21508fb 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -1,21 +1,21 @@  - - MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.7 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 - Library - true - true - false - + + MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode + 3.0.7 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + Library + true + true + false + - + - - + + - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index bfe4001..0b65dc3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -1,21 +1,21 @@  - - MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.7 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 - Library - true - true - false - + + MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode + 3.0.7 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + Library + true + true + false + - + - - + + - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d104179..a4e2f33 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -1,21 +1,21 @@  - - MSIE JavaScript Engine: Tests for Classic Mode - 3.0.7 - net40;net45 - Library - true - true - false - + + MSIE JavaScript Engine: Tests for Classic Mode + 3.0.7 + net40;net45 + Library + true + true + false + - + - - + + - - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 0fb3367..c1e3d6b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -1,32 +1,32 @@  - - MSIE JavaScript Engine: Common Tests - 3.0.7 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 - Library - true - true - false - + + MSIE JavaScript Engine: Common Tests + 3.0.7 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + Library + true + true + false + - - + + - - - - + + + + - - + + - - - + + + - - - + + + \ No newline at end of file From b28e5202ae9a9d04f46fad021d0d3bdbc8d00a04 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Aug 2021 17:29:50 +0300 Subject: [PATCH 197/238] Improved a implementation of the `Dispose` method --- .../ActiveScript/ActiveScriptWrapper32.cs | 25 +++++++++++++------ .../ActiveScript/ActiveScriptWrapper64.cs | 25 +++++++++++++------ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 12 ++++----- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 12 ++++----- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- 6 files changed, 48 insertions(+), 30 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 099be6c..dd71501 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -146,21 +146,30 @@ public override void Dispose() /// managed objects contained in fields of class protected override void Dispose(bool disposing) { - if (_disposedFlag.Set()) + if (disposing) { - if (disposing) + if (_disposedFlag.Set()) { _debugStackFrameSniffer32 = null; _activeScriptDebug32 = null; _activeScriptParse32 = null; - } - - ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer32); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug32); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse32); - base.Dispose(disposing); + DisposeUnmanagedResources(); + base.Dispose(true); + } } + else + { + DisposeUnmanagedResources(); + base.Dispose(false); + } + } + + private void DisposeUnmanagedResources() + { + ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer32); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug32); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse32); } #endregion diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index d1ac8f2..d9955cb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -146,21 +146,30 @@ public override void Dispose() /// managed objects contained in fields of class protected override void Dispose(bool disposing) { - if (_disposedFlag.Set()) + if (disposing) { - if (disposing) + if (_disposedFlag.Set()) { _debugStackFrameSniffer64 = null; _activeScriptDebug64 = null; _activeScriptParse64 = null; - } - - ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer64); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug64); - ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse64); - base.Dispose(disposing); + DisposeUnmanagedResources(); + base.Dispose(true); + } } + else + { + DisposeUnmanagedResources(); + base.Dispose(false); + } + } + + private void DisposeUnmanagedResources() + { + ComHelpers.ReleaseAndEmpty(ref _pDebugStackFrameSniffer64); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptDebug64); + ComHelpers.ReleaseAndEmpty(ref _pActiveScriptParse64); } #endregion diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index af448cd..2216747 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -776,9 +776,9 @@ public override void Dispose() /// managed objects contained in fields of class private void Dispose(bool disposing) { - if (_disposedFlag.Set()) + if (disposing) { - if (disposing) + if (_disposedFlag.Set()) { if (_dispatcher != null) { @@ -794,10 +794,10 @@ private void Dispose(bool disposing) _typeMapper = null; } } - else - { - DisposeUnmanagedResources(); - } + } + else + { + DisposeUnmanagedResources(); } } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index a199e1e..759544d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -830,9 +830,9 @@ public override void Dispose() /// managed objects contained in fields of class private void Dispose(bool disposing) { - if (_disposedFlag.Set()) + if (disposing) { - if (disposing) + if (_disposedFlag.Set()) { if (_dispatcher != null) { @@ -848,10 +848,10 @@ private void Dispose(bool disposing) _typeMapper = null; } } - else - { - DisposeUnmanagedResources(); - } + } + else + { + DisposeUnmanagedResources(); } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index c8c1949..a5858b6 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error “Program crash after function call with too much parameters”. + Improved a implementation of the `Dispose` method. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index f283212..936d029 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error “Program crash after function call with too much parameters”. + Improved a implementation of the `Dispose` method. ============ PROJECT SITE From 729542e508f64b62a89dd1456a633f5f4d8288c0 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 8 Aug 2021 19:37:39 +0300 Subject: [PATCH 198/238] Version 3.0.8 --- CHANGELOG.md | 3 +++ LICENSE.txt | 2 +- Licenses/bundler-and-minifier-license.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 3 ++- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 13 files changed, 17 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 15c92cc..e2474aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.8 - August 8, 2021 + * Improved a implementation of the `Dispose` method + ## v3.0.7 - March 8, 2020 * Fixed a error “Program crash after function call with too much parameters” diff --git a/LICENSE.txt b/LICENSE.txt index a4ebd14..15d3451 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2020 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2021 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/Licenses/bundler-and-minifier-license.txt b/Licenses/bundler-and-minifier-license.txt index d8c64ce..3115a6d 100644 --- a/Licenses/bundler-and-minifier-license.txt +++ b/Licenses/bundler-and-minifier-license.txt @@ -1,4 +1,4 @@ -Copyright 2015 Mads Kristensen +Copyright 2015-2020 Mads Kristensen Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/build/common.props b/build/common.props index 3d8cd31..910253f 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - Copyright © 2012-2020 Andrey Taritsyn + Copyright © 2012-2021 Andrey Taritsyn diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index a5858b6..e5b0d4e 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.7 + 3.0.8 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 @@ -17,6 +17,7 @@ LICENSE.txt false https://github.com/Taritsyn/MsieJavaScriptEngine + https://raw.githubusercontent.com/Taritsyn/MsieJavaScriptEngine/master/images/MsieJavaScriptEngine_Logo_128x128.png icon.png https://github.com/Taritsyn/MsieJavaScriptEngine git diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 936d029..ef50405 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.7 + README file for MSIE JavaScript Engine for .NET v3.0.8 -------------------------------------------------------------------------------- - Copyright (c) 2012-2020 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2021 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 786b65d..4b344cd 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.7 + 3.0.8 net461;netcoreapp2.1;netcoreapp3.1;net5.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 78a820f..8f56204 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.7 + 3.0.8 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 5c17073..d0be18d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.7 + 3.0.8 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 21508fb..2689d86 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.7 + 3.0.8 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 0b65dc3..7432557 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.7 + 3.0.8 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index a4e2f33..4900563 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.7 + 3.0.8 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c1e3d6b..6cbda00 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.7 + 3.0.8 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 Library true From ad9a94415a014aba5180def0198ebf9f7f82a944 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 22 Nov 2021 21:35:29 +0300 Subject: [PATCH 199/238] In test projects added support of .NET 6 --- build/common.props | 12 ---------- global.json | 2 +- .../ActiveScript/ActiveScriptException.cs | 2 +- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../ActiveScriptJsErrorHelpers.cs | 2 +- .../ActiveScript/ActiveScriptWrapper32.cs | 2 +- .../ActiveScript/ActiveScriptWrapper64.cs | 2 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 2 +- .../ChakraActiveScriptJsEngine.ScriptSite.cs | 2 +- .../ChakraActiveScriptJsEngine.cs | 2 +- .../ClassicActiveScriptJsEngine.ScriptSite.cs | 2 +- .../ClassicActiveScriptJsEngine.cs | 2 +- .../ActiveScript/Debugging/AppBreakFlags.cs | 2 +- .../ActiveScript/Debugging/BreakReason.cs | 2 +- .../Debugging/BreakResumeAction.cs | 2 +- .../ActiveScript/Debugging/BreakpointState.cs | 2 +- .../Debugging/DebugApplicationWrapper.cs | 2 +- .../ActiveScript/Debugging/DebugDocument.cs | 2 +- .../Debugging/DebugDocumentContext.cs | 2 +- .../ActiveScript/Debugging/DebugLineInfo.cs | 2 +- .../Debugging/DebugStackFrameDescriptor.cs | 2 +- .../Debugging/DocumentNameType.cs | 2 +- .../Debugging/ErrorResumeAction.cs | 2 +- .../Debugging/IActiveScriptDebug32.cs | 2 +- .../Debugging/IActiveScriptDebug64.cs | 2 +- .../Debugging/IActiveScriptErrorDebug.cs | 2 +- .../Debugging/IActiveScriptSiteDebug32.cs | 2 +- .../Debugging/IActiveScriptSiteDebug64.cs | 2 +- .../Debugging/IActiveScriptSiteDebugEx.cs | 2 +- .../Debugging/IApplicationDebugger.cs | 2 +- .../Debugging/IDebugApplication32.cs | 2 +- .../Debugging/IDebugApplication64.cs | 2 +- .../Debugging/IDebugApplicationNode.cs | 2 +- .../Debugging/IDebugApplicationThread.cs | 2 +- .../Debugging/IDebugAsyncOperation.cs | 2 +- .../Debugging/IDebugCodeContext.cs | 2 +- .../ActiveScript/Debugging/IDebugDocument.cs | 2 +- .../Debugging/IDebugDocumentContext.cs | 2 +- .../Debugging/IDebugDocumentInfo.cs | 2 +- .../Debugging/IDebugDocumentProvider.cs | 2 +- .../Debugging/IDebugDocumentText.cs | 2 +- .../ActiveScript/Debugging/IDebugProperty.cs | 2 +- .../Debugging/IDebugStackFrame.cs | 2 +- .../Debugging/IDebugStackFrameSniffer.cs | 2 +- .../Debugging/IDebugStackFrameSnifferEx32.cs | 2 +- .../Debugging/IDebugStackFrameSnifferEx64.cs | 2 +- .../Debugging/IDebugSyncOperation.cs | 2 +- .../Debugging/IDebugThreadCall32.cs | 2 +- .../Debugging/IDebugThreadCall64.cs | 2 +- .../Debugging/IEnumDebugApplicationNodes.cs | 2 +- .../Debugging/IEnumDebugCodeContexts.cs | 2 +- .../Debugging/IEnumDebugExpressionContexts.cs | 2 +- .../Debugging/IEnumDebugStackFrames.cs | 2 +- .../IEnumRemoteDebugApplicationThreads.cs | 2 +- .../Debugging/IProvideExpressionContexts.cs | 2 +- .../IRemoteDebugApplicationThread.cs | 2 +- .../Debugging/NullEnumDebugStackFrames.cs | 2 +- .../Debugging/ProcessDebugManagerWrapper.cs | 2 +- .../ActiveScript/Debugging/SourceTextAttrs.cs | 2 +- .../ActiveScript/Debugging/TextDocAttrs.cs | 2 +- .../ActiveScript/IActiveScript.cs | 2 +- .../ActiveScript/IActiveScriptError.cs | 2 +- .../IActiveScriptGarbageCollector.cs | 2 +- .../ActiveScript/IActiveScriptParse32.cs | 2 +- .../ActiveScript/IActiveScriptParse64.cs | 2 +- .../ActiveScript/IActiveScriptProperty.cs | 2 +- .../ActiveScript/IActiveScriptSite.cs | 2 +- .../IActiveScriptSiteInterruptPoll.cs | 2 +- .../ActiveScript/IActiveScriptWrapper.cs | 2 +- .../ActiveScript/JScriptRuntimeErrorNumber.cs | 2 +- .../ActiveScript/JScriptSyntaxErrorNumber.cs | 2 +- .../ActiveScript/ScriptGCType.cs | 2 +- .../ActiveScript/ScriptInfoFlags.cs | 2 +- .../ActiveScript/ScriptInterruptFlags.cs | 2 +- .../ActiveScript/ScriptItemFlags.cs | 2 +- .../ActiveScript/ScriptLanguageVersion.cs | 2 +- .../ActiveScript/ScriptProperty.cs | 2 +- .../ActiveScript/ScriptState.cs | 2 +- .../ActiveScript/ScriptTextFlags.cs | 2 +- .../ActiveScript/ScriptThreadId.cs | 2 +- .../ActiveScript/ScriptThreadState.cs | 2 +- .../ActiveScript/ScriptTypeLibFlags.cs | 2 +- src/MsieJavaScriptEngine/Constants/ClassId.cs | 2 +- .../Constants/ComErrorCode.cs | 2 +- .../Constants/SpecialMemberName.cs | 2 +- .../Helpers/ComHelpers.cs | 2 +- .../Helpers/ReflectionHelpers.cs | 6 ++--- .../Helpers/TypeMappingHelpers.cs | 2 +- src/MsieJavaScriptEngine/HostItemBase.cs | 2 +- src/MsieJavaScriptEngine/HostObject.cs | 2 +- src/MsieJavaScriptEngine/HostType.cs | 2 +- .../JsRt/Edge/EdgeJsValue.cs | 4 ++-- .../JsRt/Edge/EdgeNativeMethods.cs | 2 +- .../JsRt/Edge/EdgeTypeMapper.cs | 22 +++++++++---------- .../JsRt/Embedding/EmbeddedItem.cs | 2 +- .../JsRt/Embedding/EmbeddedObject.cs | 2 +- .../JsRt/Embedding/EmbeddedObjectKey.cs | 2 +- .../JsRt/Embedding/EmbeddedType.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 4 ++-- .../JsRt/Ie/IeNativeMethods.cs | 2 +- .../JsRt/Ie/IeTypeMapper.cs | 18 +++++++-------- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 16 +++++++------- src/MsieJavaScriptEngine/MsieJsEngine.cs | 10 ++++----- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 ++-- ...criptEngine.Test.ChakraActiveScript.csproj | 2 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 ++-- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 6 ++--- 111 files changed, 149 insertions(+), 161 deletions(-) diff --git a/build/common.props b/build/common.props index 910253f..6bec7b5 100644 --- a/build/common.props +++ b/build/common.props @@ -2,16 +2,4 @@ Copyright © 2012-2021 Andrey Taritsyn - - - $(DefineConstants);NETFULL - - - - $(DefineConstants);NETSTANDARD - - - - $(DefineConstants);NETCOREAPP - \ No newline at end of file diff --git a/global.json b/global.json index 81ef66d..0470208 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "5.0.302" + "version": "6.0.100" } } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index 88faecf..fc0fd68 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.Serialization; using System.Security.Permissions; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index 2bf1273..ef2011a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Collections.Generic; using System.Globalization; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 598de49..54661bb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Collections.Generic; using System.Globalization; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs index 32c4c5f..f455f67 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index dd71501..0bf3a3e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index d9955cb..a360bdf 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 05d9c24..2db2dd5 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs index bcb8fb3..7a4fcb3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.ScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Resources; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index ea885e9..c9bbf35 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Collections.Generic; using MsieJavaScriptEngine.Constants; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs index acf5ef4..f23b32a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Collections.Generic; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index b268bbb..be28650 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Collections.Generic; using MsieJavaScriptEngine.Constants; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs index e30918b..f18226d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/AppBreakFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs index 013b0e7..e632c22 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakReason.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs index 44250fa..67ba243 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakResumeAction.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs index 42d4959..71824dd 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/BreakpointState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs index 88c499f..16cdea9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs index 7f05635..e44333e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Collections.Generic; using System.Linq; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs index 074f684..832ced4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocumentContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs index 241f1a4..7300bde 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugLineInfo.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs index 1a7ad39..d5df6d2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs index f5c8715..9353c03 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DocumentNameType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs index 6931d88..c294997 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ErrorResumeAction.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs index 25bddc8..e915cfe 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs index 39cbcd4..8ee47fc 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs index e36b044..6932036 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptErrorDebug.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs index 2cb9b82..bf43783 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs index c72eff4..0cec490 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs index 4de0efe..b44c9fd 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebugEx.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs index 48d0336..e72e43d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IApplicationDebugger.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs index 6f688c4..6f11a2b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs @@ -11,7 +11,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IDebugApplication32 // : IRemoteDebugApplication { -#if !NETSTANDARD +#if NETFRAMEWORK #region IRemoteDebugApplication methods /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs index c99d263..036edc0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs @@ -11,7 +11,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IDebugApplication64 // : IRemoteDebugApplication { -#if !NETSTANDARD +#if NETFRAMEWORK #region IRemoteDebugApplication methods /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs index fd6799e..0b892ae 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationNode.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs index bf601fe..c8fc7de 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplicationThread.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs index 769b129..68cfd16 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugAsyncOperation.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs index cf56785..18e0c86 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugCodeContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs index c5a3509..e70f7f4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocument.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs index cf6b76c..3fe7cc1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentContext.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs index 7be288a..488e9ea 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentInfo.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs index ab663e5..c749b6a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentProvider.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs index ce96b55..c652344 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs index 9004d41..7e8df16 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs index b515d8e..6e65835 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs index e0cfc15..e107105 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSniffer.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs index 71f1db1..8c301ab 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs index a6c83f7..3aa6d91 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrameSnifferEx64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs index 1cc92d7..64c872f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugSyncOperation.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs index ef392d7..642367b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs index 53bbf75..8c63485 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs index cc41adf..7c311fe 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugApplicationNodes.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs index d3753f5..93bb198 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugCodeContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs index e698d46..00f7d49 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs index d426411..6c75645 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugStackFrames.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs index 020c2c6..e4121a9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumRemoteDebugApplicationThreads.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs index 258411b..de68303 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IProvideExpressionContexts.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs index 33aa2a5..0cd3e26 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IRemoteDebugApplicationThread.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs index 2735f83..5cb29a8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/NullEnumDebugStackFrames.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs index c18cadb..3cd1459 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.Utilities; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs index 407bf59..b86ee0a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs index 0cad8a1..a402865 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/TextDocAttrs.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript.Debugging diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs index ae0eed4..cdee6c9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs index 3e4d6c4..e009f67 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; using EXCEPINFO = System.Runtime.InteropServices.ComTypes.EXCEPINFO; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs index b58eeff..937e164 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptGarbageCollector.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs index 2d0360f..b89d570 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs index 2fa9bc3..d4342a1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs index f590a3e..5c373ff 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index d59bddd..0bf8302 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs index c195f10..c8c7c96 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System.Runtime.InteropServices; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs index 4a44316..afe457f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices.ComTypes; diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs index d65a18f..ce14c46 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs index 7cf568d..40501e3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs index 5928dfc..49f816a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptGCType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs index bb97eea..97d07e8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs index c653693..04d4bb9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInterruptFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs index 5fe126f..5b9958a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs index 95d6cba..d4c90ca 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptLanguageVersion.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs index c274650..0bab796 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs index 3e1a775..da2b0ba 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs index 7f24c62..3b43870 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs index 23bb700..541f3ff 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadId.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs index 1567e9d..bcafbb9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptThreadState.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.ActiveScript { /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs index ef91fcc..ba20786 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTypeLibFlags.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; namespace MsieJavaScriptEngine.ActiveScript diff --git a/src/MsieJavaScriptEngine/Constants/ClassId.cs b/src/MsieJavaScriptEngine/Constants/ClassId.cs index 535df64..715c435 100644 --- a/src/MsieJavaScriptEngine/Constants/ClassId.cs +++ b/src/MsieJavaScriptEngine/Constants/ClassId.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs index 624c09f..26b1222 100644 --- a/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs +++ b/src/MsieJavaScriptEngine/Constants/ComErrorCode.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs index 4834591..9febe74 100644 --- a/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs +++ b/src/MsieJavaScriptEngine/Constants/SpecialMemberName.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK namespace MsieJavaScriptEngine.Constants { /// diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index f023354..0168559 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Runtime.InteropServices; diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 344af4e..c51cabd 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,10 +1,10 @@ using System; -#if NETSTANDARD +#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; #endif using System.Reflection; -#if NETSTANDARD +#if !NETFRAMEWORK using MsieJavaScriptEngine.Utilities; #endif @@ -44,7 +44,7 @@ public static bool IsFullyFledgedMethod(MethodInfo method) return isFullyFledged; } -#if !NETSTANDARD +#if NETFRAMEWORK public static MethodInfo[] GetFullyFledgedMethods(MethodInfo[] methods) { diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index f5baeca..e37a7e8 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Linq; diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/HostItemBase.cs index 55bd380..2528ff0 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/HostItemBase.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Globalization; using System.Reflection; diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/HostObject.cs index 405f0ad..6895a86 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/HostObject.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Globalization; using System.Linq; diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/HostType.cs index 5b02a50..aa258c4 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/HostType.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD +#if NETFRAMEWORK using System; using System.Globalization; using System.Linq; diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 2f819a2..800d4b1 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -304,7 +304,7 @@ public static EdgeJsValue FromString(string value) return reference; } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Creates a JavaScript value that is a projection of the passed in object @@ -611,7 +611,7 @@ public int ToInt32() return Marshal.PtrToStringUni(buffer, (int)length); } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Retrieves a object representation of an Object value diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index e173780..482d292 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -148,7 +148,7 @@ internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRunti [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); -#if !NETSTANDARD +#if NETFRAMEWORK [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 6d28538..c6fd0ab 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -1,5 +1,5 @@ using System; -#if NETSTANDARD +#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -9,14 +9,14 @@ using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; -#if NETSTANDARD +#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Resources; #endif -#if !NETSTANDARD +#if NETFRAMEWORK using MsieJavaScriptEngine.Utilities; #endif -#if NETSTANDARD +#if !NETFRAMEWORK using WrapperException = MsieJavaScriptEngine.JsException; using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; @@ -25,7 +25,7 @@ namespace MsieJavaScriptEngine.JsRt.Edge { -#if NETSTANDARD +#if !NETFRAMEWORK using EdgeEmbeddedItem = EmbeddedItem; using EdgeEmbeddedObject = EmbeddedObject; using EdgeEmbeddedType = EmbeddedType; @@ -40,13 +40,13 @@ internal sealed class EdgeTypeMapper : TypeMapper public EdgeTypeMapper() -#if !NETSTANDARD +#if NETFRAMEWORK : base(JsEngineMode.ChakraEdgeJsRt) #endif { } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Creates a JavaScript value from an host object if the it does not already exist /// @@ -148,7 +148,7 @@ public override object MapToHostType(EdgeJsValue value) case JsValueType.String: result = value.ToString(); break; -#if NETSTANDARD +#if !NETFRAMEWORK case JsValueType.Function: EdgeJsPropertyId externalObjectPropertyId = EdgeJsPropertyId.FromString(ExternalObjectPropertyName); if (value.HasProperty(externalObjectPropertyId)) @@ -162,12 +162,12 @@ public override object MapToHostType(EdgeJsValue value) break; #endif case JsValueType.Object: -#if !NETSTANDARD +#if NETFRAMEWORK case JsValueType.Function: #endif case JsValueType.Error: case JsValueType.Array: -#if NETSTANDARD +#if !NETFRAMEWORK result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); #else @@ -184,7 +184,7 @@ public override object MapToHostType(EdgeJsValue value) return result; } -#if NETSTANDARD +#if !NETFRAMEWORK protected override EdgeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs index 71c8699..1a109a4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if !NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs index ee0bf5a..1902505 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if !NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs index 9eb2009..bc18574 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if !NETFRAMEWORK using System; using System.Collections; using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs index f29a1c1..680ad70 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if !NETFRAMEWORK using System; using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index d429422..1113218 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -305,7 +305,7 @@ public static IeJsValue FromString(string value) return reference; } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Creates a JavaScript value that is a projection of the passed in object @@ -611,7 +611,7 @@ public int ToInt32() return Marshal.PtrToStringUni(buffer, (int)length); } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Retrieves a object representation of an Object value diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 14a6f9d..5529a2a 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -154,7 +154,7 @@ internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugAp [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); -#if !NETSTANDARD +#if NETFRAMEWORK [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index 00256a0..a0c7ebd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -1,5 +1,5 @@ using System; -#if NETSTANDARD +#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; using System.Reflection; @@ -9,7 +9,7 @@ using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; -#if NETSTANDARD +#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Resources; @@ -20,7 +20,7 @@ namespace MsieJavaScriptEngine.JsRt.Ie { -#if NETSTANDARD +#if !NETFRAMEWORK using IeEmbeddedItem = EmbeddedItem; using IeEmbeddedObject = EmbeddedObject; using IeEmbeddedType = EmbeddedType; @@ -35,13 +35,13 @@ internal sealed class IeTypeMapper : TypeMapper /// Constructs an instance of the “IE” type mapper /// public IeTypeMapper() -#if !NETSTANDARD +#if NETFRAMEWORK : base(JsEngineMode.ChakraIeJsRt) #endif { } -#if !NETSTANDARD +#if NETFRAMEWORK /// /// Creates a JavaScript value from an host object if the it does not already exist /// @@ -143,7 +143,7 @@ public override object MapToHostType(IeJsValue value) case JsValueType.String: result = value.ToString(); break; -#if NETSTANDARD +#if !NETFRAMEWORK case JsValueType.Function: IeJsPropertyId externalObjectPropertyId = IeJsPropertyId.FromString(ExternalObjectPropertyName); if (value.HasProperty(externalObjectPropertyId)) @@ -157,12 +157,12 @@ public override object MapToHostType(IeJsValue value) break; #endif case JsValueType.Object: -#if !NETSTANDARD +#if NETFRAMEWORK case JsValueType.Function: #endif case JsValueType.Error: case JsValueType.Array: -#if NETSTANDARD +#if !NETFRAMEWORK result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); #else @@ -179,7 +179,7 @@ public override object MapToHostType(IeJsValue value) return result; } -#if NETSTANDARD +#if !NETFRAMEWORK protected override IeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 4297893..25ecc08 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -1,14 +1,14 @@ using System; -#if NETSTANDARD +#if !NETFRAMEWORK using System.Collections.Concurrent; #endif using System.Linq; -#if NETSTANDARD +#if !NETFRAMEWORK using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; #endif -#if NETSTANDARD +#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Utilities; @@ -25,7 +25,7 @@ internal abstract class TypeMapper : IDisposable where TValue : struct where TFunction : Delegate { -#if NETSTANDARD +#if !NETFRAMEWORK /// /// Name of property to store the external object /// @@ -98,7 +98,7 @@ protected TypeMapper(JsEngineMode engineMode) /// /// Instance of host type /// JavaScript value created from an host object -#if NETSTANDARD +#if !NETFRAMEWORK public virtual TValue GetOrCreateScriptObject(object obj) { @@ -134,7 +134,7 @@ public virtual TValue GetOrCreateScriptObject(object obj) /// /// Host type /// JavaScript value created from an host type -#if NETSTANDARD +#if !NETFRAMEWORK public virtual TValue GetOrCreateScriptType(Type type) { if (!_embeddedTypeStorageInitialized) @@ -177,7 +177,7 @@ public virtual TValue GetOrCreateScriptType(Type type) /// The source value /// The mapped value public abstract object MapToHostType(TValue value); -#if NETSTANDARD +#if !NETFRAMEWORK protected abstract EmbeddedObject CreateEmbeddedObjectOrFunction(object obj); @@ -291,7 +291,7 @@ protected static Exception UnwrapException(Exception exception) /// public virtual void Dispose() { -#if NETSTANDARD +#if !NETFRAMEWORK if (_disposedFlag.Set()) { var lazyEmbeddedObjects = _lazyEmbeddedObjects; diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index f93a473..206b5b1 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -4,7 +4,7 @@ using System.Runtime.CompilerServices; using System.Text; -#if !NETSTANDARD +#if NETFRAMEWORK using MsieJavaScriptEngine.ActiveScript; #endif using MsieJavaScriptEngine.Helpers; @@ -93,7 +93,7 @@ public MsieJsEngine(JsEngineSettings settings) { processedEngineMode = JsEngineMode.ChakraIeJsRt; } -#if !NETSTANDARD +#if NETFRAMEWORK else if (ChakraActiveScriptJsEngine.IsSupported()) { processedEngineMode = JsEngineMode.ChakraActiveScript; @@ -106,7 +106,7 @@ public MsieJsEngine(JsEngineSettings settings) else { throw new JsEngineLoadException( -#if NETSTANDARD +#if !NETFRAMEWORK NetCoreStrings.Engine_JsEnginesNotFound #else NetFrameworkStrings.Engine_JsEnginesNotFound @@ -173,7 +173,7 @@ public MsieJsEngine(JsEngineSettings settings) break; case JsEngineMode.ChakraActiveScript: -#if !NETSTANDARD +#if NETFRAMEWORK if (previousMode != JsEngineMode.ChakraEdgeJsRt) { @@ -196,7 +196,7 @@ public MsieJsEngine(JsEngineSettings settings) string.Format(NetCoreStrings.Usage_JsEngineModeNotCompatibleWithNetCore, processedEngineMode)); #endif case JsEngineMode.Classic: -#if !NETSTANDARD +#if NETFRAMEWORK _jsEngine = new ClassicActiveScriptJsEngine(processedSettings); break; diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 4b344cd..2a38092 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.8 - net461;netcoreapp2.1;netcoreapp3.1;net5.0 + net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Exe true false @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 8f56204..c31cadc 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.8 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index d0be18d..ae0899d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 2689d86..a0122f6 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.8 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 7432557..a573ce2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.8 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 4900563..278d70d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 6cbda00..dc8382d 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.8 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true true @@ -14,9 +14,9 @@ - + - + From 0641103e7a0aafaf0c6586c500b22107966b2191 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 20 Jul 2022 20:23:20 +0300 Subject: [PATCH 200/238] Now a case-sensitive cultural postfixes are used in the names of `.resx` files. --- global.json | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- ...gs.ru-ru.Designer.cs => CommonStrings.ru-RU.Designer.cs} | 0 .../{CommonStrings.ru-ru.resx => CommonStrings.ru-RU.resx} | 0 src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 6 +++--- 11 files changed, 11 insertions(+), 11 deletions(-) rename src/MsieJavaScriptEngine/Resources/{CommonStrings.ru-ru.Designer.cs => CommonStrings.ru-RU.Designer.cs} (100%) rename src/MsieJavaScriptEngine/Resources/{CommonStrings.ru-ru.resx => CommonStrings.ru-RU.resx} (100%) diff --git a/global.json b/global.json index 0470208..b1927b6 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "6.0.100" + "version": "6.0.302" } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index e5b0d4e..60bbe63 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Improved a implementation of the `Dispose` method. + Now a case-sensitive cultural postfixes are used in the names of `.resx` files. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.Designer.cs similarity index 100% rename from src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.Designer.cs rename to src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.Designer.cs diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx similarity index 100% rename from src/MsieJavaScriptEngine/Resources/CommonStrings.ru-ru.resx rename to src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index ef50405..80425a7 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Improved a implementation of the `Dispose` method. + Now a case-sensitive cultural postfixes are used in the names of `.resx` files. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index c31cadc..1dbf26e 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index ae0899d..c6a3f62 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index a0122f6..9985f94 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index a573ce2..fb64d69 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 278d70d..9910c1d 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index dc8382d..37108ac 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -14,9 +14,9 @@ - - - + + + From eac1f2eec2a73b5591bee245e723ac84740c6e2b Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 20 Jul 2022 20:50:50 +0300 Subject: [PATCH 201/238] Version 3.0.9 --- CHANGELOG.md | 3 +++ LICENSE.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 12 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2474aa..1cdc77c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.9 - July 20, 2022 + * Now a case-sensitive cultural postfixes are used in the names of `.resx` files + ## v3.0.8 - August 8, 2021 * Improved a implementation of the `Dispose` method diff --git a/LICENSE.txt b/LICENSE.txt index 15d3451..1b36598 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2021 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2022 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index 6bec7b5..d5c9126 100644 --- a/build/common.props +++ b/build/common.props @@ -1,5 +1,5 @@ - Copyright © 2012-2021 Andrey Taritsyn + Copyright © 2012-2022 Andrey Taritsyn \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 60bbe63..41be737 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.8 + 3.0.9 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 80425a7..cc7c084 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.8 + README file for MSIE JavaScript Engine for .NET v3.0.9 -------------------------------------------------------------------------------- - Copyright (c) 2012-2021 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2022 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 2a38092..1aac48a 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.8 + 3.0.9 net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 1dbf26e..317e66d 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.8 + 3.0.9 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index c6a3f62..d9e4e79 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.8 + 3.0.9 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 9985f94..3ef9c86 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.8 + 3.0.9 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index fb64d69..cb0695e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.8 + 3.0.9 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 9910c1d..f52c8c2 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.8 + 3.0.9 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 37108ac..e975c23 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.8 + 3.0.9 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 Library true From 1d02b1d03f872a2786ace5e0841d5b424ee19d8a Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 1 Feb 2023 20:17:39 +0300 Subject: [PATCH 202/238] In test projects added support of .NET 7 --- global.json | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 10 ++++++++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 4 ++-- ...eJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 13 ++++++++++--- 8 files changed, 27 insertions(+), 14 deletions(-) diff --git a/global.json b/global.json index b1927b6..9b92080 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "6.0.302" + "version": "7.0.102" } } diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 1aac48a..af6ac85 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.9 - net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe true false @@ -12,9 +12,15 @@ + + + + + - + + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 317e66d..6e1f695 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.9 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index d9e4e79..c5f970f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 3ef9c86..39c76fd 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.9 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index cb0695e..8fcf9b5 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.9 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true true @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index f52c8c2..d3a58ce 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -13,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index e975c23..e06979a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Common Tests 3.0.9 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true true @@ -14,13 +14,20 @@ - + - + + + + + + + + From c87e8a7e06aa9c1ecd44cd7f7ffeca4fe68cfd01 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 1 Feb 2023 20:40:37 +0300 Subject: [PATCH 203/238] Suppressed a build warning `NETSSDK1138` --- .../MsieJavaScriptEngine.Benchmarks.csproj | 1 + .../MsieJavaScriptEngine.Test.Auto.csproj | 1 + .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 1 + .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 1 + .../MsieJavaScriptEngine.Test.Common.csproj | 1 + 5 files changed, 5 insertions(+) diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index af6ac85..86c8be2 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -7,6 +7,7 @@ Exe true false + false diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 6e1f695..18f1911 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -8,6 +8,7 @@ true true false + false diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 39c76fd..f15fed9 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -8,6 +8,7 @@ true true false + false diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 8fcf9b5..dea7979 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -8,6 +8,7 @@ true true false + false diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index e06979a..85710b4 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -8,6 +8,7 @@ true true false + false From bf3a8c3aa4415aab32fa88c6e0992ebbf0f85fa2 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Thu, 2 Feb 2023 19:23:00 +0300 Subject: [PATCH 204/238] Simplified a names of tests --- .../CommonTests.cs | 18 ++--- .../InteropTests.cs | 2 +- .../CommonTests.cs | 18 ++--- .../InteropTests.cs | 2 +- .../PrecompilationTests.cs | 8 +- .../CommonTests.cs | 18 ++--- .../InteropTests.cs | 2 +- .../PrecompilationTests.cs | 8 +- .../CommonTests.cs | 18 ++--- .../Es5Tests.cs | 2 +- .../InteropTests.cs | 2 +- .../CommonTestsBase.cs | 78 +++++++++--------- .../ErrorFormattingTests.cs | 2 +- .../Es5TestsBase.cs | 38 ++++----- .../InteropTestsBase.cs | 80 +++++++++---------- .../MultithreadingTestsBase.cs | 2 +- .../PrecompilationTestsBase.cs | 8 +- .../ValidationTests.cs | 8 +- 18 files changed, 157 insertions(+), 157 deletions(-) diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index e7a0e0d..a3d4893 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -17,7 +17,7 @@ public class CommonTests : CommonTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -53,7 +53,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() { // Arrange const string input = @"var $variable1 = 611; @@ -89,7 +89,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorr } [Test] - public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -126,7 +126,7 @@ public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -168,7 +168,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() { // Arrange const string input = @"function factorial(value) { @@ -210,7 +210,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() } [Test] - public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -257,7 +257,7 @@ public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"var arr = []; @@ -287,7 +287,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugMode() { // Arrange const string input = @"var arr = []; @@ -317,7 +317,7 @@ public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function foo(x, y) { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs index 27b4b4c..d6c6443 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -20,7 +20,7 @@ public class InteropTests : InteropTestsBase #region Mapping of errors [Test] - public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 0afc7e8..8549729 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -18,7 +18,7 @@ public class CommonTests : CommonTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -54,7 +54,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() { // Arrange const string input = @"var $variable1 = 611; @@ -90,7 +90,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorr } [Test] - public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -127,7 +127,7 @@ public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -169,7 +169,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() } [Test] - public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() { // Arrange const string input = @"function factorial(value) { @@ -211,7 +211,7 @@ public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCor } [Test] - public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -262,7 +262,7 @@ public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"var arr = []; @@ -292,7 +292,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugMode() { // Arrange const string input = @"var arr = []; @@ -322,7 +322,7 @@ public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function foo(x, y) { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index 6cbb8fb..35e22de 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -46,7 +46,7 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() #region Mapping of errors [Test] - public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs index 4d40573..2b0bd53 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/PrecompilationTests.cs @@ -18,7 +18,7 @@ public class PrecompilationTests : PrecompilationTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringPrecompilationOfCodeIsCorrect() + public void MappingCompilationErrorDuringPrecompilationOfCode() { // Arrange const string input = @"function guid() { @@ -63,7 +63,7 @@ function s4() { } [Test] - public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfPrecompiledCode() { // Arrange const string input = @"function getItem(items, itemIndex) { @@ -118,7 +118,7 @@ public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"function makeId(length) { @@ -159,7 +159,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function getFullName(firstName, lastName) { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index 770e9a4..2c34764 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -17,7 +17,7 @@ public class CommonTests : CommonTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -53,7 +53,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() { // Arrange const string input = @"var $variable1 = 611; @@ -89,7 +89,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorr } [Test] - public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -126,7 +126,7 @@ public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -168,7 +168,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() } [Test] - public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() { // Arrange const string input = @"function factorial(value) { @@ -210,7 +210,7 @@ public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCor } [Test] - public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -261,7 +261,7 @@ public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"var arr = []; @@ -291,7 +291,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugMode() { // Arrange const string input = @"var arr = []; @@ -321,7 +321,7 @@ public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function foo(x, y) { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index e55b5e6..c4cf210 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -46,7 +46,7 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() #region Mapping of errors [Test] - public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs index 5b9cdc4..b9f9b7c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/PrecompilationTests.cs @@ -17,7 +17,7 @@ public class PrecompilationTests : PrecompilationTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringPrecompilationOfCodeIsCorrect() + public void MappingCompilationErrorDuringPrecompilationOfCode() { // Arrange const string input = @"function guid() { @@ -62,7 +62,7 @@ function s4() { } [Test] - public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfPrecompiledCode() { // Arrange const string input = @"function getItem(items, itemIndex) { @@ -117,7 +117,7 @@ public void MappingRuntimeErrorDuringExecutionOfPrecompiledCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"function makeId(length) { @@ -158,7 +158,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function getFullName(firstName, lastName) { diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index f070a05..43b314c 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -17,7 +17,7 @@ public class CommonTests : CommonTestsBase #region Mapping of errors [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -53,7 +53,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorrect() + public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() { // Arrange const string input = @"var $variable1 = 611; @@ -89,7 +89,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugModeIsCorr } [Test] - public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() + public void MappingRuntimeErrorDuringEvaluationOfExpression() { // Arrange const string input = @"var $variable1 = 611; @@ -126,7 +126,7 @@ public void MappingRuntimeErrorDuringEvaluationOfExpressionIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -168,7 +168,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeIsCorrect() } [Test] - public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() + public void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() { // Arrange const string input = @"function factorial(value) { @@ -210,7 +210,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeInDebugModeIsCorrect() } [Test] - public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() + public void MappingRuntimeErrorDuringExecutionOfCode() { // Arrange const string input = @"function factorial(value) { @@ -257,7 +257,7 @@ public void MappingRuntimeErrorDuringExecutionOfCodeIsCorrect() #region Generation of error messages [Test] - public void GenerationOfCompilationErrorMessageIsCorrect() + public void GenerationOfCompilationErrorMessage() { // Arrange const string input = @"var arr = []; @@ -287,7 +287,7 @@ public void GenerationOfCompilationErrorMessageIsCorrect() } [Test] - public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() + public void GenerationOfCompilationErrorMessageInDebugMode() { // Arrange const string input = @"var arr = []; @@ -317,7 +317,7 @@ public void GenerationOfCompilationErrorMessageInDebugModeIsCorrect() } [Test] - public void GenerationOfRuntimeErrorMessageIsCorrect() + public void GenerationOfRuntimeErrorMessage() { // Arrange const string input = @"function foo(x, y) { diff --git a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs index b447707..9ab2544 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/Es5Tests.cs @@ -15,7 +15,7 @@ public class Es5Tests : Es5TestsBase #region Object methods [Test] - public override void ObjectKeysMethodIsSupported() + public override void SupportsObjectKeysMethod() { // Arrange const string input1 = "Object.keys(['a', 'b', 'c']).toString();"; diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs index 23997cc..41d91a0 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -20,7 +20,7 @@ public class InteropTests : InteropTestsBase #region Mapping of errors [Test] - public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 71485fc..666be5f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -15,7 +15,7 @@ public abstract class CommonTestsBase : FileSystemTestsBase #region Creation of engines [Test] - public virtual void CreationOfEngineWithoutDisposingIsCorrect() + public virtual void CreationOfEngineWithoutDisposing() { MsieJsEngine jsEngine = CreateJsEngine(); jsEngine.Execute("var a = 1 + 1;"); @@ -26,7 +26,7 @@ public virtual void CreationOfEngineWithoutDisposingIsCorrect() #region Evaluation of scripts [Test] - public virtual void EvaluationOfExpressionWithUndefinedResultIsCorrect() + public virtual void EvaluationOfExpressionWithUndefinedResult() { // Arrange const string input = "undefined"; @@ -45,7 +45,7 @@ public virtual void EvaluationOfExpressionWithUndefinedResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithNullResultIsCorrect() + public virtual void EvaluationOfExpressionWithNullResult() { // Arrange const string input = "null"; @@ -64,7 +64,7 @@ public virtual void EvaluationOfExpressionWithNullResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithBooleanResultIsCorrect() + public virtual void EvaluationOfExpressionWithBooleanResult() { // Arrange const string input1 = "7 > 5"; @@ -89,7 +89,7 @@ public virtual void EvaluationOfExpressionWithBooleanResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithIntegerResultIsCorrect() + public virtual void EvaluationOfExpressionWithIntegerResult() { // Arrange const string input = "7 * 8 - 20"; @@ -108,7 +108,7 @@ public virtual void EvaluationOfExpressionWithIntegerResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithDoubleResultIsCorrect() + public virtual void EvaluationOfExpressionWithDoubleResult() { // Arrange const string input = "Math.PI + 0.22"; @@ -127,7 +127,7 @@ public virtual void EvaluationOfExpressionWithDoubleResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithStringResultIsCorrect() + public virtual void EvaluationOfExpressionWithStringResult() { // Arrange const string input = "'Hello, ' + \"Vasya\" + '?';"; @@ -146,7 +146,7 @@ public virtual void EvaluationOfExpressionWithStringResultIsCorrect() } [Test] - public virtual void EvaluationOfExpressionWithUnicodeStringResultIsCorrect() + public virtual void EvaluationOfExpressionWithUnicodeStringResult() { // Arrange const string input = "'Привет, ' + \"Вася\" + '?';"; @@ -169,7 +169,7 @@ public virtual void EvaluationOfExpressionWithUnicodeStringResultIsCorrect() #region Execution of scripts [Test] - public virtual void ExecutionOfCodeIsCorrect() + public virtual void ExecutionOfCode() { // Arrange const string functionCode = @"function add(num1, num2) { @@ -192,7 +192,7 @@ public virtual void ExecutionOfCodeIsCorrect() } [Test] - public virtual void ExecutionOfFileIsCorrect() + public virtual void ExecutionOfFile() { // Arrange string filePath = GetAbsolutePath("SharedFiles/square.js"); @@ -213,7 +213,7 @@ public virtual void ExecutionOfFileIsCorrect() } [Test] - public virtual void ExecutionOfResourceByNameAndTypeIsCorrect() + public virtual void ExecutionOfResourceByNameAndType() { // Arrange const string resourceName = "Resources.cube.js"; @@ -234,7 +234,7 @@ public virtual void ExecutionOfResourceByNameAndTypeIsCorrect() } [Test] - public virtual void ExecutionOfResourceByNameAndAssemblyIsCorrect() + public virtual void ExecutionOfResourceByNameAndAssembly() { // Arrange const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.power.js"; @@ -264,7 +264,7 @@ public virtual void ExecutionOfResourceByNameAndAssemblyIsCorrect() #region Calling of functions [Test] - public virtual void CallingOfFunctionWithoutParametersIsCorrect() + public virtual void CallingOfFunctionWithoutParameters() { // Arrange const string functionCode = @"function hooray() { @@ -286,7 +286,7 @@ public virtual void CallingOfFunctionWithoutParametersIsCorrect() } [Test] - public virtual void CallingOfFunctionWithUndefinedResultIsCorrect() + public virtual void CallingOfFunctionWithUndefinedResult() { // Arrange const string functionCode = @"function testUndefined(value) { @@ -312,7 +312,7 @@ public virtual void CallingOfFunctionWithUndefinedResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithNullResultIsCorrect() + public virtual void CallingOfFunctionWithNullResult() { // Arrange const string functionCode = @"function testNull(value) { @@ -338,7 +338,7 @@ public virtual void CallingOfFunctionWithNullResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithBooleanResultIsCorrect() + public virtual void CallingOfFunctionWithBooleanResult() { // Arrange const string functionCode = @"function inverse(value) { @@ -361,7 +361,7 @@ public virtual void CallingOfFunctionWithBooleanResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithIntegerResultIsCorrect() + public virtual void CallingOfFunctionWithIntegerResult() { // Arrange const string functionCode = @"function negate(value) { @@ -384,7 +384,7 @@ public virtual void CallingOfFunctionWithIntegerResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithDoubleResultIsCorrect() + public virtual void CallingOfFunctionWithDoubleResult() { // Arrange const string functionCode = @"function triple(value) { @@ -407,7 +407,7 @@ public virtual void CallingOfFunctionWithDoubleResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithStringResultIsCorrect() + public virtual void CallingOfFunctionWithStringResult() { // Arrange const string functionCode = @"function greeting(name) { @@ -430,7 +430,7 @@ public virtual void CallingOfFunctionWithStringResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithUnicodeStringResultIsCorrect() + public virtual void CallingOfFunctionWithUnicodeStringResult() { // Arrange const string functionCode = @"function privet(name) { @@ -453,7 +453,7 @@ public virtual void CallingOfFunctionWithUnicodeStringResultIsCorrect() } [Test] - public virtual void CallingOfFunctionWithManyParametersIsCorrect() + public virtual void CallingOfFunctionWithManyParameters() { // Arrange const string functionCode = @"function determineArgumentsTypes() { @@ -487,7 +487,7 @@ public virtual void CallingOfFunctionWithManyParametersIsCorrect() } [Test] - public virtual void CallingOfFunctionWithManyParametersAndBooleanResultIsCorrect() + public virtual void CallingOfFunctionWithManyParametersAndBooleanResult() { // Arrange const string functionCode = @"function and() { @@ -525,7 +525,7 @@ public virtual void CallingOfFunctionWithManyParametersAndBooleanResultIsCorrect } [Test] - public virtual void CallingOfFunctionWithManyParametersAndIntegerResultIsCorrect() + public virtual void CallingOfFunctionWithManyParametersAndIntegerResult() { // Arrange const string functionCode = @"function sum() { @@ -555,7 +555,7 @@ public virtual void CallingOfFunctionWithManyParametersAndIntegerResultIsCorrect } [Test] - public virtual void CallingOfFunctionWithManyParametersAndDoubleResultIsCorrect() + public virtual void CallingOfFunctionWithManyParametersAndDoubleResult() { // Arrange const string functionCode = @"function sum() { @@ -585,7 +585,7 @@ public virtual void CallingOfFunctionWithManyParametersAndDoubleResultIsCorrect( } [Test] - public virtual void CallingOfFunctionWithManyParametersAndStringResultIsCorrect() + public virtual void CallingOfFunctionWithManyParametersAndStringResult() { // Arrange const string functionCode = @"function concatenate() { @@ -615,7 +615,7 @@ public virtual void CallingOfFunctionWithManyParametersAndStringResultIsCorrect( } [Test] - public virtual void CallingOfFunctionWithManyParametersAndUnicodeStringResultIsCorrect() + public virtual void CallingOfFunctionWithManyParametersAndUnicodeStringResult() { // Arrange const string functionCode = @"function obedinit() { @@ -645,7 +645,7 @@ public virtual void CallingOfFunctionWithManyParametersAndUnicodeStringResultIsC } [Test] - public virtual void CallingOfFunctionWithNameContainingUnicodeCharactersIsCorrect() + public virtual void CallingOfFunctionWithNameContainingUnicodeCharacters() { // Arrange const string functionCode = @"function сумма(число1, число2) { @@ -672,7 +672,7 @@ public virtual void CallingOfFunctionWithNameContainingUnicodeCharactersIsCorrec #region Getting, setting and removing variables [Test] - public virtual void SettingAndGettingVariableWithUndefinedValueIsCorrect() + public virtual void SettingAndGettingVariableWithUndefinedValue() { // Arrange const string variableName = "myVar1"; @@ -695,7 +695,7 @@ public virtual void SettingAndGettingVariableWithUndefinedValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithNullValueIsCorrect() + public virtual void SettingAndGettingVariableWithNullValue() { // Arrange const string variableName = "myVar2"; @@ -718,7 +718,7 @@ public virtual void SettingAndGettingVariableWithNullValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithBooleanValueIsCorrect() + public virtual void SettingAndGettingVariableWithBooleanValue() { // Arrange const string variableName = "isVisible"; @@ -752,7 +752,7 @@ public virtual void SettingAndGettingVariableWithBooleanValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithIntegerValueIsCorrect() + public virtual void SettingAndGettingVariableWithIntegerValue() { // Arrange const string variableName = "amount"; @@ -786,7 +786,7 @@ public virtual void SettingAndGettingVariableWithIntegerValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithDoubleValueIsCorrect() + public virtual void SettingAndGettingVariableWithDoubleValue() { // Arrange const string variableName = "price"; @@ -820,7 +820,7 @@ public virtual void SettingAndGettingVariableWithDoubleValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithStringValueIsCorrect() + public virtual void SettingAndGettingVariableWithStringValue() { // Arrange const string variableName = "word"; @@ -854,7 +854,7 @@ public virtual void SettingAndGettingVariableWithStringValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithUnicodeStringValueIsCorrect() + public virtual void SettingAndGettingVariableWithUnicodeStringValue() { // Arrange const string variableName = "slovo"; @@ -888,7 +888,7 @@ public virtual void SettingAndGettingVariableWithUnicodeStringValueIsCorrect() } [Test] - public virtual void SettingAndGettingVariableWithNameContainingUnicodeCharactersIsCorrect() + public virtual void SettingAndGettingVariableWithNameContainingUnicodeCharacters() { // Arrange const string variableName = "слово"; @@ -922,7 +922,7 @@ public virtual void SettingAndGettingVariableWithNameContainingUnicodeCharacters } [Test] - public virtual void RemovingVariableIsCorrect() + public virtual void RemovingVariable() { // Arrange const string variableName = "price"; @@ -946,7 +946,7 @@ public virtual void RemovingVariableIsCorrect() } [Test] - public virtual void RemovingVariableWithNameContainingUnicodeCharactersIsCorrect() + public virtual void RemovingVariableWithNameContainingUnicodeCharacters() { // Arrange const string variableName = "цена"; @@ -974,7 +974,7 @@ public virtual void RemovingVariableWithNameContainingUnicodeCharactersIsCorrect #region Script interruption [Test] - public virtual void ScriptInterruptionIsCorrect() + public virtual void ScriptInterruption() { // Arrange const string sleepyСode = @"function sleep(millisecondsTimeout) { @@ -1029,7 +1029,7 @@ public virtual void ScriptInterruptionIsCorrect() #region Garbage collection [Test] - public virtual void GarbageCollectionIsCorrect() + public virtual void GarbageCollection() { // Arrange const string input = @"arr = []; for (i = 0; i < 1000000; i++) { arr.push(arr); }"; diff --git a/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs index bcd0519..b3551c0 100644 --- a/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ErrorFormattingTests.cs @@ -8,7 +8,7 @@ namespace MsieJavaScriptEngine.Test.Common public class ErrorFormattingTests { [Test] - public void GettingSourceFragmentFromLineIsCorrect() + public void GettingSourceFragmentFromLine() { // Arrange const string input1 = ""; diff --git a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs index 327f0eb..ca95a34 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs @@ -10,7 +10,7 @@ public abstract class Es5TestsBase : TestsBase #region Array methods [Test] - public virtual void ArrayEveryMethodIsSupported() + public virtual void SupportsArrayEveryMethod() { // Arrange const string initCode = "var engines = ['Chakra', 'V8', 'SpiderMonkey', 'Jurassic'];"; @@ -39,7 +39,7 @@ public virtual void ArrayEveryMethodIsSupported() } [Test] - public virtual void ArrayFilterMethodIsSupported() + public virtual void SupportsArrayFilterMethod() { // Arrange const string initCode = "var engines = ['Chakra', 'V8', 'SpiderMonkey', 'Jurassic'];"; @@ -65,7 +65,7 @@ public virtual void ArrayFilterMethodIsSupported() } [Test] - public virtual void ArrayForEachMethodIsSupported() + public virtual void SupportsArrayForEachMethod() { // Arrange const string resultVariableName = "enginesString"; @@ -95,7 +95,7 @@ public virtual void ArrayForEachMethodIsSupported() } [Test] - public virtual void ArrayIndexOfMethodIsSupported() + public virtual void SupportsArrayIndexOfMethod() { // Arrange const string initCode = "var arr = [2, 5, 9, 2]"; @@ -154,7 +154,7 @@ public virtual void ArrayIndexOfMethodIsSupported() } [Test] - public virtual void ArrayIsArrayMethodIsSupported() + public virtual void SupportsArrayIsArrayMethod() { // Arrange const string input1 = "Array.isArray({ length: 0 });"; @@ -179,7 +179,7 @@ public virtual void ArrayIsArrayMethodIsSupported() } [Test] - public virtual void ArrayLastIndexOfMethodIsSupported() + public virtual void SupportsArrayLastIndexOfMethod() { // Arrange const string initCode = "var arr = [2, 5, 9, 2]"; @@ -238,7 +238,7 @@ public virtual void ArrayLastIndexOfMethodIsSupported() } [Test] - public virtual void ArrayMapMethodIsSupported() + public virtual void SupportsArrayMapMethod() { // Arrange const string initCode = "var engines = ['Chakra', 'V8', 'SpiderMonkey', 'Jurassic'];"; @@ -264,7 +264,7 @@ public virtual void ArrayMapMethodIsSupported() } [Test] - public virtual void ArrayReduceMethodIsSupported() + public virtual void SupportsArrayReduceMethod() { // Arrange const string input1 = @"[1, 2, 3, 4, 5].reduce(function (accum, value, index, array) { @@ -293,7 +293,7 @@ public virtual void ArrayReduceMethodIsSupported() } [Test] - public virtual void ArrayReduceRightMethodIsSupported() + public virtual void SupportsArrayReduceRightMethod() { // Arrange const string input1 = @"[1, 2, 3, 4, 5].reduceRight(function (accum, value, index, array) { @@ -322,7 +322,7 @@ public virtual void ArrayReduceRightMethodIsSupported() } [Test] - public virtual void ArraySomeMethodIsSupported() + public virtual void SupportsArraySomeMethod() { // Arrange const string initCode = "var engines = ['Chakra', 'V8', 'SpiderMonkey', 'Jurassic'];"; @@ -348,7 +348,7 @@ public virtual void ArraySomeMethodIsSupported() #region Date methods [Test] - public virtual void DateNowMethodIsSupported() + public virtual void SupportsDateNowMethod() { // Arrange const string input = "Date.now();"; @@ -367,7 +367,7 @@ public virtual void DateNowMethodIsSupported() } [Test] - public virtual void DateToIsoStringMethodIsSupported() + public virtual void SupportsDateToIsoStringMethod() { // Arrange const string input = @"(new Date(1386696984000)).toISOString();"; @@ -390,7 +390,7 @@ public virtual void DateToIsoStringMethodIsSupported() #region Function methods [Test] - public virtual void FunctionBindIsSupported() + public virtual void SupportsFunctionBindMethod() { // Arrange const string initCode = @"var a = 5, @@ -429,7 +429,7 @@ public virtual void FunctionBindIsSupported() #region JSON methods [Test] - public virtual void JsonParseMethodIsSupported() + public virtual void SupportsJsonParseMethod() { // Arrange const string initCode = "var obj = JSON.parse('{ \"foo\": \"bar\" }');"; @@ -450,7 +450,7 @@ public virtual void JsonParseMethodIsSupported() } [Test] - public virtual void JsonStringifyMethodIsSupported() + public virtual void SupportsJsonStringifyMethod() { // Arrange const string initCode = @"var obj = new Object(); @@ -476,7 +476,7 @@ public virtual void JsonStringifyMethodIsSupported() #region Object methods [Test] - public virtual void ObjectCreateMethodIsSupported() + public virtual void SupportsObjectCreateMethod() { // Arrange const string initCode1 = "var obj1 = Object.create(null);"; @@ -531,7 +531,7 @@ public virtual void ObjectCreateMethodIsSupported() } [Test] - public virtual void ObjectKeysMethodIsSupported() + public virtual void SupportsObjectKeysMethod() { // Arrange const string input1 = "Object.keys(['a', 'b', 'c']).toString();"; @@ -578,7 +578,7 @@ public virtual void ObjectKeysMethodIsSupported() #region String methods [Test] - public virtual void StringSplitMethodIsCorrect() + public virtual void SupportsStringSplitMethod() { // Arrange const string input1 = "'aaaa'.split(/a/).length;"; @@ -609,7 +609,7 @@ public virtual void StringSplitMethodIsCorrect() } [Test] - public virtual void StringTrimMethodIsSupported() + public virtual void SupportsStringTrimMethod() { // Arrange const string input = "' foo '.trim();"; diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 62b5935..9bd2684 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -21,7 +21,7 @@ public abstract class InteropTestsBase : FileSystemTestsBase #region Objects with fields [Test] - public virtual void EmbeddingOfInstanceOfCustomValueTypeWithFieldsIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithFields() { // Arrange var date = new Date(2015, 12, 29); @@ -58,7 +58,7 @@ public virtual void EmbeddingOfInstanceOfCustomValueTypeWithFieldsIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFieldsIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFields() { // Arrange var product = new Product @@ -106,7 +106,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFieldsIsCorrect( #region Objects with properties [Test] - public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithPropertiesIsCorrect() + public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithProperties() { // Arrange var timeSpan = new TimeSpan(4840780000000); @@ -147,7 +147,7 @@ public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithPropertiesIsCorrect } [Test] - public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithPropertiesIsCorrect() + public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithProperties() { // Arrange var uri = new Uri("https://github.com/Taritsyn/MsieJavaScriptEngine"); @@ -182,7 +182,7 @@ public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithPropertiesIsCor } [Test] - public virtual void EmbeddingOfInstanceOfCustomValueTypeWithPropertiesIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithProperties() { // Arrange var temperature = new Temperature(-17.3, TemperatureUnits.Celsius); @@ -217,7 +217,7 @@ public virtual void EmbeddingOfInstanceOfCustomValueTypeWithPropertiesIsCorrect( } [Test] - public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithProperties() { // Arrange var person = new Person("Vanya", "Ivanov"); @@ -255,7 +255,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithPropertiesIsCorr } [Test] - public virtual void EmbeddingOfInstanceOfAnonymousTypeWithPropertiesIsCorrect() + public virtual void EmbeddingOfInstanceOfAnonymousTypeWithProperties() { // Arrange var person = new @@ -323,7 +323,7 @@ public virtual void EmbeddingOfInstanceOfAnonymousTypeWithPropertiesIsCorrect() #region Objects with methods [Test] - public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithMethodsIsCorrect() + public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithMethods() { // Arrange var color = Color.FromArgb(84, 139, 212); @@ -358,7 +358,7 @@ public virtual void EmbeddingOfInstanceOfBuiltinValueTypeWithMethodsIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithMethodIsCorrect() + public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithMethod() { // Arrange var random = new Random(); @@ -380,7 +380,7 @@ public virtual void EmbeddingOfInstanceOfBuiltinReferenceTypeWithMethodIsCorrect } [Test] - public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethodsIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethods() { // Arrange var programmerDayDate = new Date(2015, 9, 13); @@ -409,7 +409,7 @@ public virtual void EmbeddingOfInstanceOfCustomValueTypeWithMethodsIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect() + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethod() { // Arrange var fileManager = new FileManager(); @@ -432,7 +432,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethodIsCorrect( } [Test] - public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameterIsCorrect() + public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameter() { // Arrange var animalTrainer = new AnimalTrainer(); @@ -468,7 +468,7 @@ public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameterIs #region Delegates [Test] - public virtual void EmbeddingOfInstanceOfDelegateWithoutParametersIsCorrect() + public virtual void EmbeddingOfInstanceOfDelegateWithoutParameters() { // Arrange var generateRandomStringFunc = new Func(() => @@ -507,7 +507,7 @@ public virtual void EmbeddingOfInstanceOfDelegateWithoutParametersIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfDelegateWithOneParameterIsCorrect() + public virtual void EmbeddingOfInstanceOfDelegateWithOneParameter() { // Arrange var squareFunc = new Func(a => a * a); @@ -529,7 +529,7 @@ public virtual void EmbeddingOfInstanceOfDelegateWithOneParameterIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfDelegateWithTwoParametersIsCorrect() + public virtual void EmbeddingOfInstanceOfDelegateWithTwoParameters() { // Arrange var sumFunc = new Func((a, b) => a + b); @@ -551,7 +551,7 @@ public virtual void EmbeddingOfInstanceOfDelegateWithTwoParametersIsCorrect() } [Test] - public virtual void EmbeddingOfInstanceOfDelegateWithoutResultIsCorrect() + public virtual void EmbeddingOfInstanceOfDelegateWithoutResult() { // Arrange var logBuilder = new StringBuilder(); @@ -651,7 +651,7 @@ public virtual void CallingOfEmbeddedDelegateWithExtraParameter() #region Integration [Test] - public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCorrect() + public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstances() { // Arrange var informaticsDayDate = new Date(2015, 12, 4); @@ -702,7 +702,7 @@ public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCo #region Recursive calls [Test] - public virtual void RecursiveEvaluationOfFilesIsCorrect() + public virtual void RecursiveEvaluationOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/noError"); @@ -731,7 +731,7 @@ public virtual void RecursiveEvaluationOfFilesIsCorrect() } [Test] - public virtual void RecursiveExecutionOfFilesIsCorrect() + public virtual void RecursiveExecutionOfFiles() { // Arrange string directoryPath = GetAbsolutePath("SharedFiles/recursiveExecution/noError"); @@ -761,7 +761,7 @@ public virtual void RecursiveExecutionOfFilesIsCorrect() #region Removal [Test] - public virtual void RemovingOfEmbeddedInstanceOfCustomReferenceTypeIsCorrect() + public virtual void RemovingOfEmbeddedInstanceOfCustomReferenceType() { // Arrange var person = new Person("Vasya", "Pupkin"); @@ -797,7 +797,7 @@ public virtual void RemovingOfEmbeddedInstanceOfCustomReferenceTypeIsCorrect() #region Creating of instances [Test] - public virtual void CreatingAnInstanceOfEmbeddedBuiltinValueTypeIsCorrect() + public virtual void CreatingAnInstanceOfEmbeddedBuiltinValueType() { // Arrange Type pointType = typeof(Point); @@ -819,7 +819,7 @@ public virtual void CreatingAnInstanceOfEmbeddedBuiltinValueTypeIsCorrect() } [Test] - public virtual void CreatingAnInstanceOfEmbeddedBuiltinReferenceTypeIsCorrect() + public virtual void CreatingAnInstanceOfEmbeddedBuiltinReferenceType() { // Arrange Type uriType = typeof(Uri); @@ -845,7 +845,7 @@ public virtual void CreatingAnInstanceOfEmbeddedBuiltinReferenceTypeIsCorrect() } [Test] - public virtual void CreatingAnInstanceOfEmbeddedCustomValueTypeIsCorrect() + public virtual void CreatingAnInstanceOfEmbeddedCustomValueType() { // Arrange Type point3DType = typeof(Point3D); @@ -867,7 +867,7 @@ public virtual void CreatingAnInstanceOfEmbeddedCustomValueTypeIsCorrect() } [Test] - public virtual void CreatingAnInstanceOfEmbeddedCustomReferenceTypeIsCorrect() + public virtual void CreatingAnInstanceOfEmbeddedCustomReferenceType() { // Arrange Type personType = typeof(Person); @@ -893,7 +893,7 @@ public virtual void CreatingAnInstanceOfEmbeddedCustomReferenceTypeIsCorrect() #region Types with constants [Test] - public virtual void EmbeddingOfBuiltinReferenceTypeWithConstantsIsCorrect() + public virtual void EmbeddingOfBuiltinReferenceTypeWithConstants() { // Arrange Type mathType = typeof(Math); @@ -922,7 +922,7 @@ public virtual void EmbeddingOfBuiltinReferenceTypeWithConstantsIsCorrect() } [Test] - public virtual void EmbeddingOfCustomValueTypeWithConstantsIsCorrect() + public virtual void EmbeddingOfCustomValueTypeWithConstants() { // Arrange Type predefinedStringsType = typeof(PredefinedStrings); @@ -957,7 +957,7 @@ public virtual void EmbeddingOfCustomValueTypeWithConstantsIsCorrect() } [Test] - public virtual void EmbeddingOfCustomReferenceTypeWithConstantIsCorrect() + public virtual void EmbeddingOfCustomReferenceTypeWithConstant() { // Arrange Type base64EncoderType = typeof(Base64Encoder); @@ -983,7 +983,7 @@ public virtual void EmbeddingOfCustomReferenceTypeWithConstantIsCorrect() #region Types with fields [Test] - public virtual void EmbeddingOfBuiltinValueTypeWithFieldIsCorrect() + public virtual void EmbeddingOfBuiltinValueTypeWithField() { // Arrange Type guidType = typeof(Guid); @@ -1005,7 +1005,7 @@ public virtual void EmbeddingOfBuiltinValueTypeWithFieldIsCorrect() } [Test] - public virtual void EmbeddingOfBuiltinReferenceTypeWithFieldIsCorrect() + public virtual void EmbeddingOfBuiltinReferenceTypeWithField() { // Arrange Type bitConverterType = typeof(BitConverter); @@ -1027,7 +1027,7 @@ public virtual void EmbeddingOfBuiltinReferenceTypeWithFieldIsCorrect() } [Test] - public virtual void EmbeddingOfCustomValueTypeWithFieldIsCorrect() + public virtual void EmbeddingOfCustomValueTypeWithField() { // Arrange Type point3DType = typeof(Point3D); @@ -1049,7 +1049,7 @@ public virtual void EmbeddingOfCustomValueTypeWithFieldIsCorrect() } [Test] - public virtual void EmbeddingOfCustomReferenceTypeWithFieldIsCorrect() + public virtual void EmbeddingOfCustomReferenceTypeWithField() { // Arrange Type defaultLoggerType = typeof(DefaultLogger); @@ -1080,7 +1080,7 @@ public virtual void EmbeddingOfCustomReferenceTypeWithFieldIsCorrect() #region Types with properties [Test] - public virtual void EmbeddingOfBuiltinValueTypeWithPropertyIsCorrect() + public virtual void EmbeddingOfBuiltinValueTypeWithProperty() { // Arrange Type colorType = typeof(Color); @@ -1102,7 +1102,7 @@ public virtual void EmbeddingOfBuiltinValueTypeWithPropertyIsCorrect() } [Test] - public virtual void EmbeddingOfBuiltinReferenceTypeWithPropertyIsCorrect() + public virtual void EmbeddingOfBuiltinReferenceTypeWithProperty() { // Arrange Type environmentType = typeof(Environment); @@ -1124,7 +1124,7 @@ public virtual void EmbeddingOfBuiltinReferenceTypeWithPropertyIsCorrect() } [Test] - public virtual void EmbeddingOfCustomValueTypeWithPropertyIsCorrect() + public virtual void EmbeddingOfCustomValueTypeWithProperty() { // Arrange Type dateType = typeof(Date); @@ -1157,7 +1157,7 @@ public virtual void EmbeddingOfCustomValueTypeWithPropertyIsCorrect() } [Test] - public virtual void EmbeddingOfCustomReferenceTypeWithPropertyIsCorrect() + public virtual void EmbeddingOfCustomReferenceTypeWithProperty() { // Arrange Type bundleTableType = typeof(BundleTable); @@ -1186,7 +1186,7 @@ public virtual void EmbeddingOfCustomReferenceTypeWithPropertyIsCorrect() #region Types with methods [Test] - public virtual void EmbeddingOfBuiltinValueTypeWithMethodIsCorrect() + public virtual void EmbeddingOfBuiltinValueTypeWithMethod() { // Arrange Type dateTimeType = typeof(DateTime); @@ -1208,7 +1208,7 @@ public virtual void EmbeddingOfBuiltinValueTypeWithMethodIsCorrect() } [Test] - public virtual void EmbeddingOfBuiltinReferenceTypeWithMethodsIsCorrect() + public virtual void EmbeddingOfBuiltinReferenceTypeWithMethods() { // Arrange Type mathType = typeof(Math); @@ -1236,7 +1236,7 @@ public virtual void EmbeddingOfBuiltinReferenceTypeWithMethodsIsCorrect() } [Test] - public virtual void EmbeddingOfCustomValueTypeWithMethodIsCorrect() + public virtual void EmbeddingOfCustomValueTypeWithMethod() { // Arrange var dateType = typeof(Date); @@ -1258,7 +1258,7 @@ public virtual void EmbeddingOfCustomValueTypeWithMethodIsCorrect() } [Test] - public virtual void EmbeddingOfCustomReferenceTypeWithMethodIsCorrect() + public virtual void EmbeddingOfCustomReferenceTypeWithMethod() { // Arrange Type base64EncoderType = typeof(Base64Encoder); @@ -1284,7 +1284,7 @@ public virtual void EmbeddingOfCustomReferenceTypeWithMethodIsCorrect() #region Removal [Test] - public virtual void RemovingOfEmbeddedCustomReferenceTypeIsCorrect() + public virtual void RemovingOfEmbeddedCustomReferenceType() { // Arrange Type personType = typeof(Person); diff --git a/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs index 8849530..2b1311c 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/MultithreadingTestsBase.cs @@ -8,7 +8,7 @@ namespace MsieJavaScriptEngine.Test.Common public abstract class MultithreadingTestsBase : TestsBase { [Test] - public virtual void ExecutionOfCodeFromDifferentThreadsIsCorrect() + public virtual void ExecutionOfCodeFromDifferentThreads() { // Arrange const string variableName = "foo"; diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index 60fe323..b50d472 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -14,7 +14,7 @@ public abstract class PrecompilationTestsBase : FileSystemTestsBase #region Execution of precompiled scripts [Test] - public virtual void ExecutionOfPrecompiledCodeIsCorrect() + public virtual void ExecutionOfPrecompiledCode() { // Arrange const string libraryCode = @"function declensionOfNumerals(number, titles) { @@ -86,7 +86,7 @@ function declinationOfSeconds(number) { } [Test] - public virtual void ExecutionOfPrecompiledFileIsCorrect() + public virtual void ExecutionOfPrecompiledFile() { // Arrange string filePath = GetAbsolutePath("SharedFiles/declinationOfMinutes.js"); @@ -136,7 +136,7 @@ public virtual void ExecutionOfPrecompiledFileIsCorrect() } [Test] - public virtual void ExecutionOfPrecompiledResourceByNameAndTypeIsCorrect() + public virtual void ExecutionOfPrecompiledResourceByNameAndType() { // Arrange const string resourceName = "Resources.declinationOfHours.js"; @@ -186,7 +186,7 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndTypeIsCorrect() } [Test] - public virtual void ExecutionOfPrecompiledResourceByNameAndAssemblyIsCorrect() + public virtual void ExecutionOfPrecompiledResourceByNameAndAssembly() { // Arrange const string resourceName = "MsieJavaScriptEngine.Test.Common.Resources.declinationOfDays.js"; diff --git a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs index 7acc226..a9c90a5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs +++ b/test/MsieJavaScriptEngine.Test.Common/ValidationTests.cs @@ -8,7 +8,7 @@ namespace MsieJavaScriptEngine.Test.Common public class ValidationTests { [Test] - public void NameFormatIsCorrect() + public void CheckingOfCorrectNameFormat() { // Arrange @@ -30,7 +30,7 @@ public void NameFormatIsCorrect() } [Test] - public void NameFormatIsWrong() + public void CheckingOfWrongNameFormat() { // Arrange @@ -50,7 +50,7 @@ public void NameFormatIsWrong() } [Test] - public void DocumentNameFormatIsCorrect() + public void CheckingOfCorrectDocumentNameFormat() { // Arrange @@ -74,7 +74,7 @@ public void DocumentNameFormatIsCorrect() } [Test] - public void DocumentNameFormatIsWrong() + public void CheckingOfWrongDocumentNameFormat() { // Arrange From 3cce29f0a90dd0e6c4d943ca43d093d9b11212be Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 3 Feb 2023 20:57:14 +0300 Subject: [PATCH 205/238] In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types --- .../{ => ActiveScript}/HostItemBase.cs | 2 +- .../{ => ActiveScript}/HostObject.cs | 2 +- .../{ => ActiveScript}/HostType.cs | 2 +- .../Extensions/StringExtensions.cs | 5 +- .../Helpers/ComHelpers.cs | 34 ---- .../Helpers/NumericHelpers.cs | 28 --- .../Helpers/ReflectionHelpers.cs | 7 +- .../Helpers/TypeMappingHelpers.cs | 1 + .../JsRt/Edge/EdgeJsValue.cs | 35 ---- .../JsRt/Edge/EdgeNativeMethods.cs | 10 -- .../JsRt/Edge/EdgeTypeMapper.cs | 106 +++--------- .../JsRt/Embedding/EmbeddedItem.cs | 8 +- .../JsRt/Embedding/EmbeddedObject.cs | 6 +- .../JsRt/Embedding/EmbeddedObjectKey.cs | 10 +- .../JsRt/Embedding/EmbeddedType.cs | 6 +- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 35 ---- .../JsRt/Ie/IeNativeMethods.cs | 10 -- .../JsRt/Ie/IeTypeMapper.cs | 101 +++-------- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 38 +---- .../MsieJavaScriptEngine.csproj | 2 +- .../Resources/CommonStrings.Designer.cs | 160 +++++++++++++++++- .../Resources/CommonStrings.resx | 60 ++++++- .../Resources/CommonStrings.ru-RU.resx | 60 ++++++- .../Resources/NetCoreStrings.Designer.cs | 152 ----------------- .../Resources/NetCoreStrings.resx | 57 ------- ...er.cs => NetCoreStrings.ru-RU.Designer.cs} | 0 ...s.ru-ru.resx => NetCoreStrings.ru-RU.resx} | 57 ------- .../NetFrameworkStrings.ru-RU.Designer.cs | 0 ...ru.resx => NetFrameworkStrings.ru-RU.resx} | 0 src/MsieJavaScriptEngine/Utilities/Utils.cs | 49 ------ src/MsieJavaScriptEngine/readme.txt | 3 +- .../InteropTests.cs | 2 - .../InteropTests.cs | 2 - 33 files changed, 345 insertions(+), 705 deletions(-) rename src/MsieJavaScriptEngine/{ => ActiveScript}/HostItemBase.cs (99%) rename src/MsieJavaScriptEngine/{ => ActiveScript}/HostObject.cs (98%) rename src/MsieJavaScriptEngine/{ => ActiveScript}/HostType.cs (97%) rename src/MsieJavaScriptEngine/Resources/{NetCoreStrings.ru-ru.Designer.cs => NetCoreStrings.ru-RU.Designer.cs} (100%) rename src/MsieJavaScriptEngine/Resources/{NetCoreStrings.ru-ru.resx => NetCoreStrings.ru-RU.resx} (56%) create mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-RU.Designer.cs rename src/MsieJavaScriptEngine/Resources/{NetFrameworkStrings.ru-ru.resx => NetFrameworkStrings.ru-RU.resx} (100%) diff --git a/src/MsieJavaScriptEngine/HostItemBase.cs b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs similarity index 99% rename from src/MsieJavaScriptEngine/HostItemBase.cs rename to src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs index 2528ff0..5e9cbf7 100644 --- a/src/MsieJavaScriptEngine/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs @@ -5,7 +5,7 @@ using MsieJavaScriptEngine.Helpers; -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.ActiveScript { /// /// Base class of item, that implements interface diff --git a/src/MsieJavaScriptEngine/HostObject.cs b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs similarity index 98% rename from src/MsieJavaScriptEngine/HostObject.cs rename to src/MsieJavaScriptEngine/ActiveScript/HostObject.cs index 6895a86..fd91ba0 100644 --- a/src/MsieJavaScriptEngine/HostObject.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs @@ -7,7 +7,7 @@ using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.ActiveScript { /// /// Wrapper for object, that implements interface diff --git a/src/MsieJavaScriptEngine/HostType.cs b/src/MsieJavaScriptEngine/ActiveScript/HostType.cs similarity index 97% rename from src/MsieJavaScriptEngine/HostType.cs rename to src/MsieJavaScriptEngine/ActiveScript/HostType.cs index aa258c4..0071c0b 100644 --- a/src/MsieJavaScriptEngine/HostType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostType.cs @@ -7,7 +7,7 @@ using MsieJavaScriptEngine.Constants; using MsieJavaScriptEngine.Helpers; -namespace MsieJavaScriptEngine +namespace MsieJavaScriptEngine.ActiveScript { /// /// Wrapper for type, that implements interface diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index 1215e0c..e1b71ba 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -1,5 +1,4 @@ using System; -using System.Linq; namespace MsieJavaScriptEngine.Extensions { @@ -63,6 +62,7 @@ public static string TrimStart(this string source, string trimString) return result; } +#if NETFRAMEWORK /// /// Converts a first letter of string to capital @@ -83,7 +83,7 @@ public static string CapitalizeFirstLetter(this string source) } string result; - char firstCharacter = source.First(); + char firstCharacter = source[0]; if (char.IsLower(firstCharacter)) { @@ -100,6 +100,7 @@ public static string CapitalizeFirstLetter(this string source) return result; } +#endif /// /// Splits a string into lines diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 0168559..525c056 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -27,26 +27,6 @@ public static IntPtr CreateInstanceByClsid(Guid clsid) return pInterface; } - public static IntPtr CreateInstanceByProgId(string progId) - { - Guid clsid = ClsidFromProgId(progId); - IntPtr pInterface = CreateInstanceByClsid(clsid); - - return pInterface; - } - - private static Guid ClsidFromProgId(string progId) - { - Guid clsid; - - if (!Guid.TryParseExact(progId, "B", out clsid)) - { - HResult.Check(NativeMethods.CLSIDFromProgID(progId, out clsid)); - } - - return clsid; - } - public static bool TryCreateComObject(string progId, string serverName, out T obj) where T : class { Type type; @@ -92,14 +72,6 @@ public static IntPtr QueryInterfaceNoThrow(IntPtr pUnknown) return result == ComErrorCode.S_OK ? pInterface : IntPtr.Zero; } - public static T GetMethodDelegate(IntPtr pInterface, int methodIndex) where T : class - { - var pVTable = Marshal.ReadIntPtr(pInterface); - var pMethod = Marshal.ReadIntPtr(pVTable + methodIndex * IntPtr.Size); - - return Marshal.GetDelegateForFunctionPointer(pMethod, typeof(T)) as T; - } - public static void ReleaseAndEmpty(ref IntPtr pUnk) { if (pUnk != IntPtr.Zero) @@ -121,12 +93,6 @@ public static extern uint CoCreateInstance( [In] ref Guid iid, [Out] out IntPtr pInterface ); - - [DllImport("ole32.dll", ExactSpelling = true)] - public static extern uint CLSIDFromProgID( - [In] [MarshalAs(UnmanagedType.LPWStr)] string progId, - [Out] out Guid clsid - ); } #endregion diff --git a/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs b/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs index bd26b34..7afb9f2 100644 --- a/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/NumericHelpers.cs @@ -12,34 +12,6 @@ internal static class NumericHelpers private const double MAX_INTEGER_IN_DOUBLE = (1L << 53) - 1; - /// - /// Gets a value indicating whether the specified type is one of the numeric types - /// - /// The type - /// true if the specified type is one of the numeric types; otherwise, false - public static bool IsNumericType(Type type) - { - TypeCode typeCode = type.GetTypeCode(); - - switch (typeCode) - { - case TypeCode.SByte: - case TypeCode.Byte: - case TypeCode.Int16: - case TypeCode.UInt16: - case TypeCode.Int32: - case TypeCode.UInt32: - case TypeCode.Int64: - case TypeCode.UInt64: - case TypeCode.Single: - case TypeCode.Double: - case TypeCode.Decimal: - return true; - default: - return false; - } - } - /// /// Casts a double value to the correct type /// diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index c51cabd..62536d5 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,13 +1,9 @@ using System; -#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; -#endif using System.Reflection; -#if !NETFRAMEWORK using MsieJavaScriptEngine.Utilities; -#endif namespace MsieJavaScriptEngine.Helpers { @@ -66,7 +62,7 @@ public static MethodInfo[] GetFullyFledgedMethods(MethodInfo[] methods) return fullyFledgedMethods; } -#else +#endif public static void FixFieldValueType(ref object value, FieldInfo field) { @@ -269,6 +265,5 @@ public ushort CompatibilityScore set; } } -#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index e37a7e8..424f45a 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -2,6 +2,7 @@ using System; using System.Linq; +using MsieJavaScriptEngine.ActiveScript; using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.Helpers diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 800d4b1..67e8c34 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -304,24 +304,6 @@ public static EdgeJsValue FromString(string value) return reference; } -#if NETFRAMEWORK - - /// - /// Creates a JavaScript value that is a projection of the passed in object - /// - /// - /// Requires an active script context. - /// - /// The object to be projected - /// The JavaScript value that is a projection of the object - public static EdgeJsValue FromObject(object value) - { - EdgeJsValue reference; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsVariantToValue(ref value, out reference)); - - return reference; - } -#endif /// /// Creates a new Object @@ -611,23 +593,6 @@ public int ToInt32() return Marshal.PtrToStringUni(buffer, (int)length); } -#if NETFRAMEWORK - - /// - /// Retrieves a object representation of an Object value - /// - /// - /// Requires an active script context. - /// - /// The object representation of the value - public object ToObject() - { - object value; - EdgeJsErrorHelpers.ThrowIfError(EdgeNativeMethods.JsValueToVariant(this, out value)); - - return value; - } -#endif /// /// Converts a value to Boolean using regular JavaScript semantics diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs index 482d292..0e8dd7a 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeNativeMethods.cs @@ -148,16 +148,6 @@ internal static extern JsErrorCode JsSetRuntimeBeforeCollectCallback(EdgeJsRunti [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsConvertValueToString(EdgeJsValue value, out EdgeJsValue stringValue); -#if NETFRAMEWORK - - [DllImport(DllName.Chakra)] - internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, - out EdgeJsValue value); - - [DllImport(DllName.Chakra)] - internal static extern JsErrorCode JsValueToVariant(EdgeJsValue obj, - [MarshalAs(UnmanagedType.Struct)] out object var); -#endif [DllImport(DllName.Chakra)] internal static extern JsErrorCode JsGetGlobalObject(out EdgeJsValue globalObject); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index c6fd0ab..37ca65b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -1,36 +1,23 @@ using System; -#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -#endif using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; -#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Resources; -#endif -#if NETFRAMEWORK -using MsieJavaScriptEngine.Utilities; -#endif -#if !NETFRAMEWORK using WrapperException = MsieJavaScriptEngine.JsException; -using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; -using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; -#endif namespace MsieJavaScriptEngine.JsRt.Edge { -#if !NETFRAMEWORK using EdgeEmbeddedItem = EmbeddedItem; using EdgeEmbeddedObject = EmbeddedObject; using EdgeEmbeddedType = EmbeddedType; -#endif /// /// “Edge” type mapper /// @@ -40,39 +27,9 @@ internal sealed class EdgeTypeMapper : TypeMapper public EdgeTypeMapper() -#if NETFRAMEWORK - : base(JsEngineMode.ChakraEdgeJsRt) -#endif { } -#if NETFRAMEWORK - /// - /// Creates a JavaScript value from an host object if the it does not already exist - /// - /// Instance of host type - /// JavaScript value created from an host object - public override EdgeJsValue GetOrCreateScriptObject(object obj) - { - var wrappedObj = new HostObject(obj, _engineMode); - EdgeJsValue objValue = EdgeJsValue.FromObject(wrappedObj); - - return objValue; - } - - /// - /// Creates a JavaScript value from an host type if the it does not already exist - /// - /// Host type - /// JavaScript value created from an host type - public override EdgeJsValue GetOrCreateScriptType(Type type) - { - var wrappedType = new HostType(type, _engineMode); - EdgeJsValue typeValue = EdgeJsValue.FromObject(wrappedType); - - return typeValue; - } -#endif /// /// Makes a mapping of value from the host type to a script type /// @@ -148,7 +105,6 @@ public override object MapToHostType(EdgeJsValue value) case JsValueType.String: result = value.ToString(); break; -#if !NETFRAMEWORK case JsValueType.Function: EdgeJsPropertyId externalObjectPropertyId = EdgeJsPropertyId.FromString(ExternalObjectPropertyName); if (value.HasProperty(externalObjectPropertyId)) @@ -160,23 +116,11 @@ public override object MapToHostType(EdgeJsValue value) result = result ?? value.ConvertToObject(); break; -#endif case JsValueType.Object: -#if NETFRAMEWORK - case JsValueType.Function: -#endif case JsValueType.Error: case JsValueType.Array: -#if !NETFRAMEWORK result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); -#else - EdgeJsValue processedValue = valueType != JsValueType.Object ? - value.ConvertToObject() : value; - object obj = processedValue.ToObject(); - var hostObj = obj as HostObject; - result = hostObj != null ? hostObj.Target : obj; -#endif break; default: throw new ArgumentOutOfRangeException(); @@ -184,7 +128,6 @@ public override object MapToHostType(EdgeJsValue value) return result; } -#if !NETFRAMEWORK protected override EdgeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { @@ -217,7 +160,11 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) { EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { +#if NET40 + MethodInfo method = del.Method; +#else MethodInfo method = del.GetMethodInfo(); +#endif ParameterInfo[] parameters = method.GetParameters(); object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length); @@ -238,7 +185,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) CreateErrorFromWrapperException(wrapperException) : EdgeJsErrorHelpers.CreateError(string.Format( - NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) + CommonStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) ; EdgeJsContext.SetException(errorValue); @@ -265,7 +212,11 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) protected override EdgeEmbeddedType CreateEmbeddedType(Type type) { +#if NET40 + Type typeInfo = type; +#else TypeInfo typeInfo = type.GetTypeInfo(); +#endif string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); @@ -288,7 +239,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) if (constructors.Length == 0) { - CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + CreateAndSetError(string.Format(CommonStrings.Runtime_HostTypeConstructorNotFound, typeName)); return undefinedValue; } @@ -297,7 +248,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) if (bestFitConstructor == null) { CreateAndSetReferenceError(string.Format( - NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + CommonStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); return undefinedValue; } @@ -315,7 +266,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) CreateErrorFromWrapperException(wrapperException) : EdgeJsErrorHelpers.CreateError(string.Format( - NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) + CommonStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) ; EdgeJsContext.SetException(errorValue); @@ -372,7 +323,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); return undefinedValue; } @@ -395,10 +346,10 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, + string.Format(CommonStrings.Runtime_HostObjectFieldGettingFailed, fieldName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, + string.Format(CommonStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, exception.Message) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -424,7 +375,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); return undefinedValue; } @@ -448,10 +399,10 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, exception.Message) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -500,7 +451,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); return undefinedValue; } @@ -523,10 +474,10 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, exception.Message) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -555,7 +506,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); return undefinedValue; } @@ -579,10 +530,10 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostObjectPropertySettingFailed, propertyName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, exception.Message) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -630,7 +581,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); return undefinedValue; } @@ -641,7 +592,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) if (bestFitMethod == null) { CreateAndSetReferenceError(string.Format( - NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + CommonStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); return undefinedValue; } @@ -666,10 +617,10 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, + string.Format(CommonStrings.Runtime_HostObjectMethodInvocationFailed, methodName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, + string.Format(CommonStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, exception.Message) ; errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); @@ -745,6 +696,5 @@ private static EdgeJsValue CreateErrorFromWrapperException(WrapperException exce return errorValue; } -#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs index 1a109a4..8dbad02 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs @@ -1,5 +1,4 @@ -#if !NETFRAMEWORK -using System; +using System; using System.Collections.Generic; using MsieJavaScriptEngine.Utilities; @@ -38,7 +37,7 @@ internal abstract class EmbeddedItem : IDisposable /// /// Flag indicating whether this object is disposed /// - private readonly InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); + private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); /// /// Gets a host type @@ -121,5 +120,4 @@ public void Dispose() #endregion } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs index 1902505..8300a73 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObject.cs @@ -1,5 +1,4 @@ -#if !NETFRAMEWORK -using System; +using System; using System.Collections.Generic; namespace MsieJavaScriptEngine.JsRt.Embedding @@ -44,5 +43,4 @@ public override bool IsInstance #endregion } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs index bc18574..1bd3b1f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs @@ -1,5 +1,4 @@ -#if !NETFRAMEWORK -using System; +using System; using System.Collections; using System.Collections.Generic; @@ -84,7 +83,7 @@ int IComparable.CompareTo(object other) if (!(other is EmbeddedObjectKey)) { throw new ArgumentException( - string.Format(NetCoreStrings.Common_ArgumentHasIncorrectType, nameof(other), + string.Format(CommonStrings.Common_ArgumentHasIncorrectType, nameof(other), other.GetType().Name), nameof(other) ); @@ -122,7 +121,7 @@ int IStructuralComparable.CompareTo(object other, IComparer comparer) if (!(other is EmbeddedObjectKey)) { throw new ArgumentException( - string.Format(NetCoreStrings.Common_ArgumentHasIncorrectType, nameof(other), + string.Format(CommonStrings.Common_ArgumentHasIncorrectType, nameof(other), other.GetType().Name), nameof(other) ); @@ -161,5 +160,4 @@ public override string ToString() #endregion } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs index 680ad70..479ce5f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedType.cs @@ -1,5 +1,4 @@ -#if !NETFRAMEWORK -using System; +using System; using System.Collections.Generic; namespace MsieJavaScriptEngine.JsRt.Embedding @@ -44,5 +43,4 @@ public override bool IsInstance #endregion } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index 1113218..b07fe42 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -305,24 +305,6 @@ public static IeJsValue FromString(string value) return reference; } -#if NETFRAMEWORK - - /// - /// Creates a JavaScript value that is a projection of the passed in object - /// - /// - /// Requires an active script context. - /// - /// The object to be projected - /// The JavaScript value that is a projection of the object - public static IeJsValue FromObject(object value) - { - IeJsValue reference; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsVariantToValue(ref value, out reference)); - - return reference; - } -#endif /// /// Creates a new Object @@ -611,23 +593,6 @@ public int ToInt32() return Marshal.PtrToStringUni(buffer, (int)length); } -#if NETFRAMEWORK - - /// - /// Retrieves a object representation of an Object value - /// - /// - /// Requires an active script context. - /// - /// The object representation of the value - public object ToObject() - { - object value; - IeJsErrorHelpers.ThrowIfError(IeNativeMethods.JsValueToVariant(this, out value)); - - return value; - } -#endif /// /// Converts a value to Boolean using regular JavaScript semantics diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs index 5529a2a..4b9aabd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeNativeMethods.cs @@ -154,16 +154,6 @@ internal static extern JsErrorCode JsCreateContext(IeJsRuntime runtime, IDebugAp [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsConvertValueToString(IeJsValue value, out IeJsValue stringValue); -#if NETFRAMEWORK - - [DllImport(DllName.JScript9)] - internal static extern JsErrorCode JsVariantToValue([MarshalAs(UnmanagedType.Struct)] ref object var, - out IeJsValue value); - - [DllImport(DllName.JScript9)] - internal static extern JsErrorCode JsValueToVariant(IeJsValue obj, - [MarshalAs(UnmanagedType.Struct)] out object var); -#endif [DllImport(DllName.JScript9)] internal static extern JsErrorCode JsGetGlobalObject(out IeJsValue globalObject); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index a0c7ebd..5d50d7c 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -1,31 +1,23 @@ using System; -#if !NETFRAMEWORK using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -#endif using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Helpers; -#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Resources; using WrapperException = MsieJavaScriptEngine.JsException; -using WrapperRuntimeException = MsieJavaScriptEngine.JsRuntimeException; -using WrapperScriptException = MsieJavaScriptEngine.JsScriptException; -#endif namespace MsieJavaScriptEngine.JsRt.Ie { -#if !NETFRAMEWORK using IeEmbeddedItem = EmbeddedItem; using IeEmbeddedObject = EmbeddedObject; using IeEmbeddedType = EmbeddedType; -#endif /// /// “IE” type mapper /// @@ -35,39 +27,9 @@ internal sealed class IeTypeMapper : TypeMapper /// Constructs an instance of the “IE” type mapper /// public IeTypeMapper() -#if NETFRAMEWORK - : base(JsEngineMode.ChakraIeJsRt) -#endif { } -#if NETFRAMEWORK - /// - /// Creates a JavaScript value from an host object if the it does not already exist - /// - /// Instance of host type - /// JavaScript value created from an host object - public override IeJsValue GetOrCreateScriptObject(object obj) - { - var wrappedObj = new HostObject(obj, _engineMode); - IeJsValue objValue = IeJsValue.FromObject(wrappedObj); - - return objValue; - } - - /// - /// Creates a JavaScript value from an host type if the it does not already exist - /// - /// Host type - /// JavaScript value created from an host type - public override IeJsValue GetOrCreateScriptType(Type type) - { - var wrappedType = new HostType(type, _engineMode); - IeJsValue typeValue = IeJsValue.FromObject(wrappedType); - - return typeValue; - } -#endif /// /// Makes a mapping of value from the host type to a script type /// @@ -143,7 +105,6 @@ public override object MapToHostType(IeJsValue value) case JsValueType.String: result = value.ToString(); break; -#if !NETFRAMEWORK case JsValueType.Function: IeJsPropertyId externalObjectPropertyId = IeJsPropertyId.FromString(ExternalObjectPropertyName); if (value.HasProperty(externalObjectPropertyId)) @@ -155,23 +116,11 @@ public override object MapToHostType(IeJsValue value) result = result ?? value.ConvertToObject(); break; -#endif case JsValueType.Object: -#if NETFRAMEWORK - case JsValueType.Function: -#endif case JsValueType.Error: case JsValueType.Array: -#if !NETFRAMEWORK result = value.HasExternalData ? GCHandle.FromIntPtr(value.ExternalData).Target : value.ConvertToObject(); -#else - IeJsValue processedValue = valueType != JsValueType.Object ? - value.ConvertToObject() : value; - object obj = processedValue.ToObject(); - var hostObj = obj as HostObject; - result = hostObj != null ? hostObj.Target : obj; -#endif break; default: throw new ArgumentOutOfRangeException(); @@ -179,7 +128,6 @@ public override object MapToHostType(IeJsValue value) return result; } -#if !NETFRAMEWORK protected override IeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { @@ -212,7 +160,11 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) { IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { +#if NET40 + MethodInfo method = del.Method; +#else MethodInfo method = del.GetMethodInfo(); +#endif ParameterInfo[] parameters = method.GetParameters(); object[] processedArgs = GetHostItemMemberArguments(args, parameters.Length); @@ -233,7 +185,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) CreateErrorFromWrapperException(wrapperException) : IeJsErrorHelpers.CreateError(string.Format( - NetCoreStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) + CommonStrings.Runtime_HostDelegateInvocationFailed, exception.Message)) ; IeJsContext.SetException(errorValue); @@ -260,7 +212,11 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) protected override IeEmbeddedType CreateEmbeddedType(Type type) { +#if NET40 + Type typeInfo = type; +#else TypeInfo typeInfo = type.GetTypeInfo(); +#endif string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(true); ConstructorInfo[] constructors = type.GetConstructors(defaultBindingFlags); @@ -283,7 +239,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) if (constructors.Length == 0) { - CreateAndSetError(string.Format(NetCoreStrings.Runtime_HostTypeConstructorNotFound, typeName)); + CreateAndSetError(string.Format(CommonStrings.Runtime_HostTypeConstructorNotFound, typeName)); return undefinedValue; } @@ -292,7 +248,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) if (bestFitConstructor == null) { CreateAndSetReferenceError(string.Format( - NetCoreStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); + CommonStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); return undefinedValue; } @@ -310,7 +266,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) CreateErrorFromWrapperException(wrapperException) : IeJsErrorHelpers.CreateError(string.Format( - NetCoreStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) + CommonStrings.Runtime_HostTypeConstructorInvocationFailed, typeName, exception.Message)) ; IeJsContext.SetException(errorValue); @@ -367,7 +323,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); return undefinedValue; } @@ -390,10 +346,10 @@ private void ProjectFields(IeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldGettingFailed, fieldName, + string.Format(CommonStrings.Runtime_HostObjectFieldGettingFailed, fieldName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, + string.Format(CommonStrings.Runtime_HostTypeFieldGettingFailed, fieldName, typeName, exception.Message) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -419,7 +375,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); return undefinedValue; } @@ -443,10 +399,10 @@ private void ProjectFields(IeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, exception.Message) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -495,7 +451,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); return undefinedValue; } @@ -518,10 +474,10 @@ private void ProjectProperties(IeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostObjectPropertyGettingFailed, propertyName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypePropertyGettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostTypePropertyGettingFailed, propertyName, typeName, exception.Message) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -550,7 +506,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); return undefinedValue; } @@ -574,10 +530,10 @@ private void ProjectProperties(IeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectPropertySettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostObjectPropertySettingFailed, propertyName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypePropertySettingFailed, propertyName, + string.Format(CommonStrings.Runtime_HostTypePropertySettingFailed, propertyName, typeName, exception.Message) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -625,7 +581,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) if (instance && obj == null) { CreateAndSetTypeError(string.Format( - NetCoreStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); + CommonStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); return undefinedValue; } @@ -636,7 +592,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) if (bestFitMethod == null) { CreateAndSetReferenceError(string.Format( - NetCoreStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); + CommonStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); return undefinedValue; } @@ -661,10 +617,10 @@ private void ProjectMethods(IeEmbeddedItem externalItem) else { string errorMessage = instance ? - string.Format(NetCoreStrings.Runtime_HostObjectMethodInvocationFailed, methodName, + string.Format(CommonStrings.Runtime_HostObjectMethodInvocationFailed, methodName, exception.Message) : - string.Format(NetCoreStrings.Runtime_HostTypeMethodInvocationFailed, methodName, + string.Format(CommonStrings.Runtime_HostTypeMethodInvocationFailed, methodName, typeName, exception.Message) ; errorValue = IeJsErrorHelpers.CreateError(errorMessage); @@ -739,6 +695,5 @@ private static IeJsValue CreateErrorFromWrapperException(WrapperException except return errorValue; } -#endif } } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 25ecc08..a4a50f6 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -1,18 +1,11 @@ using System; -#if !NETFRAMEWORK using System.Collections.Concurrent; -#endif using System.Linq; -#if !NETFRAMEWORK using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -#endif -#if !NETFRAMEWORK using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Utilities; -#endif namespace MsieJavaScriptEngine.JsRt { @@ -25,7 +18,6 @@ internal abstract class TypeMapper : IDisposable where TValue : struct where TFunction : Delegate { -#if !NETFRAMEWORK /// /// Name of property to store the external object /// @@ -74,23 +66,7 @@ internal abstract class TypeMapper : IDisposable /// /// Flag indicating whether this object is disposed /// - private readonly InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); -#else - /// - /// JS engine mode - /// - protected readonly JsEngineMode _engineMode; - - - /// - /// Constructs an instance of type mapper - /// - /// JS engine mode - protected TypeMapper(JsEngineMode engineMode) - { - _engineMode = engineMode; - } -#endif + private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); /// @@ -98,7 +74,6 @@ protected TypeMapper(JsEngineMode engineMode) /// /// Instance of host type /// JavaScript value created from an host object -#if !NETFRAMEWORK public virtual TValue GetOrCreateScriptObject(object obj) { @@ -125,16 +100,12 @@ public virtual TValue GetOrCreateScriptObject(object obj) return embeddedObject.ScriptValue; } -#else - public abstract TValue GetOrCreateScriptObject(object obj); -#endif /// /// Creates a JavaScript value from an host type if the it does not already exist /// /// Host type /// JavaScript value created from an host type -#if !NETFRAMEWORK public virtual TValue GetOrCreateScriptType(Type type) { if (!_embeddedTypeStorageInitialized) @@ -160,9 +131,6 @@ public virtual TValue GetOrCreateScriptType(Type type) return embeddedType.ScriptValue; } -#else - public abstract TValue GetOrCreateScriptType(Type type); -#endif /// /// Makes a mapping of value from the host type to a script type @@ -177,7 +145,6 @@ public virtual TValue GetOrCreateScriptType(Type type) /// The source value /// The mapped value public abstract object MapToHostType(TValue value); -#if !NETFRAMEWORK protected abstract EmbeddedObject CreateEmbeddedObjectOrFunction(object obj); @@ -282,7 +249,6 @@ protected static Exception UnwrapException(Exception exception) return originalException; } -#endif #region IDisposable implementation @@ -291,7 +257,6 @@ protected static Exception UnwrapException(Exception exception) /// public virtual void Dispose() { -#if !NETFRAMEWORK if (_disposedFlag.Set()) { var lazyEmbeddedObjects = _lazyEmbeddedObjects; @@ -340,7 +305,6 @@ public virtual void Dispose() _embeddedTypeFinalizeCallback = null; } -#endif } #endregion diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 41be737..96ed984 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Now a case-sensitive cultural postfixes are used in the names of `.resx` files. + In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 2a1e873..4d846c4 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -57,6 +57,14 @@ internal static CultureInfo Culture } } + /// + /// Looks up a localized string similar to "The parameter '{0}' must have a `{1}` type." + /// + internal static string Common_ArgumentHasIncorrectType + { + get { return GetString("Common_ArgumentHasIncorrectType"); } + } + /// /// Looks up a localized string similar to "The parameter '{0}' must be a non-empty string." /// @@ -241,6 +249,110 @@ internal static string Runtime_FunctionNotExist get { return GetString("Runtime_FunctionNotExist"); } } + /// + /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." + /// + internal static string Runtime_HostDelegateInvocationFailed + { + get { return GetString("Runtime_HostDelegateInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." + /// + internal static string Runtime_HostObjectFieldGettingFailed + { + get { return GetString("Runtime_HostObjectFieldGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." + /// + internal static string Runtime_HostObjectFieldSettingFailed + { + get { return GetString("Runtime_HostObjectFieldSettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." + /// + internal static string Runtime_HostObjectMethodInvocationFailed + { + get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." + /// + internal static string Runtime_HostObjectPropertyGettingFailed + { + get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." + /// + internal static string Runtime_HostObjectPropertySettingFailed + { + get { return GetString("Runtime_HostObjectPropertySettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." + /// + internal static string Runtime_HostTypeConstructorInvocationFailed + { + get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." + /// + internal static string Runtime_HostTypeConstructorNotFound + { + get { return GetString("Runtime_HostTypeConstructorNotFound"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." + /// + internal static string Runtime_HostTypeFieldGettingFailed + { + get { return GetString("Runtime_HostTypeFieldGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." + /// + internal static string Runtime_HostTypeFieldSettingFailed + { + get { return GetString("Runtime_HostTypeFieldSettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." + /// + internal static string Runtime_HostTypeMethodInvocationFailed + { + get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } + } + + /// + /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." + /// + internal static string Runtime_HostTypePropertyGettingFailed + { + get { return GetString("Runtime_HostTypePropertyGettingFailed"); } + } + + /// + /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." + /// + internal static string Runtime_HostTypePropertySettingFailed + { + get { return GetString("Runtime_HostTypePropertySettingFailed"); } + } + /// /// Looks up a localized string similar to "The '{0}' line of the script call stack has an incorrect format." /// @@ -249,6 +361,30 @@ internal static string Runtime_InvalidCallStackLineFormat get { return GetString("Runtime_InvalidCallStackLineFormat"); } } + /// + /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." + /// + internal static string Runtime_InvalidThisContextForHostObjectField + { + get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } + } + + /// + /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." + /// + internal static string Runtime_InvalidThisContextForHostObjectMethod + { + get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } + } + + /// + /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." + /// + internal static string Runtime_InvalidThisContextForHostObjectProperty + { + get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } + } + /// /// Looks up a localized string similar to "Script execution was interrupted." /// @@ -257,6 +393,22 @@ internal static string Runtime_ScriptInterrupted get { return GetString("Runtime_ScriptInterrupted"); } } + /// + /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." + /// + internal static string Runtime_SuitableConstructorOfHostTypeNotFound + { + get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } + } + + /// + /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." + /// + internal static string Runtime_SuitableMethodOfHostObjectNotFound + { + get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } + } + /// /// Looks up a localized string similar to "Сannot execute a '{0}' file, because it is empty." /// @@ -385,14 +537,6 @@ internal static string Usage_JsEnginesConflictInProcess get { return GetString("Usage_JsEnginesConflictInProcess"); } } - /// - /// Looks up a localized string similar to "It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time." - /// - internal static string Usage_JsEnginesConflictOnMachine - { - get { return GetString("Usage_JsEnginesConflictOnMachine"); } - } - /// /// Looks up a localized string similar to "The type of return value `{0}` is not supported." /// diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index 4abc615..6f41f9e 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + The parameter '{0}' must have a `{1}` type. + The parameter '{0}' must be a non-empty string. @@ -186,12 +189,66 @@ The function with the name '{0}' does not exist. + + During invocation of the host delegate an error has occurred - “{0}”. + + + During getting value of '{0}' field of the host object an error has occurred - “{1}”. + + + During setting value of '{0}' field of the host object an error has occurred - “{1}”. + + + During invocation of '{0}' method of the host object an error has occurred - “{1}”. + + + During getting value of '{0}' property of the host object an error has occurred - “{1}”. + + + During setting value of '{0}' property of the host object an error has occurred - “{1}”. + + + During invocation of constructor of the `{0}` host type an error has occurred - “{1}”. + + + Could not create instance of the `{0}` host type, because it does not have any public constructor. + + + During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”. + + + During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”. + + + During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”. + + + During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”. + + + During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”. + The '{0}' line of the script call stack has an incorrect format. + + Could not retrieve field '{0}' of the host object, because there was an invalid `this` context. + + + Could not call method '{0}' of the host object, because there was an invalid `this` context. + + + Could not retrieve property '{0}' of the host object, because there was an invalid `this` context. + Script execution was interrupted. + + Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}` host type. + + + Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object. + Сannot execute a '{0}' file, because it is empty. @@ -240,9 +297,6 @@ It is prohibited to use the {0} and {1} engines in one process. - - It is prohibited to use the Chakra JsRT and Chakra ActiveScript engines on one machine at a time. - The type of return value `{0}` is not supported. diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx index 6e709db..76124ab 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.ru-RU.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Параметр с именем "{0}" должен иметь тип `{1}`! + Параметр с именем "{0}" не должен содержать пустую строку! @@ -186,12 +189,66 @@ Функция с именем "{0}" не существует! + + Во время вызова делегата хоста произошла ошибка - «{0}»! + + + Во время получения значения поля "{0}" объекта хоста произошла ошибка - «{1}»! + + + Во время присваивания значения полю "{0}" объекта хоста произошла ошибка - «{1}»! + + + Во время вызова метода "{0}" объекта хоста произошла ошибка - «{1}»! + + + Во время получения значения свойства "{0}" объекта хоста произошла ошибка - «{1}»! + + + Во время присваивания значения свойству "{0}" объекта хоста произошла ошибка - «{1}»! + + + Во время вызова конструктора типа хоста `{0}` произошла ошибка - «{1}»! + + + Не удается создать экземпляр типа хоста `{0}`, потому что он не имеет ни одного публичного конструктора! + + + Во время получения значения поля "{0}" типа хоста `{1}` произошла ошибка - «{2}»! + + + Во время присваивания значения полю "{0}" типа хоста `{1}` произошла ошибка - «{2}»! + + + Во время вызова метода "{0}" типа хоста `{1}` произошла ошибка - «{2}»! + + + Во время получения значения свойства "{0}" типа хоста `{1}` произошла ошибка - «{2}»! + + + Во время присваивания значения свойству "{0}" типа хоста `{1}` произошла ошибка - «{2}»! + Строка стека вызовов скрипта "{0}" имеет некорректный формат! + + Не удалось получить поле "{0}" объекта хоста, потому что контекст `this` недействителен! + + + Не удалось вызвать метод "{0}" объекта хоста, потому что контекст `this` недействителен! + + + Не удалось получить свойство "{0}" объекта хоста, потому что контекст `this` недействителен! + Выполнение скрипта было прервано! + + Не получается найти подходящий конструктор или не хватает аргументов для вызова конструктора `{0}` типа хоста! + + + Не получается найти подходящий метод или не хватает аргументов для вызова метода "{0}" объекта хоста! + Нельзя выполнить файл "{0}", потому что он пустой! @@ -240,9 +297,6 @@ Нельзя использовать {0} и {1} движки в одном процессе. - - Нельзя использовать Chakra JsRT и Chakra ActiveScript движки на одном компьютере одновременно. - Тип возвращаемого значения `{0}` не поддерживается! diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index 8941c62..a115222 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -57,14 +57,6 @@ internal static CultureInfo Culture } } - /// - /// Looks up a localized string similar to "The parameter '{0}' must have a `{1}` type." - /// - internal static string Common_ArgumentHasIncorrectType - { - get { return GetString("Common_ArgumentHasIncorrectType"); } - } - /// /// Looks up a localized string similar to "Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps..." /// @@ -73,150 +65,6 @@ internal static string Engine_JsEnginesNotFound get { return GetString("Engine_JsEnginesNotFound"); } } - /// - /// Looks up a localized string similar to "During invocation of the host delegate an error has occurred - “{0}”." - /// - internal static string Runtime_HostDelegateInvocationFailed - { - get { return GetString("Runtime_HostDelegateInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' field of the host object an error has occurred - “{1}”." - /// - internal static string Runtime_HostObjectFieldGettingFailed - { - get { return GetString("Runtime_HostObjectFieldGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' field of the host object an error has occurred - “{1}”." - /// - internal static string Runtime_HostObjectFieldSettingFailed - { - get { return GetString("Runtime_HostObjectFieldSettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of '{0}' method of the host object an error has occurred - “{1}”." - /// - internal static string Runtime_HostObjectMethodInvocationFailed - { - get { return GetString("Runtime_HostObjectMethodInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' property of the host object an error has occurred - “{1}”." - /// - internal static string Runtime_HostObjectPropertyGettingFailed - { - get { return GetString("Runtime_HostObjectPropertyGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' property of the host object an error has occurred - “{1}”." - /// - internal static string Runtime_HostObjectPropertySettingFailed - { - get { return GetString("Runtime_HostObjectPropertySettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of constructor of the `{0}` host type an error has occurred - “{1}”." - /// - internal static string Runtime_HostTypeConstructorInvocationFailed - { - get { return GetString("Runtime_HostTypeConstructorInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "Could not create instance of the `{0}` host type, because it does not have any public constructor." - /// - internal static string Runtime_HostTypeConstructorNotFound - { - get { return GetString("Runtime_HostTypeConstructorNotFound"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." - /// - internal static string Runtime_HostTypeFieldGettingFailed - { - get { return GetString("Runtime_HostTypeFieldGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”." - /// - internal static string Runtime_HostTypeFieldSettingFailed - { - get { return GetString("Runtime_HostTypeFieldSettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”." - /// - internal static string Runtime_HostTypeMethodInvocationFailed - { - get { return GetString("Runtime_HostTypeMethodInvocationFailed"); } - } - - /// - /// Looks up a localized string similar to "During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”." - /// - internal static string Runtime_HostTypePropertyGettingFailed - { - get { return GetString("Runtime_HostTypePropertyGettingFailed"); } - } - - /// - /// Looks up a localized string similar to "During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”." - /// - internal static string Runtime_HostTypePropertySettingFailed - { - get { return GetString("Runtime_HostTypePropertySettingFailed"); } - } - - /// - /// Looks up a localized string similar to "Could not retrieve field '{0}' of the host object, because there was an invalid `this` context." - /// - internal static string Runtime_InvalidThisContextForHostObjectField - { - get { return GetString("Runtime_InvalidThisContextForHostObjectField"); } - } - - /// - /// Looks up a localized string similar to "Could not call method '{0}' of the host object, because there was an invalid `this` context." - /// - internal static string Runtime_InvalidThisContextForHostObjectMethod - { - get { return GetString("Runtime_InvalidThisContextForHostObjectMethod"); } - } - - /// - /// Looks up a localized string similar to "Could not retrieve property '{0}' of the host object, because there was an invalid `this` context." - /// - internal static string Runtime_InvalidThisContextForHostObjectProperty - { - get { return GetString("Runtime_InvalidThisContextForHostObjectProperty"); } - } - - /// - /// Looks up a localized string similar to "Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}`..." - /// - internal static string Runtime_SuitableConstructorOfHostTypeNotFound - { - get { return GetString("Runtime_SuitableConstructorOfHostTypeNotFound"); } - } - - /// - /// Looks up a localized string similar to "Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object." - /// - internal static string Runtime_SuitableMethodOfHostObjectNotFound - { - get { return GetString("Runtime_SuitableMethodOfHostObjectNotFound"); } - } - /// /// Looks up a localized string similar to "The '{0}' mode of JavaScript engine is not compatible with .NET Core." /// diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx index 532bf65..e969324 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.resx @@ -117,66 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - The parameter '{0}' must have a `{1}` type. - Could not found none of the JavaScript engines, which would be compatible with .NET Core. Perhaps you have not installed the Microsoft Edge Legacy or Internet Explorer 11 browser. - - During invocation of the host delegate an error has occurred - “{0}”. - - - During getting value of '{0}' field of the host object an error has occurred - “{1}”. - - - During setting value of '{0}' field of the host object an error has occurred - “{1}”. - - - During invocation of '{0}' method of the host object an error has occurred - “{1}”. - - - During getting value of '{0}' property of the host object an error has occurred - “{1}”. - - - During setting value of '{0}' property of the host object an error has occurred - “{1}”. - - - During invocation of constructor of the `{0}` host type an error has occurred - “{1}”. - - - Could not create instance of the `{0}` host type, because it does not have any public constructor. - - - During getting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”. - - - During setting value of '{0}' field of the `{1}` host type an error has occurred - “{2}”. - - - During invocation of '{0}' method of the `{1}` host type an error has occurred - “{2}”. - - - During getting value of '{0}' property of the `{1}` host type an error has occurred - “{2}”. - - - During setting value of '{0}' property of the host type `{1}` an error has occurred - “{2}”. - - - Could not retrieve field '{0}' of the host object, because there was an invalid `this` context. - - - Could not call method '{0}' of the host object, because there was an invalid `this` context. - - - Could not retrieve property '{0}' of the host object, because there was an invalid `this` context. - - - Could not find suitable constructor or not enough arguments to invoke of constructor of the `{0}` host type. - - - Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object. - The '{0}' mode of JavaScript engine is not compatible with .NET Core. diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-RU.Designer.cs similarity index 100% rename from src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.Designer.cs rename to src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-RU.Designer.cs diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-RU.resx similarity index 56% rename from src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx rename to src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-RU.resx index 4b06f90..5835a08 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-ru.resx +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.ru-RU.resx @@ -117,66 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Параметр с именем "{0}" должен иметь тип `{1}`! - Не удалось найти ни один из JavaScript-движков, который был бы совместим с .NET Core! Возможно, на вашем компьютере не установлен браузер Microsoft Edge Legacy или Internet Explorer 11. - - Во время вызова делегата хоста произошла ошибка - «{0}»! - - - Во время получения значения поля "{0}" объекта хоста произошла ошибка - «{1}»! - - - Во время присваивания значения полю "{0}" объекта хоста произошла ошибка - «{1}»! - - - Во время вызова метода "{0}" объекта хоста произошла ошибка - «{1}»! - - - Во время получения значения свойства "{0}" объекта хоста произошла ошибка - «{1}»! - - - Во время присваивания значения свойству "{0}" объекта хоста произошла ошибка - «{1}»! - - - Во время вызова конструктора типа хоста `{0}` произошла ошибка - «{1}»! - - - Не удается создать экземпляр типа хоста `{0}`, потому что он не имеет ни одного публичного конструктора! - - - Во время получения значения поля "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - - Во время присваивания значения полю "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - - Во время вызова метода "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - - Во время получения значения свойства "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - - Во время присваивания значения свойству "{0}" типа хоста `{1}` произошла ошибка - «{2}»! - - - Не удалось получить поле "{0}" объекта хоста, потому что контекст `this` недействителен! - - - Не удалось вызвать метод "{0}" объекта хоста, потому что контекст `this` недействителен! - - - Не удалось получить свойство "{0}" объекта хоста, потому что контекст `this` недействителен! - - - Не получается найти подходящий конструктор или не хватает аргументов для вызова конструктора `{0}` типа хоста! - - - Не получается найти подходящий метод или не хватает аргументов для вызова метода "{0}" объекта хоста! - Режим JavaScript-движка "{0}" не совместим с .NET Core! diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-RU.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-RU.Designer.cs new file mode 100644 index 0000000..e69de29 diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-RU.resx similarity index 100% rename from src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.resx rename to src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-RU.resx diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 15979a2..96ff86e 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -26,50 +26,6 @@ public static bool Is64BitProcess() return is64Bit; } - /// - /// Gets a content of the embedded resource as string - /// - /// The case-sensitive resource name without the namespace of the specified type - /// The type, that determines the assembly and whose namespace is used to scope - /// the resource name - /// Сontent of the embedded resource as string - public static string GetResourceAsString(string resourceName, Type type) - { - if (resourceName == null) - { - throw new ArgumentNullException( - nameof(resourceName), - string.Format(CommonStrings.Common_ArgumentIsNull, nameof(resourceName)) - ); - } - - if (type == null) - { - throw new ArgumentNullException( - nameof(type), - string.Format(CommonStrings.Common_ArgumentIsNull, nameof(type)) - ); - } - - if (string.IsNullOrWhiteSpace(resourceName)) - { - throw new ArgumentException( - string.Format(CommonStrings.Common_ArgumentIsEmpty, nameof(resourceName)), - nameof(resourceName) - ); - } - -#if NET40 - Assembly assembly = type.Assembly; -#else - Assembly assembly = type.GetTypeInfo().Assembly; -#endif - string nameSpace = type.Namespace; - string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; - - return InnerGetResourceAsString(resourceFullName, assembly); - } - /// /// Gets a content of the embedded resource as string /// @@ -102,11 +58,6 @@ public static string GetResourceAsString(string resourceName, Assembly assembly) ); } - return InnerGetResourceAsString(resourceName, assembly); - } - - private static string InnerGetResourceAsString(string resourceName, Assembly assembly) - { using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index cc7c084..8599766 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - Now a case-sensitive cultural postfixes are used in the names of `.resx` files. + In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no + longer used for embedding objects and types. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index 35e22de..65bca83 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -14,7 +14,6 @@ public class InteropTests : InteropTestsBase #region Embedding of objects -#if NETCOREAPP #region Delegates @@ -97,7 +96,6 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() #endregion -#endif #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index c4cf210..3d06904 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -14,7 +14,6 @@ public class InteropTests : InteropTestsBase #region Embedding of objects -#if NETCOREAPP #region Delegates @@ -97,7 +96,6 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() #endregion -#endif #endregion } } \ No newline at end of file From 2ad66f09085de66cb07038d4cc713a728c5784b3 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 6 Feb 2023 17:44:43 +0300 Subject: [PATCH 206/238] Reformatted a XML documentation comments --- .../ActiveScript/ActiveScriptException.cs | 4 +-- .../ActiveScript/ActiveScriptJsEngineBase.cs | 8 ++--- .../ActiveScriptJsErrorHelpers.cs | 4 +-- .../ActiveScript/ActiveScriptWrapper32.cs | 3 +- .../ActiveScript/ActiveScriptWrapper64.cs | 3 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 11 +++--- .../ChakraActiveScriptJsEngine.cs | 2 +- .../ClassicActiveScriptJsEngine.cs | 2 +- .../Debugging/DebugApplicationWrapper.cs | 2 +- .../Debugging/DebugStackFrameDescriptor.cs | 2 +- .../Debugging/IActiveScriptDebug32.cs | 2 +- .../Debugging/IActiveScriptDebug64.cs | 2 +- .../Debugging/IActiveScriptSiteDebug32.cs | 2 +- .../Debugging/IDebugApplication32.cs | 12 +++---- .../Debugging/IDebugApplication64.cs | 12 +++---- .../Debugging/IDebugDocumentHelper32.cs | 4 +-- .../Debugging/IDebugDocumentHelper64.cs | 4 +-- .../Debugging/IDebugDocumentText.cs | 10 +++--- .../Debugging/IDebugStackFrame.cs | 8 ++--- .../Debugging/IDebugThreadCall32.cs | 2 +- .../Debugging/IDebugThreadCall64.cs | 2 +- .../Debugging/IEnumDebugExpressionContexts.cs | 2 +- .../Debugging/ProcessDebugManagerWrapper.cs | 4 +-- .../ActiveScript/Debugging/SourceTextAttrs.cs | 8 ++--- .../ActiveScript/IActiveScript.cs | 12 +++---- .../ActiveScript/IActiveScriptError.cs | 2 +- .../ActiveScript/IActiveScriptParse32.cs | 34 +++++++++--------- .../ActiveScript/IActiveScriptParse64.cs | 34 +++++++++--------- .../ActiveScript/IActiveScriptProperty.cs | 4 +-- .../ActiveScript/IActiveScriptSite.cs | 22 ++++++------ .../IActiveScriptSiteInterruptPoll.cs | 2 +- .../ActiveScript/IActiveScriptWrapper.cs | 8 ++--- .../ActiveScript/JScriptRuntimeErrorNumber.cs | 6 ++-- .../ActiveScript/JScriptSyntaxErrorNumber.cs | 34 +++++++++--------- .../ActiveScript/ScriptInfoFlags.cs | 4 +-- .../ActiveScript/ScriptItemFlags.cs | 6 ++-- .../ActiveScript/ScriptProperty.cs | 2 +- .../ActiveScript/ScriptState.cs | 8 ++--- .../ActiveScript/ScriptTextFlags.cs | 2 +- .../Extensions/StringExtensions.cs | 4 +-- .../Helpers/ReflectionHelpers.cs | 2 +- .../Helpers/ValidationHelpers.cs | 8 ++--- src/MsieJavaScriptEngine/IInnerJsEngine.cs | 2 +- src/MsieJavaScriptEngine/JsEngineSettings.cs | 2 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 7 ++-- .../JsRt/Edge/EdgeJsContext.cs | 4 +-- .../JsRt/Edge/EdgeJsErrorHelpers.cs | 12 +++---- .../JsRt/Edge/EdgeJsNativeFunction.cs | 2 +- .../JsRt/Edge/EdgeJsRuntime.cs | 6 ++-- .../JsRt/Edge/EdgeJsValue.cs | 36 +++++++++---------- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 7 ++-- .../JsRt/Ie/IeJsContext.cs | 4 +-- .../JsRt/Ie/IeJsErrorHelpers.cs | 12 +++---- .../JsRt/Ie/IeJsNativeFunction.cs | 2 +- .../JsRt/Ie/IeJsRuntime.cs | 6 ++-- src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs | 34 +++++++++--------- .../JsRt/JsBeforeCollectCallback.cs | 2 +- src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs | 4 +-- .../JsRt/JsMemoryAllocationCallback.cs | 6 ++-- .../JsRt/JsRuntimeAttributes.cs | 2 +- .../JsRt/JsThreadServiceCallback.cs | 2 +- src/MsieJavaScriptEngine/JsRt/JsValueType.cs | 14 ++++---- src/MsieJavaScriptEngine/MsieJsEngine.cs | 2 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 4 +-- src/MsieJavaScriptEngine/Undefined.cs | 4 +-- .../Utilities/TypeConverter.cs | 8 ++--- src/MsieJavaScriptEngine/Utilities/Utils.cs | 2 +- 67 files changed, 245 insertions(+), 250 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index fc0fd68..be86036 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -9,7 +9,7 @@ namespace MsieJavaScriptEngine.ActiveScript public sealed class ActiveScriptException : Exception { /// - /// The HRESULT of the error + /// The HRESULT of the error /// private int _errorCode; @@ -54,7 +54,7 @@ public sealed class ActiveScriptException : Exception private string _sourceFragment = string.Empty; /// - /// Gets or sets a HRESULT of the error + /// Gets or sets a HRESULT of the error /// public int ErrorCode { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 54661bb..1b71fa8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -184,7 +184,7 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, /// Initializes a script dispatcher /// /// The maximum stack size, in bytes, to be used by the thread, - /// or 0 to use the default maximum stack size specified in the header for the executable. + /// or 0 to use the default maximum stack size specified in the header for the executable. private static void InitScriptDispatcher(int maxStackSize) { if (_dispatcher != null) @@ -209,7 +209,7 @@ private static void InitScriptDispatcher(int maxStackSize) /// CLSID of JS engine /// Flag indicating whether this JS engine is supported /// Support synchronizer - /// Result of check (true - supports; false - does not support) + /// Result of check (true - supports; false - does not support) protected static bool IsSupported(string clsid, ref bool? isSupported, ref object supportSynchronizer) { if (isSupported.HasValue) @@ -315,7 +315,7 @@ protected virtual void InitScriptContext() } /// - /// Gets and resets a last exception. Returns null for none. + /// Gets and resets a last exception. Returns null for none. /// private ActiveScriptException GetAndResetLastException() { @@ -417,7 +417,7 @@ private void InnerExecuteResource(string resourceName, Assembly assembly) /// Script text /// Application specific source context /// Debug document - /// Result of creating a debug document (true - is created; false - is not created) + /// Result of creating a debug document (true - is created; false - is not created) private bool TryCreateDebugDocument(string name, string code, out UIntPtr sourceContext, out DebugDocument document) { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs index f455f67..92fef49 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -16,7 +16,7 @@ internal static class ActiveScriptJsErrorHelpers /// Checks whether the specified error number is compilation error /// /// Error number - /// Result of check (true - is compilation error; false - is not compilation error) + /// Result of check (true - is compilation error; false - is not compilation error) public static bool IsCompilationError(int errorNumber) { bool result = errorNumber >= JScriptSyntaxErrorNumber.SyntaxError @@ -29,7 +29,7 @@ public static bool IsCompilationError(int errorNumber) /// Checks whether the specified error number is runtime error /// /// Error number - /// Result of check (true - is runtime error; false - is not runtime error) + /// Result of check (true - is runtime error; false - is not runtime error) public static bool IsRuntimeError(int errorNumber) { bool result = errorNumber == JScriptRuntimeErrorNumber.OutOfStackSpace || (errorNumber >= JScriptRuntimeErrorNumber.CannotAssignToThisKeyword diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 0bf3a3e..6893c38 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -142,8 +142,7 @@ public override void Dispose() /// /// Destroys object /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class + /// Flag, allowing destruction of managed objects contained in fields of class protected override void Dispose(bool disposing) { if (disposing) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index a360bdf..bd849b9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -142,8 +142,7 @@ public override void Dispose() /// /// Destroys object /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class + /// Flag, allowing destruction of managed objects contained in fields of class protected override void Dispose(bool disposing) { if (disposing) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 2db2dd5..0aa68be 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -151,11 +151,11 @@ public object GetScriptDispatch() /// The scriptlet text to evaluate. The interpretation of this /// string depends on the scripting language /// The item name that gives the context in which the - /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated + /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated /// in the scripting engine's global context /// The context object. This object is reserved for use in a /// debugging environment, where such a context may be provided by the debugger to - /// represent an active run-time context. If this parameter is null, the engine + /// represent an active run-time context. If this parameter is null, the engine /// uses to identify the context. /// The end-of-scriptlet delimiter. When /// is parsed from a stream of text, the host typically uses a delimiter, such as two @@ -164,14 +164,14 @@ public object GetScriptDispatch() /// some conditional primitive preprocessing (for example, replacing a single quotation /// mark ['] with two single quotation marks for use as a delimiter). Exactly how /// (and if) the scripting engine makes use of this information depends on the - /// scripting engine. Set this parameter to null if the host did not use a delimiter + /// scripting engine. Set this parameter to null if the host did not use a delimiter /// to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes /// Zero-based value that specifies which line the /// parsing will begin at /// Flags associated with the scriptlet - /// The results of scriptlet processing, or null if the caller expects no + /// The results of scriptlet processing, or null if the caller expects no /// result (that is, the value is not set) public abstract object ParseScriptText(string code, string itemName, object context, string delimiter, UIntPtr sourceContextCookie, uint startingLineNumber, ScriptTextFlags flags); @@ -240,8 +240,7 @@ public void CollectGarbage(ScriptGCType type) /// /// Destroys object /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class + /// Flag, allowing destruction of managed objects contained in fields of class protected virtual void Dispose(bool disposing) { if (disposing) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index c9bbf35..21f1034 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -72,7 +72,7 @@ public ChakraActiveScriptJsEngine(JsEngineSettings settings) /// /// Checks a support of the Chakra Active Script engine on the machine /// - /// Result of check (true - supports; false - does not support) + /// Result of check (true - supports; false - does not support) public static bool IsSupported() { bool isSupported = IsSupported(ClassId.Chakra, ref _isSupported, ref _supportSynchronizer); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index be28650..cfe4aec 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -74,7 +74,7 @@ public ClassicActiveScriptJsEngine(JsEngineSettings settings) /// /// Checks a support of the Classic Active Script engine on the machine /// - /// Result of check (true - supports; false - does not support) + /// Result of check (true - supports; false - does not support) public static bool IsSupported() { bool isSupported = IsSupported(ClassId.Classic, ref _isSupported, ref _supportSynchronizer); diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs index 16cdea9..e58dd18 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugApplicationWrapper.cs @@ -112,7 +112,7 @@ public void CreateApplicationNode(out IDebugApplicationNode node) /// Returns the current debugger connected to the application /// /// The current debugger connected to the application - /// The method returns an HRESULT + /// The method returns an HRESULT public uint GetDebugger(out IApplicationDebugger debugger) { uint result = _is64Bit ? diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs index d5df6d2..45d2e46 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs @@ -38,7 +38,7 @@ internal struct DebugStackFrameDescriptor public bool IsFinal; /// - /// If this parameter is not null, the current enumerator merging should stop and + /// If this parameter is not null, the current enumerator merging should stop and /// a new one should be started. The object indicates how to start the new enumeration. /// public IntPtr pFinalObject; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs index e915cfe..21c2a6e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug32.cs @@ -53,7 +53,7 @@ [In] [Out] ref IntPtr pAttrs /// Character offset relative to start of script text /// Number of characters in this context /// An enumerator of the code contexts in the specified range - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint EnumCodeContextsOfPosition( [In] uint sourceContext, diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs index 8ee47fc..0a23f42 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptDebug64.cs @@ -53,7 +53,7 @@ [In] [Out] ref IntPtr pAttrs /// Character offset relative to start of script text /// Number of characters in this context /// An enumerator of the code contexts in the specified range - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint EnumCodeContextsOfPosition( [In] ulong sourceContext, diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs index bf43783..a7c0618 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IActiveScriptSiteDebug32.cs @@ -13,7 +13,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging internal interface IActiveScriptSiteDebug32 { /// - /// Used by the language engine to delegate IDebugCodeContext.GetSourceContext + /// Used by the language engine to delegate /// /// The source context as provided to /// or diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs index 6f11a2b..87a78c3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication32.cs @@ -48,7 +48,7 @@ [In] [MarshalAs(UnmanagedType.Interface)] IApplicationDebugger debugger /// Returns the current debugger connected to the application /// /// The current debugger connected to the application - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint GetDebugger( [Out] [MarshalAs(UnmanagedType.Interface)] out IApplicationDebugger debugger @@ -207,7 +207,7 @@ [In] uint cookie /// /// Determines if the current running thread is the debugger thread /// - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint QueryCurrentThreadIsDebuggerThread(); @@ -251,7 +251,7 @@ [In] [MarshalAs(UnmanagedType.IUnknown, IidParameterIndex = 0)] object eventObje /// Action to take when the debugger resumes the application /// Action to take when the debugger resumes the application /// if there is an error - /// Flag which is true if the engine should call + /// Flag which is true if the engine should call /// the method void HandleRuntimeError( [In] [MarshalAs(UnmanagedType.Interface)] IActiveScriptErrorDebug errorDebug, @@ -264,8 +264,8 @@ [Out] [MarshalAs(UnmanagedType.Bool)] out bool callOnScriptError /// /// Determines if a JIT debugger is registered /// - /// If the method succeeds and a JIT debugger is registered, the method returns true. - /// Otherwise, it returns false. + /// If the method succeeds and a JIT debugger is registered, the method returns true. + /// Otherwise, it returns false. [PreserveSig] [return: MarshalAs(UnmanagedType.Bool)] bool FCanJitDebug(); @@ -274,7 +274,7 @@ [Out] [MarshalAs(UnmanagedType.Bool)] out bool callOnScriptError /// Determines if a JIT debugger is registered to auto-debug dumb hosts /// /// If the method succeeds and a JIT debugger is registered to auto-debug dumb hosts, - /// the method returns true. Otherwise, it returns false. + /// the method returns true. Otherwise, it returns false. [PreserveSig] [return: MarshalAs(UnmanagedType.Bool)] bool FIsAutoJitDebugEnabled(); diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs index 036edc0..6f1993c 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugApplication64.cs @@ -48,7 +48,7 @@ [In] [MarshalAs(UnmanagedType.Interface)] IApplicationDebugger debugger /// Returns the current debugger connected to the application /// /// The current debugger connected to the application - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint GetDebugger( [Out] [MarshalAs(UnmanagedType.Interface)] out IApplicationDebugger debugger @@ -207,7 +207,7 @@ [In] uint cookie /// /// Determines if the current running thread is the debugger thread /// - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint QueryCurrentThreadIsDebuggerThread(); @@ -251,7 +251,7 @@ [In] [MarshalAs(UnmanagedType.IUnknown, IidParameterIndex = 0)] object eventObje /// Action to take when the debugger resumes the application /// Action to take when the debugger resumes the application /// if there is an error - /// Flag which is true if the engine should call + /// Flag which is true if the engine should call /// the method void HandleRuntimeError( [In] [MarshalAs(UnmanagedType.Interface)] IActiveScriptErrorDebug errorDebug, @@ -264,8 +264,8 @@ [Out] [MarshalAs(UnmanagedType.Bool)] out bool callOnScriptError /// /// Determines if a JIT debugger is registered /// - /// If the method succeeds and a JIT debugger is registered, the method returns true. - /// Otherwise, it returns false. + /// If the method succeeds and a JIT debugger is registered, the method returns true. + /// Otherwise, it returns false. [PreserveSig] [return: MarshalAs(UnmanagedType.Bool)] bool FCanJitDebug(); @@ -274,7 +274,7 @@ [Out] [MarshalAs(UnmanagedType.Bool)] out bool callOnScriptError /// Determines if a JIT debugger is registered to auto-debug dumb hosts /// /// If the method succeeds and a JIT debugger is registered to auto-debug dumb hosts, - /// the method returns true. Otherwise, it returns false. + /// the method returns true. Otherwise, it returns false. [PreserveSig] [return: MarshalAs(UnmanagedType.Bool)] bool FIsAutoJitDebugEnabled(); diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper32.cs index 59ebb17..958df77 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper32.cs @@ -4,8 +4,8 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// /// Provide implementations for many interfaces necessary for smart hosting, such as - /// the IDebugDocument, IDebugDocumentContext, IDebugDocumentProvider, IDebugDocumentText - /// and IDebugDocumentTextEvents interfaces + /// the IDebugDocument, IDebugDocumentContext, IDebugDocumentProvider, + /// IDebugDocumentText and IDebugDocumentTextEvents interfaces /// [ComImport] [Guid("51973C26-CB0C-11d0-B5C9-00A0244A0E7A")] diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper64.cs index c94ab07..4925b95 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentHelper64.cs @@ -4,8 +4,8 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// /// Provide implementations for many interfaces necessary for smart hosting, such as - /// the IDebugDocument, IDebugDocumentContext, IDebugDocumentProvider, IDebugDocumentText - /// and IDebugDocumentTextEvents interfaces + /// the IDebugDocument, IDebugDocumentContext, IDebugDocumentProvider, + /// IDebugDocumentText and IDebugDocumentTextEvents interfaces /// [ComImport] [Guid("c4c7363c-20fd-47f9-bd82-4855e0150871")] diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs index c652344..af74329 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugDocumentText.cs @@ -49,9 +49,9 @@ [Out] out TextDocAttrs attrs /// /// Returns the number of lines and number of characters in the document /// - /// Number of lines in the document. If this parameter is null, + /// Number of lines in the document. If this parameter is null, /// the method does not return a value - /// Number of characters in the document. If this parameter is null, + /// Number of characters in the document. If this parameter is null, /// the method does not return a value void GetSize( [Out] out uint numLines, @@ -76,7 +76,7 @@ [Out] out uint position /// Start location of the character position range /// The line number of the range /// The character offset of the range within line . - /// If this parameter is null, the method does not return a value + /// If this parameter is null, the method does not return a value void GetLineOfPosition( [In] uint position, [Out] out uint lineNumber, @@ -88,9 +88,9 @@ [Out] out uint offsetInLine /// /// Start location of the character position range /// A character text buffer. The buffer must be large enough to hold - /// characters. If this parameter is null, the method does not return characters. + /// characters. If this parameter is null, the method does not return characters. /// A character attribute buffer. The buffer must be large enough to hold - /// characters. If this parameter is null, the method does not return attributes. + /// characters. If this parameter is null, the method does not return attributes. /// The number of characters/attributes returned. This parameter must be set to /// zero before calling this method. /// Number of characters in the character position range. Also specifies diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs index 6e65835..9c62495 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugStackFrame.cs @@ -22,8 +22,8 @@ [Out] [MarshalAs(UnmanagedType.Interface)] out IDebugCodeContext context /// /// Returns a short or long textual description of the stack frame /// - /// Flag, where true returns a long description and - /// false returns a short description + /// Flag, where true returns a long description and + /// false returns a short description /// The description of the stack frame void GetDescriptionString( [In] [MarshalAs(UnmanagedType.Bool)] bool longString, @@ -33,8 +33,8 @@ [Out] [MarshalAs(UnmanagedType.BStr)] out string description /// /// Returns a short or long textual description of the language /// - /// Flag, where true returns a long description and - /// false returns a short description + /// Flag, where true returns a long description and + /// false returns a short description /// The description of the language void GetLanguageString( [In] [MarshalAs(UnmanagedType.Bool)] bool longString, diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs index 642367b..270c035 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall32.cs @@ -5,7 +5,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// /// The interface is typically implemented by a component that makes - /// cross-thread calls with the IDebugThread marshalling implementation provided by + /// cross-thread calls with the IDebugThread marshalling implementation provided by /// the process debug manager (PDM). /// [ComImport] diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs index 8c63485..2a87b8e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IDebugThreadCall64.cs @@ -5,7 +5,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// /// The interface is typically implemented by a component that makes - /// cross-thread calls with the IDebugThread marshalling implementation provided by + /// cross-thread calls with the IDebugThread marshalling implementation provided by /// the process debug manager (PDM). /// [ComImport] diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs index 00f7d49..fcc7d9d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/IEnumDebugExpressionContexts.cs @@ -4,7 +4,7 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging { /// - /// Enumerates a collection of IDebugExpressionContexts objects + /// Enumerates a collection of IDebugExpressionContexts objects /// [ComImport] [Guid("51973c40-cb0c-11d0-b5c9-00a0244a0e7a")] diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs index 3cd1459..8ae8f24 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/ProcessDebugManagerWrapper.cs @@ -51,7 +51,7 @@ public ProcessDebugManagerWrapper(IProcessDebugManager64 processDebugManager) /// the creation succeeded. /// /// Wrapper for process debug manager - /// true if the wrapper was created successfully; otherwise, false. + /// true if the wrapper was created successfully; otherwise, false. public static bool TryCreate(out ProcessDebugManagerWrapper wrapper) { const string progId = "ProcessDebugManager"; @@ -104,7 +104,7 @@ public void CreateApplication(out DebugApplicationWrapper applicationWrapper) /// /// Wrapper for debug application /// An engine-defined cookie - /// true if the debug application was added successfully; otherwise, false. + /// true if the debug application was added successfully; otherwise, false. public bool TryAddApplication(DebugApplicationWrapper applicationWrapper, out uint cookie) { uint result; diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs index b86ee0a..149e0d2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/SourceTextAttrs.cs @@ -13,7 +13,7 @@ internal enum SourceTextAttrs : ushort /// /// The character is part of a language keyword - /// (for example, the JavaScript keyword while) + /// (for example, the JavaScript keyword while) /// Keyword = 0x0001, @@ -30,19 +30,19 @@ internal enum SourceTextAttrs : ushort /// /// The character is part of a language operator - /// (for example, the arithmetic operator +) + /// (for example, the arithmetic operator +) /// Operator = 0x0008, /// /// The character is part of a language numeric constant - /// (for example, the constant 3.14159) + /// (for example, the constant 3.14159) /// Number = 0x0010, /// /// The character is part of a language string constant - /// (for example, the string "Hello World") + /// (for example, the string "Hello World") /// String = 0x0020, diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs index cdee6c9..4ce72e2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScript.cs @@ -84,8 +84,8 @@ [In] ScriptItemFlags flags /// /// Adds a type library to the name space for the script. This is similar to the - /// #include directive in C/C++. It allows a set of predefined items such as - /// class definitions, typedefs, and named constants to be added to the run-time + /// #include directive in C/C++. It allows a set of predefined items such as + /// class definitions, typedefs, and named constants to be added to the run-time /// environment available to the script. /// /// CLSID of the type library to add @@ -100,16 +100,16 @@ [In] ScriptTypeLibFlags typeLibFlags ); /// - /// Retrieves the IDispatch interface for the methods and properties associated + /// Retrieves the IDispatch interface for the methods and properties associated /// with the currently running script /// /// The name of the item for which the caller needs the associated - /// dispatch object. If this parameter is null, the dispatch object contains as its members + /// dispatch object. If this parameter is null, the dispatch object contains as its members /// all of the global methods and properties defined by the script. Through the - /// IDispatch interface and the associated interface, + /// IDispatch interface and the associated interface, /// the host can invoke script methods or view and modify script variables. /// The object associated with the script's global methods and - /// properties. If the scripting engine does not support such an object, null is returned. + /// properties. If the scripting engine does not support such an object, null is returned. void GetScriptDispatch( [In] [MarshalAs(UnmanagedType.LPWStr)] string itemName, [Out] [MarshalAs(UnmanagedType.IDispatch)] out object dispatch diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs index e009f67..10d8244 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptError.cs @@ -19,7 +19,7 @@ internal interface IActiveScriptError /// Retrieves information about an error that occurred while the scripting engine was running /// a script /// - /// An EXCEPINFO structure that receives error information + /// An EXCEPINFO structure that receives error information void GetExceptionInfo( [Out] out EXCEPINFO exceptionInfo ); diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs index b89d570..39c5f0f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse32.cs @@ -13,11 +13,11 @@ namespace MsieJavaScriptEngine.ActiveScript /// /// /// Before the scripting engine can be used, one of the following methods must be called: - /// IPersist.Load, IPersist.InitNew, or . The semantics of - /// this method are identical to IPersistStreamInit.InitNew, in that this method tells the scripting - /// engine to initialize itself. Note that it is not valid to call both IPersist.InitNew or - /// and IPersist.Load, nor is it valid to call - /// IPersist.InitNew, , or IPersist.Load more than once. + /// IPersist.Load, IPersist.InitNew, or . The semantics of + /// this method are identical to IPersistStreamInit.InitNew, in that this method tells the scripting + /// engine to initialize itself. Note that it is not valid to call both IPersist.InitNew or + /// and IPersist.Load, nor is it valid to call + /// IPersist.InitNew, , or IPersist.Load more than once. /// [ComImport] [Guid("bb1a2ae2-a4f9-11cf-8f20-00805f2cd064")] @@ -32,14 +32,14 @@ internal interface IActiveScriptParse32 /// /// Adds a code scriptlet to the script. This method is used in environments where the /// persistent state of the script is intertwined with the host document and the host - /// is responsible for restoring the script, rather than through an IPersist interface. + /// is responsible for restoring the script, rather than through an IPersist interface. /// The primary examples are HTML scripting languages that allow scriptlets of code /// embedded in the HTML document to be attached to intrinsic events (for instance, - /// ONCLICK="button1.text='Exit'"). + /// ONCLICK="button1.text='Exit'"). /// /// The default name to associate with the scriptlet. If the - /// scriptlet does not contain naming information (as in the ONCLICK example above), - /// this name will be used to identify the scriptlet. If this parameter is null, the + /// scriptlet does not contain naming information (as in the ONCLICK example above), + /// this name will be used to identify the scriptlet. If this parameter is null, the /// scripting engine manufactures a unique name, if necessary. /// The scriptlet text to add. The interpretation of this string /// depends on the scripting language. @@ -48,7 +48,7 @@ internal interface IActiveScriptParse32 /// scriptlet is an event handler. /// The name of a subobject of the named item with which this /// scriptlet is associated; this name must be found in the named item's type - /// information. This parameter is null if the scriptlet is to be associated with the + /// information. This parameter is null if the scriptlet is to be associated with the /// named item instead of a subitem. This parameter, in addition to /// , identifies the specific object for which the scriptlet /// is an event handler. @@ -61,7 +61,7 @@ internal interface IActiveScriptParse32 /// provide some conditional primitive preprocessing (for example, replacing a single /// quotation mark ['] with two single quotation marks for use as a delimiter). /// Exactly how (and if) the scripting engine makes use of this information depends - /// on the scripting engine. Set this parameter to null if the host did not use a + /// on the scripting engine. Set this parameter to null if the host did not use a /// delimiter to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes @@ -73,7 +73,7 @@ internal interface IActiveScriptParse32 /// default name provided in , or a unique name /// synthesized by the scripting engine. /// Exception information. This structure should be - /// filled in if DISP_E_EXCEPTION is returned + /// filled in if DISP_E_EXCEPTION is returned void AddScriptlet( [In] [MarshalAs(UnmanagedType.LPWStr)] string defaultName, [In] [MarshalAs(UnmanagedType.LPWStr)] string code, @@ -95,11 +95,11 @@ [Out] out EXCEPINFO exceptionInfo /// The scriptlet text to evaluate. The interpretation of this /// string depends on the scripting language /// The item name that gives the context in which the - /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated + /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated /// in the scripting engine's global context /// The context object. This object is reserved for use in a /// debugging environment, where such a context may be provided by the debugger to - /// represent an active run-time context. If this parameter is null, the engine + /// represent an active run-time context. If this parameter is null, the engine /// uses to identify the context. /// The end-of-scriptlet delimiter. When /// is parsed from a stream of text, the host typically uses a delimiter, such as two @@ -108,18 +108,18 @@ [Out] out EXCEPINFO exceptionInfo /// some conditional primitive preprocessing (for example, replacing a single quotation /// mark ['] with two single quotation marks for use as a delimiter). Exactly how /// (and if) the scripting engine makes use of this information depends on the - /// scripting engine. Set this parameter to null if the host did not use a delimiter + /// scripting engine. Set this parameter to null if the host did not use a delimiter /// to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes /// Zero-based value that specifies which line the /// parsing will begin at /// Flags associated with the scriptlet - /// The results of scriptlet processing, or null if the caller + /// The results of scriptlet processing, or null if the caller /// expects no result (that is, the value is /// not set) /// The exception information. This structure is filled if - /// returns DISP_E_EXCEPTION. + /// returns DISP_E_EXCEPTION. void ParseScriptText( [In] [MarshalAs(UnmanagedType.LPWStr)] string code, [In] [MarshalAs(UnmanagedType.LPWStr)] string itemName, diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs index d4342a1..bb98f86 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptParse64.cs @@ -13,11 +13,11 @@ namespace MsieJavaScriptEngine.ActiveScript /// /// /// Before the scripting engine can be used, one of the following methods must be called: - /// IPersist.Load, IPersist.InitNew, or . The semantics of - /// this method are identical to IPersistStreamInit.InitNew, in that this method tells the scripting - /// engine to initialize itself. Note that it is not valid to call both IPersist.InitNew or - /// and IPersist.Load, nor is it valid to call - /// IPersist.InitNew, , or IPersist.Load more than once. + /// IPersist.Load, IPersist.InitNew, or . The semantics of + /// this method are identical to IPersistStreamInit.InitNew, in that this method tells the scripting + /// engine to initialize itself. Note that it is not valid to call both IPersist.InitNew or + /// and IPersist.Load, nor is it valid to call + /// IPersist.InitNew, , or IPersist.Load more than once. /// [ComImport] [Guid("c7ef7658-e1ee-480e-97ea-d52cb4d76d17")] @@ -32,14 +32,14 @@ internal interface IActiveScriptParse64 /// /// Adds a code scriptlet to the script. This method is used in environments where the /// persistent state of the script is intertwined with the host document and the host - /// is responsible for restoring the script, rather than through an IPersist interface. + /// is responsible for restoring the script, rather than through an IPersist interface. /// The primary examples are HTML scripting languages that allow scriptlets of code /// embedded in the HTML document to be attached to intrinsic events (for instance, - /// ONCLICK="button1.text='Exit'"). + /// ONCLICK="button1.text='Exit'"). /// /// The default name to associate with the scriptlet. If the - /// scriptlet does not contain naming information (as in the ONCLICK example above), - /// this name will be used to identify the scriptlet. If this parameter is null, the + /// scriptlet does not contain naming information (as in the ONCLICK example above), + /// this name will be used to identify the scriptlet. If this parameter is null, the /// scripting engine manufactures a unique name, if necessary. /// The scriptlet text to add. The interpretation of this string /// depends on the scripting language. @@ -48,7 +48,7 @@ internal interface IActiveScriptParse64 /// scriptlet is an event handler. /// The name of a subobject of the named item with which this /// scriptlet is associated; this name must be found in the named item's type - /// information. This parameter is null if the scriptlet is to be associated with the + /// information. This parameter is null if the scriptlet is to be associated with the /// named item instead of a subitem. This parameter, in addition to /// , identifies the specific object for which the scriptlet /// is an event handler. @@ -61,7 +61,7 @@ internal interface IActiveScriptParse64 /// provide some conditional primitive preprocessing (for example, replacing a single /// quotation mark ['] with two single quotation marks for use as a delimiter). /// Exactly how (and if) the scripting engine makes use of this information depends - /// on the scripting engine. Set this parameter to null if the host did not use a + /// on the scripting engine. Set this parameter to null if the host did not use a /// delimiter to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes @@ -73,7 +73,7 @@ internal interface IActiveScriptParse64 /// default name provided in , or a unique name /// synthesized by the scripting engine. /// Exception information. This structure should be - /// filled in if DISP_E_EXCEPTION is returned + /// filled in if DISP_E_EXCEPTION is returned void AddScriptlet( [In] [MarshalAs(UnmanagedType.LPWStr)] string defaultName, [In] [MarshalAs(UnmanagedType.LPWStr)] string code, @@ -95,11 +95,11 @@ [Out] out EXCEPINFO exceptionInfo /// The scriptlet text to evaluate. The interpretation of this /// string depends on the scripting language /// The item name that gives the context in which the - /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated + /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated /// in the scripting engine's global context /// The context object. This object is reserved for use in a /// debugging environment, where such a context may be provided by the debugger to - /// represent an active run-time context. If this parameter is null, the engine + /// represent an active run-time context. If this parameter is null, the engine /// uses to identify the context. /// The end-of-scriptlet delimiter. When /// is parsed from a stream of text, the host typically uses a delimiter, such as two @@ -108,18 +108,18 @@ [Out] out EXCEPINFO exceptionInfo /// some conditional primitive preprocessing (for example, replacing a single quotation /// mark ['] with two single quotation marks for use as a delimiter). Exactly how /// (and if) the scripting engine makes use of this information depends on the - /// scripting engine. Set this parameter to null if the host did not use a delimiter + /// scripting engine. Set this parameter to null if the host did not use a delimiter /// to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes /// Zero-based value that specifies which line the /// parsing will begin at /// Flags associated with the scriptlet - /// The results of scriptlet processing, or null if the caller + /// The results of scriptlet processing, or null if the caller /// expects no result (that is, the value is /// not set) /// The exception information. This structure is filled if - /// returns DISP_E_EXCEPTION. + /// returns DISP_E_EXCEPTION. void ParseScriptText( [In] [MarshalAs(UnmanagedType.LPWStr)] string code, [In] [MarshalAs(UnmanagedType.LPWStr)] string itemName, diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs index 5c373ff..0cc4785 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptProperty.cs @@ -19,7 +19,7 @@ internal interface IActiveScriptProperty /// The property value to get /// Not used /// The value of the property - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint GetProperty( [In] uint dwProperty, @@ -33,7 +33,7 @@ [Out] out object pvarValue /// The property value to set /// Not used /// The value of the property - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint SetProperty( [In] uint dwProperty, diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs index 0bf8302..494dff0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSite.cs @@ -41,23 +41,23 @@ [Out] out int lcid /// returned. The scripting engine should request the minimum amount of information possible /// because some of the return parameters (for example, ) can take /// considerable time to load or generate. - /// A variable that receives a pointer to the IUnknown interface - /// associated with the given item. The scripting engine can use the IUnknown.QueryInterface - /// method to obtain the IDispatch interface for the item. This parameter receives null if + /// A variable that receives a pointer to the IUnknown interface + /// associated with the given item. The scripting engine can use the IUnknown.QueryInterface + /// method to obtain the IDispatch interface for the item. This parameter receives null if /// mask does not include the value. Also, it receives - /// null if there is no object associated with the item name; this mechanism is used to create + /// null if there is no object associated with the item name; this mechanism is used to create /// a simple class when the named item was added with the /// flag set in the method. /// A variable that receives a pointer to the - /// interface associated with the item. This parameter receives null if mask does not include + /// interface associated with the item. This parameter receives null if mask does not include /// the value, or if type information is not available /// for this item. If type information is not available, the object cannot source events, and - /// name binding must be realized with the IDispatch.GetIDsOfNames method. Note that the - /// interface retrieved describes the item's coclass (TKIND_COCLASS) + /// name binding must be realized with the IDispatch.GetIDsOfNames method. Note that the + /// interface retrieved describes the item's coclass (TKIND_COCLASS) /// because the object may support multiple interfaces and event interfaces. If the item supports - /// the IProvideMultipleTypeInfo interface, the interface retrieved is + /// the IProvideMultipleTypeInfo interface, the interface retrieved is /// the same as the index zero that would be obtained using the - /// IProvideMultipleTypeInfo.GetInfoOfIndex method. + /// IProvideMultipleTypeInfo.GetInfoOfIndex method. void GetItemInfo( [In] [MarshalAs(UnmanagedType.LPWStr)] string name, [In] ScriptInfoFlags mask, @@ -79,10 +79,10 @@ [Out] [MarshalAs(UnmanagedType.BStr)] out string version /// /// Informs the host that the script has completed execution /// - /// A variable that contains the script result, or null if the script + /// A variable that contains the script result, or null if the script /// produced no result /// Contains exception information generated when the script - /// terminated, or null if no exception was generated + /// terminated, or null if no exception was generated void OnScriptTerminate( [In] object result, [In] EXCEPINFO exceptionInfo diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs index c8c7c96..42aeb21 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptSiteInterruptPoll.cs @@ -15,7 +15,7 @@ internal interface IActiveScriptSiteInterruptPoll /// /// Allows a host to specify that a script should terminate /// - /// The method returns an HRESULT + /// The method returns an HRESULT [PreserveSig] uint QueryContinue(); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs index afe457f..fb1bcd1 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/IActiveScriptWrapper.cs @@ -60,11 +60,11 @@ ScriptItemFlags flags /// The scriptlet text to evaluate. The interpretation of this /// string depends on the scripting language /// The item name that gives the context in which the - /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated + /// scriptlet is to be evaluated. If this parameter is null, the code is evaluated /// in the scripting engine's global context /// The context object. This object is reserved for use in a /// debugging environment, where such a context may be provided by the debugger to - /// represent an active run-time context. If this parameter is null, the engine + /// represent an active run-time context. If this parameter is null, the engine /// uses to identify the context. /// The end-of-scriptlet delimiter. When /// is parsed from a stream of text, the host typically uses a delimiter, such as two @@ -73,14 +73,14 @@ ScriptItemFlags flags /// some conditional primitive preprocessing (for example, replacing a single quotation /// mark ['] with two single quotation marks for use as a delimiter). Exactly how /// (and if) the scripting engine makes use of this information depends on the - /// scripting engine. Set this parameter to null if the host did not use a delimiter + /// scripting engine. Set this parameter to null if the host did not use a delimiter /// to mark the end of the scriptlet. /// Application-defined value that is used for /// debugging purposes /// Zero-based value that specifies which line the /// parsing will begin at /// Flags associated with the scriptlet - /// The results of scriptlet processing, or null if the caller expects no + /// The results of scriptlet processing, or null if the caller expects no /// result (that is, the value is not set) object ParseScriptText( string code, diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs index ce14c46..fd135a0 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptRuntimeErrorNumber.cs @@ -23,7 +23,7 @@ internal static class JScriptRuntimeErrorNumber public const int OutOfStackSpace = 28; /// - /// Cannot assign to 'this' + /// Cannot assign to this /// public const int CannotAssignToThisKeyword = 5000; @@ -108,12 +108,12 @@ internal static class JScriptRuntimeErrorNumber public const int UnexpectedQuantifier = 5018; /// - /// Expected ']' in regular expression + /// Expected ] in regular expression /// public const int ExpectedRightSquareBracketInRegularExpression = 5019; /// - /// Expected ')' in regular expression + /// Expected ) in regular expression /// public const int ExpectedRightParenthesisInRegularExpression = 5020; diff --git a/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs index 40501e3..76544e7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/JScriptSyntaxErrorNumber.cs @@ -23,37 +23,37 @@ internal static class JScriptSyntaxErrorNumber public const int SyntaxError = 1002; /// - /// Expected ':' + /// Expected : /// public const int ExpectedColon = 1003; /// - /// Expected ';' + /// Expected ; /// public const int ExpectedSemicolon = 1004; /// - /// Expected '(' + /// Expected ( /// public const int ExpectedLeftParenthesis = 1005; /// - /// Expected ')' + /// Expected ) /// public const int ExpectedRightParenthesis = 1006; /// - /// Expected ']' + /// Expected ] /// public const int ExpectedRightSquareBracket = 1007; /// - /// Expected '{' + /// Expected { /// public const int ExpectedLeftCurlyBrace = 1008; /// - /// Expected '}' + /// Expected } /// public const int ExpectedRightCurlyBrace = 1009; @@ -63,12 +63,12 @@ internal static class JScriptSyntaxErrorNumber public const int ExpectedIdentifier = 1010; /// - /// Expected '=' + /// Expected = /// public const int ExpectedEqualSign = 1011; /// - /// Expected '/' + /// Expected / /// public const int ExpectedForwardSlash = 1012; @@ -88,17 +88,17 @@ internal static class JScriptSyntaxErrorNumber public const int UnterminatedComment = 1016; /// - /// 'return' statement outside of function + /// return statement outside of function /// public const int ReturnStatementOutsideOfFunction = 1018; /// - /// Can't have 'break' outside of loop + /// Can't have break outside of loop /// public const int CannotHaveBreakStatementOutsideOfLoop = 1019; /// - /// Can't have 'continue' outside of loop + /// Can't have continue outside of loop /// public const int CannotHaveContinueStatementOutsideOfLoop = 1020; @@ -108,7 +108,7 @@ internal static class JScriptSyntaxErrorNumber public const int ExpectedHexadecimalDigit = 1023; /// - /// Expected 'while' + /// Expected while /// public const int ExpectedWhileStatement = 1024; @@ -123,7 +123,7 @@ internal static class JScriptSyntaxErrorNumber public const int LabelNotFound = 1026; /// - /// 'default' can only appear once in a 'switch' statement + /// default can only appear once in a switch statement /// public const int DefaultStatementCanOnlyAppearOnceInSwitchStatement = 1027; @@ -133,7 +133,7 @@ internal static class JScriptSyntaxErrorNumber public const int ExpectedIdentifierStringOrNumber = 1028; /// - /// Expected '@end' + /// Expected @end /// public const int ExpectedConditionalCompilationEndStatement = 1029; @@ -148,12 +148,12 @@ internal static class JScriptSyntaxErrorNumber public const int ExpectedConstant = 1031; /// - /// Expected '@' + /// Expected @ /// public const int ExpectedAtSign = 1032; /// - /// Expected 'catch' + /// Expected catch /// public const int ExpectedCatchStatement = 1033; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs index 97d07e8..26088b3 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptInfoFlags.cs @@ -12,12 +12,12 @@ internal enum ScriptInfoFlags : uint None = 0, /// - /// Returns the IUnknown interface for this item + /// Returns the IUnknown interface for this item /// IUnknown = 1, /// - /// Returns the ITypeInfo interface for this item + /// Returns the ITypeInfo interface for this item /// ITypeInfo = 2 } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs index 5b9958a..b627cae 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptItemFlags.cs @@ -30,11 +30,11 @@ internal enum ScriptItemFlags : uint /// /// Indicates that the item is a collection of global properties and methods associated /// with the script. Normally, a scripting engine would ignore the object name (other than - /// for the purpose of using it as a cookie for the IActiveScriptSite.GetItemInfo method, + /// for the purpose of using it as a cookie for the method, /// or for resolving explicit scoping) and expose its members as global variables and /// methods. This allows the host to extend the library (run-time functions and so on) /// available to the script. It is left to the scripting engine to deal with name conflicts - /// (for example, when two ScriptItemFlags.GlobalMembers items have methods of the same + /// (for example, when two items have methods of the same /// name), although an error should not be returned because of this situation. /// GlobalMembers = 0x00000008, @@ -49,7 +49,7 @@ internal enum ScriptItemFlags : uint /// /// Indicates that the named item represents a code-only object, and that the host has no - /// IUnknown to be associated with this code-only object. The host only has a name for this + /// IUnknown to be associated with this code-only object. The host only has a name for this /// object. In object-oriented languages such as C++, this flag would create a class. /// Not all languages support this flag. /// diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs index 0bab796..6d83292 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptProperty.cs @@ -8,7 +8,7 @@ internal enum ScriptProperty : uint { /// /// Forces the scripting engine to divide in integer mode instead of floating point mode. - /// The default value is False. + /// The default value is false. /// IntegerMode = 0x00003000, diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs index da2b0ba..a8b8a92 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptState.cs @@ -7,21 +7,21 @@ namespace MsieJavaScriptEngine.ActiveScript internal enum ScriptState : uint { /// - /// Script has just been created, but has not yet been initialized using an IPersist* - /// interface and IActiveScript.SetScriptSite + /// Script has just been created, but has not yet been initialized using an IPersist* + /// interface and /// Uninitialized = 0, /// /// Script has been initialized, but is not running (connecting to other objects or /// sinking events) or executing any code. Code can be queried for execution by - /// calling the IActiveScriptParse.ParseScriptText method. + /// calling the IActiveScriptParse.ParseScriptText method. /// Initialized = 1, /// /// Script can execute code, but is not yet sinking the events of objects added by - /// the IActiveScript.AddNamedItem method + /// the IActiveScript.AddNamedItem method /// Started = 2, diff --git a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs index 3b43870..d8c9ba9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ScriptTextFlags.cs @@ -25,7 +25,7 @@ internal enum ScriptTextFlags : uint /// /// Indicates that the code added during this call should be saved if the scripting engine is saved - /// (for example, through a call to IPersist*::Save), or if the scripting engine is reset by way of + /// (for example, through a call to IPersist*.Save), or if the scripting engine is reset by way of /// a transition back to the initialized state. For more information about this state, see Script /// Engine States /// diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index e1b71ba..f6f42b1 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -12,7 +12,7 @@ internal static class StringExtensions /// /// Instance of /// The string without quotes to seek - /// true if the quoted value occurs within this string; otherwise, false + /// true if the quoted value occurs within this string; otherwise, false public static bool ContainsQuotedValue(this string source, string value) { if (source == null) @@ -128,7 +128,7 @@ public static string[] SplitToLines(this string source) /// When this method returns, contains the character from the string, /// if the receiving succeeded, or null character if the receiving failed. /// The receiving fails if the index out of bounds. - /// true if the character was received successfully; otherwise, false + /// true if the character was received successfully; otherwise, false public static bool TryGetChar(this string source, int index, out char result) { if (source == null) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 62536d5..0f37cf5 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -258,7 +258,7 @@ public Type[] ParameterTypes set; } - /// TODO: In future will need to change type to double + /// TODO: In future will need to change type to double public ushort CompatibilityScore { get; diff --git a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs index b1f7511..7098a15 100644 --- a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs @@ -34,7 +34,7 @@ public static class ValidationHelpers /// Checks whether supports a .NET type /// /// .NET type - /// Result of check (true - is supported; false - is not supported) + /// Result of check (true - is supported; false - is not supported) public static bool IsSupportedType(Type type) { bool result = _supportedTypes.Contains(type); @@ -46,7 +46,7 @@ public static bool IsSupportedType(Type type) /// Checks whether .NET type is primitive /// /// .NET type - /// Result of check (true - is primitive; false - is not primitive) + /// Result of check (true - is primitive; false - is not primitive) public static bool IsPrimitiveType(Type type) { return TypeConverter.IsPrimitiveType(type); @@ -56,7 +56,7 @@ public static bool IsPrimitiveType(Type type) /// Checks a format of the name /// /// The name - /// Result of check (true - correct format; false - wrong format) + /// Result of check (true - correct format; false - wrong format) public static bool CheckNameFormat(string name) { return _jsNameRegex.IsMatch(name); @@ -66,7 +66,7 @@ public static bool CheckNameFormat(string name) /// Checks a format of the document name /// /// The document name - /// Result of check (true - correct format; false - wrong format) + /// Result of check (true - correct format; false - wrong format) public static bool CheckDocumentNameFormat(string name) { return _documentNameRegex.IsMatch(name); diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index 0d5ed42..040dcb8 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -60,7 +60,7 @@ internal interface IInnerJsEngine : IDisposable /// Сhecks for the existence of a variable /// /// Name of variable - /// Result of check (true - exists; false - not exists + /// Result of check (true - exists; false - not exists bool HasVariable(string variableName); /// diff --git a/src/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs index e6311b8..f4b2094 100644 --- a/src/MsieJavaScriptEngine/JsEngineSettings.cs +++ b/src/MsieJavaScriptEngine/JsEngineSettings.cs @@ -50,7 +50,7 @@ public JsEngineMode EngineMode /// Gets or sets a maximum stack size in bytes /// /// - /// Set a 0 to use the default maximum stack size specified in the header + /// Set a 0 to use the default maximum stack size specified in the header /// for the executable. /// /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 2216747..d7271ac 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -121,7 +121,7 @@ private static EdgeJsRuntime CreateJsRuntime() /// /// Checks a support of the Chakra “Edge” JsRT engine /// - /// Result of check (true - supports; false - does not support) + /// Result of check (true - supports; false - does not support) public static bool IsSupported() { if (_isSupported.HasValue) @@ -191,7 +191,7 @@ private static void RemoveReferenceToValue(EdgeJsValue value) /// Checks whether the value can have references /// /// The value - /// Result of check (true - may have; false - may not have) + /// Result of check (true - may have; false - may not have) private static bool CanHaveReferences(EdgeJsValue value) { JsValueType valueType = value.ValueType; @@ -772,8 +772,7 @@ public override void Dispose() /// /// Destroys object /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class + /// Flag, allowing destruction of managed objects contained in fields of class private void Dispose(bool disposing) { if (disposing) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index fc91404..ffde72d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -314,7 +314,7 @@ public static void StartDebugging() /// Adds a reference to a script context /// /// - /// Calling AddRef ensures that the context will not be freed until Release is called. + /// Calling AddRef ensures that the context will not be freed until Release is called. /// /// The object's new reference count public uint AddRef() @@ -329,7 +329,7 @@ public uint AddRef() /// Releases a reference to a script context /// /// - /// Removes a reference to a context that was created by AddRef. + /// Removes a reference to a context that was created by AddRef. /// /// The object's new reference count public uint Release() diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs index 9eefe16..755eaaa 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsErrorHelpers.cs @@ -122,7 +122,7 @@ public static void ThrowIfError(JsErrorCode errorCode) /// - /// Creates a new JavaScript error object + /// Creates a new JavaScript Error object /// /// /// Requires an active script context. @@ -138,7 +138,7 @@ public static EdgeJsValue CreateError(string message) } /// - /// Creates a new JavaScript RangeError error object + /// Creates a new JavaScript RangeError error object /// /// /// Requires an active script context. @@ -154,7 +154,7 @@ public static EdgeJsValue CreateRangeError(string message) } /// - /// Creates a new JavaScript ReferenceError error object + /// Creates a new JavaScript ReferenceError error object /// /// /// Requires an active script context. @@ -170,7 +170,7 @@ public static EdgeJsValue CreateReferenceError(string message) } /// - /// Creates a new JavaScript SyntaxError error object + /// Creates a new JavaScript SyntaxError error object /// /// /// Requires an active script context. @@ -186,7 +186,7 @@ public static EdgeJsValue CreateSyntaxError(string message) } /// - /// Creates a new JavaScript TypeError error object + /// Creates a new JavaScript TypeError error object /// /// /// Requires an active script context. @@ -202,7 +202,7 @@ public static EdgeJsValue CreateTypeError(string message) } /// - /// Creates a new JavaScript URIError error object + /// Creates a new JavaScript URIError error object /// /// /// Requires an active script context. diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs index f3ca6a0..30f79a2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsNativeFunction.cs @@ -7,7 +7,7 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// “Edge” function callback /// /// The Function object that represents the function being invoked - /// Indicates whether this is a regular call or a 'new' call + /// Indicates whether this is a regular call or a new call /// The arguments to the call /// The number of arguments /// Callback data, if any diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs index 38ff239..89d449e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs @@ -17,7 +17,7 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// /// NOTE: A , unlike other objects in the Chakra hosting API, is not /// garbage collected since it contains the garbage collected heap itself. A runtime will - /// continue to exist until Dispose is called. + /// continue to exist until Dispose is called. /// /// internal struct EdgeJsRuntime : IDisposable @@ -121,7 +121,7 @@ public static EdgeJsRuntime Create(JsRuntimeAttributes attributes) /// Creates a new runtime /// /// The attributes of the runtime to be created - /// The thread service for the runtime. Can be null + /// The thread service for the runtime. Can be null /// The runtime created public static EdgeJsRuntime Create(JsRuntimeAttributes attributes, JsThreadServiceCallback threadServiceCallback) { @@ -147,7 +147,7 @@ public void CollectGarbage() /// Registering a memory allocation callback will cause the runtime to call back to the host /// whenever it acquires memory from, or releases memory to, the OS. The callback routine is /// called before the runtime memory manager allocates a block of memory. The allocation will - /// be rejected if the callback returns false. The runtime memory manager will also invoke the + /// be rejected if the callback returns false. The runtime memory manager will also invoke the /// callback routine after freeing a block of memory, as well as after allocation failures. /// /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs index 67e8c34..140fa09 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsValue.cs @@ -7,8 +7,8 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// “Edge” JavaScript value /// /// - /// The JavaScript value is one of the following types of values: Undefined, Null, Boolean, - /// String, Number, or Object. + /// The JavaScript value is one of the following types of values: undefined, null, Boolean, + /// String, Number, or Object. /// internal struct EdgeJsValue { @@ -326,8 +326,8 @@ public static EdgeJsValue CreateObject() /// /// Requires an active script context. /// - /// External data that the object will represent. May be null - /// The callback for when the object is finalized. May be null. + /// External data that the object will represent. May be null + /// The callback for when the object is finalized. May be null. /// The new Object public static EdgeJsValue CreateExternalObject(IntPtr data, JsFinalizeCallback finalizer) { @@ -387,7 +387,7 @@ public static EdgeJsValue CreateArray(uint length) } /// - /// Creates a new JavaScript error object + /// Creates a new JavaScript Error object /// /// /// Requires an active script context. @@ -403,7 +403,7 @@ public static EdgeJsValue CreateError(EdgeJsValue message) } /// - /// Creates a new JavaScript RangeError error object + /// Creates a new JavaScript RangeError error object /// /// /// Requires an active script context. @@ -419,7 +419,7 @@ public static EdgeJsValue CreateRangeError(EdgeJsValue message) } /// - /// Creates a new JavaScript ReferenceError error object + /// Creates a new JavaScript ReferenceError error object /// /// /// Requires an active script context. @@ -435,7 +435,7 @@ public static EdgeJsValue CreateReferenceError(EdgeJsValue message) } /// - /// Creates a new JavaScript SyntaxError error object + /// Creates a new JavaScript SyntaxError error object /// /// /// Requires an active script context. @@ -451,7 +451,7 @@ public static EdgeJsValue CreateSyntaxError(EdgeJsValue message) } /// - /// Creates a new JavaScript TypeError error object + /// Creates a new JavaScript TypeError error object /// /// /// Requires an active script context. @@ -467,7 +467,7 @@ public static EdgeJsValue CreateTypeError(EdgeJsValue message) } /// - /// Creates a new JavaScript URIError error object + /// Creates a new JavaScript URIError error object /// /// /// Requires an active script context. @@ -487,8 +487,8 @@ public static EdgeJsValue CreateUriError(EdgeJsValue message) /// /// /// This only needs to be called on objects that are not going to be stored somewhere on - /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed - /// until Release is called. + /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed + /// until Release is called. /// /// The object's new reference count public uint AddRef() @@ -503,7 +503,7 @@ public uint AddRef() /// Releases a reference to the object /// /// - /// Removes a reference that was created by AddRef. + /// Removes a reference that was created by AddRef. /// /// The object's new reference count public uint Release() @@ -534,7 +534,7 @@ public bool ToBoolean() /// /// /// - /// This function retrieves the value of a Number value. It will fail with + /// This function retrieves the value of a Number value. It will fail with /// InvalidArgument if the type of the value is not Number. /// /// @@ -838,7 +838,7 @@ public void DeleteIndexedProperty(EdgeJsValue index) /// /// /// - /// This function is equivalent to the "==" operator in JavaScript. + /// This function is equivalent to the == operator in JavaScript. /// /// /// Requires an active script context. @@ -859,7 +859,7 @@ public bool Equals(EdgeJsValue other) /// /// /// - /// This function is equivalent to the "===" operator in JavaScript. + /// This function is equivalent to the === operator in JavaScript. /// /// /// Requires an active script context. @@ -882,7 +882,7 @@ public bool StrictEquals(EdgeJsValue other) /// Requires an active script context. /// /// The arguments to the call - /// The Value returned from the function invocation, if any + /// The JavaScript value returned from the function invocation, if any public EdgeJsValue CallFunction(params EdgeJsValue[] arguments) { EdgeJsValue returnReference; @@ -904,7 +904,7 @@ public EdgeJsValue CallFunction(params EdgeJsValue[] arguments) /// Requires an active script context. /// /// The arguments to the call - /// The Value returned from the function invocation + /// The JavaScript value returned from the function invocation public EdgeJsValue ConstructObject(params EdgeJsValue[] arguments) { EdgeJsValue returnReference; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 759544d..11fddd7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -137,7 +137,7 @@ private static IeJsRuntime CreateJsRuntime() /// /// Checks a support of the Chakra “IE” JsRT engine /// - /// Result of check (true - supports; false - does not support) + /// Result of check (true - supports; false - does not support) public static bool IsSupported() { if (_isSupported.HasValue) @@ -224,7 +224,7 @@ private static void RemoveReferenceToValue(IeJsValue value) /// Checks whether the value can have references /// /// The value - /// Result of check (true - may have; false - may not have) + /// Result of check (true - may have; false - may not have) private static bool CanHaveReferences(IeJsValue value) { JsValueType valueType = value.ValueType; @@ -826,8 +826,7 @@ public override void Dispose() /// /// Destroys object /// - /// Flag, allowing destruction of - /// managed objects contained in fields of class + /// Flag, allowing destruction of managed objects contained in fields of class private void Dispose(bool disposing) { if (disposing) diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 0aed8ff..9c869bf 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -360,7 +360,7 @@ public static void StartDebugging() /// Adds a reference to a script context /// /// - /// Calling AddRef ensures that the context will not be freed until Release is called. + /// Calling AddRef ensures that the context will not be freed until Release is called. /// /// The object's new reference count public uint AddRef() @@ -375,7 +375,7 @@ public uint AddRef() /// Releases a reference to a script context /// /// - /// Removes a reference to a context that was created by AddRef. + /// Removes a reference to a context that was created by AddRef. /// /// The object's new reference count public uint Release() diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs index 4432941..b0346cd 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsErrorHelpers.cs @@ -122,7 +122,7 @@ public static void ThrowIfError(JsErrorCode errorCode) /// - /// Creates a new JavaScript error object + /// Creates a new JavaScript Error object /// /// /// Requires an active script context. @@ -138,7 +138,7 @@ public static IeJsValue CreateError(string message) } /// - /// Creates a new JavaScript RangeError error object + /// Creates a new JavaScript RangeError error object /// /// /// Requires an active script context. @@ -154,7 +154,7 @@ public static IeJsValue CreateRangeError(string message) } /// - /// Creates a new JavaScript ReferenceError error object + /// Creates a new JavaScript ReferenceError error object /// /// /// Requires an active script context. @@ -170,7 +170,7 @@ public static IeJsValue CreateReferenceError(string message) } /// - /// Creates a new JavaScript SyntaxError error object + /// Creates a new JavaScript SyntaxError error object /// /// /// Requires an active script context. @@ -186,7 +186,7 @@ public static IeJsValue CreateSyntaxError(string message) } /// - /// Creates a new JavaScript TypeError error object + /// Creates a new JavaScript TypeError error object /// /// /// Requires an active script context. @@ -202,7 +202,7 @@ public static IeJsValue CreateTypeError(string message) } /// - /// Creates a new JavaScript URIError error object + /// Creates a new JavaScript URIError error object /// /// /// Requires an active script context. diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs index 517db1d..e7bb0a4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsNativeFunction.cs @@ -7,7 +7,7 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// “IE” function callback /// /// The Function object that represents the function being invoked - /// Indicates whether this is a regular call or a 'new' call + /// Indicates whether this is a regular call or a new call /// The arguments to the call /// The number of arguments /// Callback data, if any diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs index bd5c95c..6f183ca 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs @@ -20,7 +20,7 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// /// NOTE: A , unlike other objects in the Chakra hosting API, is not /// garbage collected since it contains the garbage collected heap itself. A runtime will - /// continue to exist until Dispose is called. + /// continue to exist until Dispose is called. /// /// internal struct IeJsRuntime : IDisposable @@ -126,7 +126,7 @@ public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersio /// /// The attributes of the runtime to be created /// The version of the runtime to be created - /// The thread service for the runtime. Can be null. + /// The thread service for the runtime. Can be null. /// The runtime created public static IeJsRuntime Create(JsRuntimeAttributes attributes, JsRuntimeVersion version, JsThreadServiceCallback threadServiceCallback) { @@ -152,7 +152,7 @@ public void CollectGarbage() /// Registering a memory allocation callback will cause the runtime to call back to the host /// whenever it acquires memory from, or releases memory to, the OS. The callback routine is /// called before the runtime memory manager allocates a block of memory. The allocation will - /// be rejected if the callback returns false. The runtime memory manager will also invoke the + /// be rejected if the callback returns false. The runtime memory manager will also invoke the /// callback routine after freeing a block of memory, as well as after allocation failures. /// /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs index b07fe42..bb6caa1 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsValue.cs @@ -8,8 +8,8 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// “IE” JavaScript value /// /// - /// The JavaScript value is one of the following types of values: Undefined, Null, Boolean, - /// String, Number, or Object. + /// The JavaScript value is one of the following types of values: undefined, null, Boolean, + /// String, Number, or Object. /// internal struct IeJsValue { @@ -327,8 +327,8 @@ public static IeJsValue CreateObject() /// /// Requires an active script context. /// - /// External data that the object will represent. May be null. - /// A callback for when the object is finalized. May be null. + /// External data that the object will represent. May be null. + /// A callback for when the object is finalized. May be null. /// The new Object public static IeJsValue CreateExternalObject(IntPtr data, JsFinalizeCallback finalizer) { @@ -388,7 +388,7 @@ public static IeJsValue CreateArray(uint length) } /// - /// Creates a new JavaScript error object + /// Creates a new JavaScript Error object /// /// /// Requires an active script context. @@ -404,7 +404,7 @@ public static IeJsValue CreateError(IeJsValue message) } /// - /// Creates a new JavaScript RangeError error object + /// Creates a new JavaScript RangeError error object /// /// /// Requires an active script context. @@ -420,7 +420,7 @@ public static IeJsValue CreateRangeError(IeJsValue message) } /// - /// Creates a new JavaScript ReferenceError error object + /// Creates a new JavaScript ReferenceError error object /// /// /// Requires an active script context. @@ -436,7 +436,7 @@ public static IeJsValue CreateReferenceError(IeJsValue message) } /// - /// Creates a new JavaScript SyntaxError error object + /// Creates a new JavaScript SyntaxError error object /// /// /// Requires an active script context. @@ -452,7 +452,7 @@ public static IeJsValue CreateSyntaxError(IeJsValue message) } /// - /// Creates a new JavaScript TypeError error object + /// Creates a new JavaScript TypeError error object /// /// /// Requires an active script context. @@ -468,7 +468,7 @@ public static IeJsValue CreateTypeError(IeJsValue message) } /// - /// Creates a new JavaScript URIError error object + /// Creates a new JavaScript URIError error object /// /// /// Requires an active script context. @@ -488,8 +488,8 @@ public static IeJsValue CreateUriError(IeJsValue message) /// /// /// This only needs to be called on objects that are not going to be stored somewhere on - /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed - /// until Release is called + /// the stack. Calling AddRef ensures that the JavaScript object the value refers to will not be freed + /// until Release is called /// /// The object's new reference count public uint AddRef() @@ -504,7 +504,7 @@ public uint AddRef() /// Releases a reference to the object /// /// - /// Removes a reference that was created by AddRef. + /// Removes a reference that was created by AddRef. /// /// The object's new reference count public uint Release() @@ -838,7 +838,7 @@ public void DeleteIndexedProperty(IeJsValue index) /// /// /// - /// This function is equivalent to the "==" operator in JavaScript. + /// This function is equivalent to the == operator in JavaScript. /// /// /// Requires an active script context. @@ -859,7 +859,7 @@ public bool Equals(IeJsValue other) /// /// /// - /// This function is equivalent to the "===" operator in JavaScript. + /// This function is equivalent to the === operator in JavaScript. /// /// /// Requires an active script context. @@ -882,7 +882,7 @@ public bool StrictEquals(IeJsValue other) /// Requires an active script context. /// /// The arguments to the call - /// The Value returned from the function invocation, if any + /// The JavaScript value returned from the function invocation, if any public IeJsValue CallFunction(params IeJsValue[] arguments) { IeJsValue returnReference; @@ -904,7 +904,7 @@ public IeJsValue CallFunction(params IeJsValue[] arguments) /// Requires an active script context. /// /// The arguments to the call - /// The Value returned from the function invocation + /// The JavaScript value returned from the function invocation public IeJsValue ConstructObject(params IeJsValue[] arguments) { IeJsValue returnReference; diff --git a/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs index dfcc3ab..a193022 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsBeforeCollectCallback.cs @@ -5,6 +5,6 @@ namespace MsieJavaScriptEngine.JsRt /// /// The callback called before collection /// - /// The state passed to SetBeforeCollectCallback + /// The state passed to SetBeforeCollectCallback internal delegate void JsBeforeCollectCallback(IntPtr callbackState); } \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs index c747fed..aa56c5c 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs @@ -25,7 +25,7 @@ public enum JsErrorCode : uint InvalidArgument, /// - /// An argument to a hosting API was null in a context where null is not allowed + /// An argument to a hosting API was null in a context where null is not allowed /// NullArgument, @@ -77,7 +77,7 @@ public enum JsErrorCode : uint HeapEnumInProgress, /// - /// A hosting API that operates on Object values was called with a non-Object value + /// A hosting API that operates on Object values was called with a non-Object value /// ArgumentNotObject, diff --git a/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs index 4fa09cd..3e42539 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsMemoryAllocationCallback.cs @@ -5,12 +5,12 @@ namespace MsieJavaScriptEngine.JsRt /// /// User implemented callback routine for memory allocation events /// - /// The state passed to SetRuntimeMemoryAllocationCallback + /// The state passed to SetRuntimeMemoryAllocationCallback /// The type of type allocation event /// The size of the allocation /// - /// For the Allocate event, returning true allows the runtime to continue with - /// allocation. Returning false indicates the allocation request is rejected. The return value + /// For the Allocate event, returning true allows the runtime to continue with + /// allocation. Returning false indicates the allocation request is rejected. The return value /// is ignored for other allocation events. /// internal delegate bool JsMemoryAllocationCallback(IntPtr callbackState, JsMemoryEventType allocationEvent, UIntPtr allocationSize); diff --git a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs index de0b008..cd0fdfd 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs @@ -38,7 +38,7 @@ internal enum JsRuntimeAttributes DisableNativeCodeGeneration = 0x00000008, /// - /// Using Eval or Function constructor will throw an exception + /// Using eval or Function constructor will throw an exception /// [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] DisableEval = 0x00000010 diff --git a/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs b/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs index 6f9df33..5ab1e0d 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsThreadServiceCallback.cs @@ -9,7 +9,7 @@ namespace MsieJavaScriptEngine.JsRt /// The host can specify a background thread service when creating a runtime. If /// specified, then background work items will be passed to the host using this callback. The /// host is expected to either begin executing the background work item immediately and return - /// true or return false and the runtime will handle the work item in-thread. + /// true or return false and the runtime will handle the work item in-thread. /// /// The callback for the background work item /// The data argument to be passed to the callback diff --git a/src/MsieJavaScriptEngine/JsRt/JsValueType.cs b/src/MsieJavaScriptEngine/JsRt/JsValueType.cs index b50cfa7..e51dcff 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsValueType.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsValueType.cs @@ -16,37 +16,37 @@ internal enum JsValueType Null = 1, /// - /// The value is a JavaScript number value + /// The value is a JavaScript Number value /// Number = 2, /// - /// The value is a JavaScript string value + /// The value is a JavaScript String value /// String = 3, /// - /// The value is a JavaScript Boolean value + /// The value is a JavaScript Boolean value /// Boolean = 4, /// - /// The value is a JavaScript object value + /// The value is a JavaScript Object value /// Object = 5, /// - /// The value is a JavaScript function object value + /// The value is a JavaScript Function object value /// Function = 6, /// - /// The value is a JavaScript error object value + /// The value is a JavaScript Error object value /// Error = 7, /// - /// The value is a JavaScript array object value + /// The value is a JavaScript Array object value /// Array = 8 } diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 206b5b1..93f21b9 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -1047,7 +1047,7 @@ public T CallFunction(string functionName, params object[] args) /// Сhecks for the existence of a variable /// /// Name of variable - /// Result of check (true - exists; false - not exists + /// Result of check (true - exists; false - not exists /// /// /// diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index ad5041e..4cdbdf2 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -56,7 +56,7 @@ public ScriptDispatcher() /// Constructs an instance of script dispatcher /// /// The maximum stack size, in bytes, to be used by the thread, - /// or 0 to use the default maximum stack size specified in the header for the executable. + /// or 0 to use the default maximum stack size specified in the header for the executable. public ScriptDispatcher(int maxStackSize) { _thread = new Thread(StartThread, maxStackSize) @@ -257,7 +257,7 @@ private abstract class ScriptTask : IDisposable /// /// Gets a exception, that occurred during the invocation of delegate. - /// If no exception has occurred, this will be null. + /// If no exception has occurred, this will be null. /// public Exception Exception { diff --git a/src/MsieJavaScriptEngine/Undefined.cs b/src/MsieJavaScriptEngine/Undefined.cs index f44eea9..a7097fc 100644 --- a/src/MsieJavaScriptEngine/Undefined.cs +++ b/src/MsieJavaScriptEngine/Undefined.cs @@ -1,12 +1,12 @@ namespace MsieJavaScriptEngine { /// - /// Represents an JS undefined type + /// Represents an JS undefined type /// public sealed class Undefined { /// - /// Gets a one and only undefined instance + /// Gets a one and only undefined instance /// public static readonly Undefined Value = new Undefined(); diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index e40c5ec..38bdc4a 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -64,7 +64,7 @@ public static object ConvertToType(object value, Type targetType) /// The type to convert the value to /// The value to convert /// The value that has been converted to the target type - /// Result of conversion (true - success; false - failure) + /// Result of conversion (true - success; false - failure) public static bool TryConvertToType(object value, out T convertedValue) { object resultValue; @@ -82,7 +82,7 @@ public static bool TryConvertToType(object value, out T convertedValue) /// The value to convert /// The type to convert the value to /// The value that has been converted to the target type - /// Result of conversion (true - success; false - failure) + /// Result of conversion (true - success; false - failure) public static bool TryConvertToType(object value, Type targetType, out object convertedValue) { bool result = ConvertObjectToType(value, targetType, false, out convertedValue); @@ -94,7 +94,7 @@ public static bool TryConvertToType(object value, Type targetType, out object co /// Checks whether .NET type is primitive /// /// .NET type - /// Result of check (true - is primitive; false - is not primitive) + /// Result of check (true - is primitive; false - is not primitive) internal static bool IsPrimitiveType(Type type) { TypeCode typeCode = type.GetTypeCode(); @@ -107,7 +107,7 @@ internal static bool IsPrimitiveType(Type type) /// Checks whether .NET type is primitive /// /// .NET type code - /// Result of check (true - is primitive; false - is not primitive) + /// Result of check (true - is primitive; false - is not primitive) internal static bool IsPrimitiveType(TypeCode typeCode) { bool result = _primitiveTypeCodes.Contains(typeCode); diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 96ff86e..7acb73a 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -13,7 +13,7 @@ internal static class Utils /// /// Determines whether the current process is a 64-bit process /// - /// true if the process is 64-bit; otherwise, false + /// true if the process is 64-bit; otherwise, false [MethodImpl((MethodImplOptions)256 /* AggressiveInlining */)] public static bool Is64BitProcess() { From 013fe2566f530f2bf9cd0d8dca1bdc9dd277859f Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 6 Feb 2023 18:17:25 +0300 Subject: [PATCH 207/238] JSON2 library was updated to version of October 30, 2022 --- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/Resources/json2.js | 39 ++++++++++++++++++- src/MsieJavaScriptEngine/readme.txt | 5 ++- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 96ed984..d9bd983 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,8 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types. + 1. In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types; +2. JSON2 library was updated to version of October 30, 2022. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js index f6fada6..adac444 100644 --- a/src/MsieJavaScriptEngine/Resources/json2.js +++ b/src/MsieJavaScriptEngine/Resources/json2.js @@ -1,5 +1,5 @@ // json2.js -// 2017-06-12 +// 2022-10-30 // Public Domain. // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. @@ -231,6 +231,29 @@ if (typeof JSON !== "object") { } +// This variable is initialized with an empty array every time +// JSON.stringify() is invoked and checked by the str() function. It's +// used to keep references to object structures and capture cyclic +// objects. Every new object is checked for its existence in this +// array. If it's found it means the JSON object is cyclic and we have +// to stop execution and throw a TypeError accordingly the ECMA262 +// (see NOTE 1 by the link https://tc39.es/ecma262/#sec-json.stringify). + + var seen; + +// Emulate [].includes(). It's actual for old-fashioned JScript. + + function includes(array, value) { + var i; + for (i = 0; i < array.length; i += 1) { + if (value === array[i]) { + return true; + } + } + return false; + } + + function str(key, holder) { // Produce a string from holder[key]. @@ -295,6 +318,16 @@ if (typeof JSON !== "object") { return "null"; } +// Check the value is not circular object. Otherwise throw TypeError. + + if (includes(seen, value)) { + throw new TypeError("Converting circular structure to JSON"); + } + +// Keep the value for the further check on circular references. + + seen.push(value); + // Make an array to hold the partial results of stringifying this object value. gap += indent; @@ -428,6 +461,10 @@ if (typeof JSON !== "object") { throw new Error("JSON.stringify"); } +// Initialize the reference keeper. + + seen = []; + // Make a fake root object containing our value under the key of "". // Return the result of stringifying the value. diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8599766..7b59921 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,9 @@ ============= RELEASE NOTES ============= - In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no - longer used for embedding objects and types. + 1. In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are + no longer used for embedding objects and types; + 2. JSON2 library was updated to version of October 30, 2022. ============ PROJECT SITE From cb35c8db6092a1c25605a6fb59dd700ef01d3e14 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 6 Feb 2023 20:31:17 +0300 Subject: [PATCH 208/238] Version 3.1.0 --- CHANGELOG.md | 12 ++++--- LICENSE.txt | 2 +- README.md | 33 +++++++++---------- build/common.props | 2 +- .../MsieJavaScriptEngine.csproj | 4 +-- src/MsieJavaScriptEngine/Resources/ES5.js | 6 ++-- .../NetFrameworkStrings.ru-ru.Designer.cs | 0 src/MsieJavaScriptEngine/readme.txt | 10 +++--- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- ...criptEngine.Test.ChakraActiveScript.csproj | 2 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 15 files changed, 43 insertions(+), 40 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cdc77c..5c11bf7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,10 @@ Change log ========== +## v3.1.0 - February 6, 2023 + * In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types + * JSON2 library was updated to version of October 30, 2022 + ## v3.0.9 - July 20, 2022 * Now a case-sensitive cultural postfixes are used in the names of `.resx` files @@ -233,14 +237,14 @@ Change log * Fixed [JavaScriptEngineSwitcher.Msie's bug #7](https://github.com/Taritsyn/JavaScriptEngineSwitcher/issues/7) "MsieJavaScriptEngine.ActiveScript.ActiveScriptException not wrapped" ## v1.4.2 - March 24, 2014 - * Fixed [JavaScriptEngineSwitcher.Msie's bug #5](http://github.com/Taritsyn/JavaScriptEngineSwitcher/issues/5) "MSIE "Catastrophic failure" when disposing" + * Fixed [JavaScriptEngineSwitcher.Msie's bug #5](https://github.com/Taritsyn/JavaScriptEngineSwitcher/issues/5) "MSIE "Catastrophic failure" when disposing" ## v1.4.1 - March 22, 2014 * Fixed minor bugs ## v1.4.0 - February 27, 2014 * Removed following methods: `HasProperty`, `GetPropertyValue`, `SetPropertyValue` and `RemoveProperty` - * Fixed [bug #3](http://github.com/Taritsyn/MsieJavaScriptEngine/issues/3) "execute code from different threads" + * Fixed [bug #3](https://github.com/Taritsyn/MsieJavaScriptEngine/issues/3) "execute code from different threads" * Now in the `ChakraJsRt` mode is available a more detailed information about errors * In ECMAScript 5 Polyfill improved a performance of the `String.prototype.trim` method * JSON2 library was updated to version of February 4, 2014 @@ -264,7 +268,7 @@ Change log * Assembly `MsieJavaScriptEngine.dll` now signed ## v1.1.0 - October 11, 2012 - * Added ability of using the Douglas Crockford's [JSON2](http://github.com/douglascrockford/JSON-js) library + * Added ability of using the Douglas Crockford's [JSON2](https://github.com/douglascrockford/JSON-js) library * By default using of the JSON2 library is disabled ## v1.0.8 - September 21, 2012 @@ -274,7 +278,7 @@ Change log * Added the `ActiveScriptErrorFormatter` class ## v1.0.5 - August 29, 2012 - * [JavaScript Array Polyfills from TutorialsPoint.com](http://www.tutorialspoint.com/javascript/) was replaced by the Douglas Crockford's [ECMAScript 5 Polyfill](http://nuget.org/packages/ES5) + * [JavaScript Array Polyfills from TutorialsPoint.com](https://www.tutorialspoint.com/javascript/) was replaced by the Douglas Crockford's [ECMAScript 5 Polyfill](https://www.nuget.org/packages/ES5) * By default using of the ECMAScript 5 Polyfill is disabled ## v1.0.1 - August 27, 2012 diff --git a/LICENSE.txt b/LICENSE.txt index 1b36598..55c4d50 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2022 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2023 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/README.md b/README.md index 9727a00..c152ac5 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ MSIE JavaScript Engine for .NET [![NuGet version](http://img.shields.io/nuget/v/ ![MSIE JS Engine Logo](http://i.imgur.com/T3K5q.png) This project is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). -Project was based on the code of [SassAndCoffee.JavaScript](http://github.com/paulcbetts/SassAndCoffee), [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) and [jsrt-dotnet](http://github.com/robpaveza/jsrt-dotnet). +Project was based on the code of [SassAndCoffee.JavaScript](https://github.com/anaisbetts/SassAndCoffee), [Chakra Sample Hosts](https://github.com/panopticoncentral/chakra-host) and [jsrt-dotnet](https://github.com/robpaveza/jsrt-dotnet). MSIE JavaScript Engine requires a installation of Internet Explorer or Edge Legacy on the machine and can work in 5 modes, that are defined in the JsEngineMode enumeration: @@ -23,7 +23,7 @@ The supported .NET types are as follows: * `System.String` ## Installation -This library can be installed through NuGet - [http://nuget.org/packages/MsieJavaScriptEngine](http://nuget.org/packages/MsieJavaScriptEngine). +This library can be installed through NuGet - [https://www.nuget.org/packages/MsieJavaScriptEngine](https://www.nuget.org/packages/MsieJavaScriptEngine). ## Usage Consider a simple example of usage of the MSIE JavaScript Engine: @@ -134,7 +134,7 @@ Consider in detail properties of the Boolean false - Flag for whether to use the JSON2 library + Flag for whether to use the JSON2 library @@ -147,21 +147,20 @@ See the [changelog](CHANGELOG.md). [Apache License Version 2.0](LICENSE.md) ## Credits - * [SassAndCoffee.JavaScript](http://github.com/xpaulbettsx/SassAndCoffee) - [License: Microsoft Public License (Ms-PL)](http://github.com/paulcbetts/SassAndCoffee/blob/master/COPYING) Part of the code of this library served as the basis for the ActiveScript version of Chakra and Classic JavaScript Engine. - * [Chakra Sample Hosts](http://github.com/panopticoncentral/chakra-host) - [License: Apache License 2.0 (Apache)](http://github.com/panopticoncentral/chakra-host/blob/master/LICENSE) C# example from this project served as the basis for the JsRT versions of Chakra. - * [jsrt-dotnet](http://github.com/robpaveza/jsrt-dotnet) - [License: The MIT License (MIT)](http://github.com/robpaveza/jsrt-dotnet/blob/master/LICENSE) Part of the code of this library is used in the JsRT versions of Chakra. - * [ECMAScript 5 Polyfill](http://nuget.org/packages/ES5) and [MDN JavaScript Polyfills](http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference) - Adds support for many of the new functions in ECMAScript 5 to downlevel browsers. - * [Cross-Browser Split](http://blog.stevenlevithan.com/archives/cross-browser-split) - Adds ECMAScript compliant and uniform cross-browser split method. - * [JSON2 library](http://github.com/douglascrockford/JSON-js) - Adds support of the JSON object from ECMAScript 5 to downlevel browsers. - * [Bundler and Minifier](http://github.com/madskristensen/BundlerMinifier) - [License: Apache License 2.0 (Apache)](http://github.com/madskristensen/BundlerMinifier/blob/master/LICENSE) JS-files, that used MSIE JS Engine, minificated by using this tool. + * [SassAndCoffee.JavaScript](https://github.com/anaisbetts/SassAndCoffee) - [License: Microsoft Public License (Ms-PL)](https://github.com/anaisbetts/SassAndCoffee/blob/master/COPYING) Part of the code of this library served as the basis for the ActiveScript version of Chakra and Classic JavaScript Engine. + * [Chakra Sample Hosts](https://github.com/panopticoncentral/chakra-host) - [License: Apache License 2.0 (Apache)](https://github.com/panopticoncentral/chakra-host/blob/master/LICENSE) C# example from this project served as the basis for the JsRT versions of Chakra. + * [jsrt-dotnet](https://github.com/robpaveza/jsrt-dotnet) - [License: The MIT License (MIT)](https://github.com/robpaveza/jsrt-dotnet/blob/master/LICENSE) Part of the code of this library is used in the JsRT versions of Chakra. + * [ECMAScript 5 Polyfill](https://www.nuget.org/packages/ES5) and [MDN JavaScript Polyfills](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference) - Adds support for many of the new functions in ECMAScript 5 to downlevel browsers. + * [Cross-Browser Split](https://blog.stevenlevithan.com/archives/cross-browser-split) - Adds ECMAScript compliant and uniform cross-browser split method. + * [JSON2 library](https://github.com/douglascrockford/JSON-js) - Adds support of the JSON object from ECMAScript 5 to downlevel browsers. + * [Bundler and Minifier](https://github.com/madskristensen/BundlerMinifier) - [License: Apache License 2.0 (Apache)](http://github.com/madskristensen/BundlerMinifier/blob/master/LICENSE) JS-files, that used MSIE JS Engine, minificated by using this tool. ## Who's Using MSIE JavaScript Engine If you use the MSIE JavaScript Engine in some project, please send me a message so I can include it in this list: - * [BitAdminCore.ALL](http://nuget.org/packages/BitAdminCore.ALL) - * [Chevron](http://github.com/SimonCropp/Chevron) by Simon Cropp - * [JavaScript Engine Switcher](http://github.com/Taritsyn/JavaScriptEngineSwitcher) by Andrey Taritsyn - * [PowerShell.JS](http://github.com/klumsy/powershellJS) by Karl Prosser - * [Serenity Application Platform](http://github.com/volkanceylan/Serenity) by Volkan Ceylan - * [SquishIt](http://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Ullrich - * [Strike](http://github.com/SimonCropp/Strike) by Simon Cropp \ No newline at end of file + * [BitAdminCore.ALL](https://www.nuget.org/packages/BitAdminCore.ALL) + * [Chevron](https://github.com/simoncropparchived/Chevron) by Simon Cropp + * [JavaScript Engine Switcher](https://github.com/Taritsyn/JavaScriptEngineSwitcher) by Andrey Taritsyn + * [PowerShell.JS](https://github.com/klumsy/powershellJS) by Karl Prosser + * [SquishIt](https://github.com/jetheredge/SquishIt) by Justin Etheredge and Alex Ullrich + * [Strike](https://github.com/simoncropparchived/Strike) by Simon Cropp \ No newline at end of file diff --git a/build/common.props b/build/common.props index d5c9126..96e62fb 100644 --- a/build/common.props +++ b/build/common.props @@ -1,5 +1,5 @@ - Copyright © 2012-2022 Andrey Taritsyn + Copyright © 2012-2023 Andrey Taritsyn \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index d9bd983..a11afff 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.9 + 3.1.0 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 @@ -13,7 +13,7 @@ true $(Product) Andrey Taritsyn - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (https://github.com/anaisbetts/SassAndCoffee), Chakra Sample Hosts (https://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (https://github.com/robpaveza/jsrt-dotnet). LICENSE.txt false https://github.com/Taritsyn/MsieJavaScriptEngine diff --git a/src/MsieJavaScriptEngine/Resources/ES5.js b/src/MsieJavaScriptEngine/Resources/ES5.js index 9ff4f4c..821c180 100644 --- a/src/MsieJavaScriptEngine/Resources/ES5.js +++ b/src/MsieJavaScriptEngine/Resources/ES5.js @@ -1,8 +1,8 @@ /*! * This polyfill based on code of the following libraries: -* 1. Douglas Crockford's ECMAScript 5 Polyfill v0.1 - http://nuget.org/packages/ES5 -* 2. MDN JavaScript Polyfills - http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference -* 3. Steven Levithan's Cross-Browser Split v1.1.1 - http://blog.stevenlevithan.com/archives/cross-browser-split +* 1. Douglas Crockford's ECMAScript 5 Polyfill v0.1 - https://www.nuget.org/packages/ES5 +* 2. MDN JavaScript Polyfills - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference +* 3. Steven Levithan's Cross-Browser Split v1.1.1 - https://blog.stevenlevithan.com/archives/cross-browser-split */ (function (undefined) { diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.ru-ru.Designer.cs deleted file mode 100644 index e69de29..0000000 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 7b59921..6827039 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.9 + README file for MSIE JavaScript Engine for .NET v3.1.0 -------------------------------------------------------------------------------- - Copyright (c) 2012-2022 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2023 Andrey Taritsyn - http://www.taritsyn.ru =========== @@ -14,9 +14,9 @@ This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of - SassAndCoffee.JavaScript (http://github.com/paulcbetts/SassAndCoffee), - Chakra Sample Hosts (http://github.com/panopticoncentral/chakra-host) and - jsrt-dotnet (http://github.com/robpaveza/jsrt-dotnet). + SassAndCoffee.JavaScript (https://github.com/anaisbetts/SassAndCoffee), + Chakra Sample Hosts (https://github.com/panopticoncentral/chakra-host) and + jsrt-dotnet (https://github.com/robpaveza/jsrt-dotnet). ============= RELEASE NOTES diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 86c8be2..c122933 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.9 + 3.1.0 net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 18f1911..ef7fdd3 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.9 + 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index c5f970f..8bd96f8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.9 + 3.1.0 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index f15fed9..b087cc1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.9 + 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index dea7979..a6090e4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.9 + 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d3a58ce..beaee3e 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.9 + 3.1.0 net40;net45 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 85710b4..1398b23 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.9 + 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library true From efb2c6c6460d5c2a981066940b5798f322559d49 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 12 Feb 2023 19:40:43 +0300 Subject: [PATCH 209/238] Reformatted a XML documentation comments again --- .../Debugging/DebugStackFrameDescriptor.cs | 6 ++++-- src/MsieJavaScriptEngine/IInnerJsEngine.cs | 10 ++++++---- src/MsieJavaScriptEngine/InnerJsEngineBase.cs | 15 ++++++++++++++ src/MsieJavaScriptEngine/JsEngineSettings.cs | 3 +-- .../JsRt/Edge/EdgeJsContext.cs | 20 +++++++++++++------ .../JsRt/Edge/EdgeJsPropertyId.cs | 2 -- .../JsRt/Edge/EdgeJsRuntime.cs | 2 +- .../JsRt/Ie/IeJsContext.cs | 20 +++++++++++++------ .../JsRt/Ie/IeJsPropertyId.cs | 2 -- .../JsRt/Ie/IeJsRuntime.cs | 2 +- src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs | 4 ++-- .../JsRt/JsRuntimeAttributes.cs | 2 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 10 ++++++---- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 2 +- src/MsieJavaScriptEngine/Utilities/Utils.cs | 2 +- 15 files changed, 67 insertions(+), 35 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs index 45d2e46..4823b28 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugStackFrameDescriptor.cs @@ -7,9 +7,11 @@ namespace MsieJavaScriptEngine.ActiveScript.Debugging /// /// Enumerates stack frames and merges output from several enumerators on the same thread /// - /// The process debug manager uses this structure to sort the stack frames from + /// + /// The process debug manager uses this structure to sort the stack frames from /// multiple script engines. By convention, stacks grow down. Consequently, on architectures - /// where stacks grow up, the addresses should be twos-complemented. + /// where stacks grow up, the addresses should be twos-complemented. + /// [StructLayout(LayoutKind.Sequential)] internal struct DebugStackFrameDescriptor { diff --git a/src/MsieJavaScriptEngine/IInnerJsEngine.cs b/src/MsieJavaScriptEngine/IInnerJsEngine.cs index 040dcb8..6198864 100644 --- a/src/MsieJavaScriptEngine/IInnerJsEngine.cs +++ b/src/MsieJavaScriptEngine/IInnerJsEngine.cs @@ -57,7 +57,7 @@ internal interface IInnerJsEngine : IDisposable object CallFunction(string functionName, params object[] args); /// - /// Сhecks for the existence of a variable + /// Checks for the existence of a variable /// /// Name of variable /// Result of check (true - exists; false - not exists @@ -86,20 +86,22 @@ internal interface IInnerJsEngine : IDisposable /// /// Embeds a host object to script code /// + /// + /// Allows to embed instances of simple classes (or structures) and delegates. + /// /// The name for the new global variable or function that will represent the object /// The object to expose - /// Allows to embed instances of simple classes (or structures) and delegates. void EmbedHostObject(string itemName, object value); /// /// Embeds a host type to script code /// - /// The name for the new global variable that will represent the type - /// The type to expose /// /// Host types are exposed to script code in the form of objects whose properties and /// methods are bound to the type's static members. /// + /// The name for the new global variable that will represent the type + /// The type to expose void EmbedHostType(string itemName, Type type); /// diff --git a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs index 2befbaf..e68123a 100644 --- a/src/MsieJavaScriptEngine/InnerJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/InnerJsEngineBase.cs @@ -39,38 +39,53 @@ protected InnerJsEngineBase(JsEngineSettings settings) #region IInnerJsEngine implementation + /// public string Mode { get { return _engineModeName; } } + /// public abstract bool SupportsScriptPrecompilation { get; } + /// public abstract PrecompiledScript Precompile(string code, string documentName); + /// public abstract object Evaluate(string expression, string documentName); + /// public abstract void Execute(string code, string documentName); + /// public abstract void Execute(PrecompiledScript precompiledScript); + /// public abstract object CallFunction(string functionName, params object[] args); + /// public abstract bool HasVariable(string variableName); + /// public abstract object GetVariableValue(string variableName); + /// public abstract void SetVariableValue(string variableName, object value); + /// public abstract void RemoveVariable(string variableName); + /// public abstract void EmbedHostObject(string itemName, object value); + /// public abstract void EmbedHostType(string itemName, Type type); + /// public abstract void Interrupt(); + /// public abstract void CollectGarbage(); #endregion diff --git a/src/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs index f4b2094..85c0e6f 100644 --- a/src/MsieJavaScriptEngine/JsEngineSettings.cs +++ b/src/MsieJavaScriptEngine/JsEngineSettings.cs @@ -50,9 +50,8 @@ public JsEngineMode EngineMode /// Gets or sets a maximum stack size in bytes /// /// - /// Set a 0 to use the default maximum stack size specified in the header + /// Set a 0 to use the default maximum stack size specified in the header /// for the executable. - /// /// public int MaxStackSize { diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs index ffde72d..43027ea 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsContext.cs @@ -164,9 +164,13 @@ public static EdgeJsValue ParseScript(string script, JsSourceContext sourceConte /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. + /// + /// Requires an active script context. + /// + /// + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. + /// /// /// The script to parse /// The serialized script @@ -208,9 +212,13 @@ public static EdgeJsValue RunScript(string script, JsSourceContext sourceContext /// Runs a serialized script /// /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. + /// + /// Requires an active script context. + /// + /// + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. + /// /// /// The source code of the serialized script /// The serialized script diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs index dcceaa9..3af5b25 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsPropertyId.cs @@ -29,9 +29,7 @@ public static EdgeJsPropertyId Invalid /// Gets a name associated with the property ID /// /// - /// /// Requires an active script context. - /// /// public string Name { diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs index 89d449e..e5f4b20 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsRuntime.cs @@ -15,7 +15,7 @@ namespace MsieJavaScriptEngine.JsRt.Edge /// time. /// /// - /// NOTE: A , unlike other objects in the Chakra hosting API, is not + /// NOTE: A , unlike other objects in the Chakra hosting API, is not /// garbage collected since it contains the garbage collected heap itself. A runtime will /// continue to exist until Dispose is called. /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs index 9c869bf..81dcb63 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsContext.cs @@ -167,9 +167,13 @@ public static IeJsValue ParseScript(string script, JsSourceContext sourceContext /// Parses a serialized script and returns a function representing the script /// /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. + /// + /// Requires an active script context. + /// + /// + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. + /// /// /// The script to parse /// The serialized script @@ -211,9 +215,13 @@ public static IeJsValue RunScript(string script, JsSourceContext sourceContext, /// Runs a serialized script /// /// - /// Requires an active script context. - /// The runtime will hold on to the buffer until all instances of any functions created from - /// the buffer are garbage collected. + /// + /// Requires an active script context. + /// + /// + /// The runtime will hold on to the buffer until all instances of any functions created from + /// the buffer are garbage collected. + /// /// /// The source code of the serialized script /// The serialized script diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs index 12721bc..906c656 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsPropertyId.cs @@ -29,9 +29,7 @@ public static IeJsPropertyId Invalid /// Gets a name associated with the property ID /// /// - /// /// Requires an active script context. - /// /// public string Name { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs index 6f183ca..33d518b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsRuntime.cs @@ -18,7 +18,7 @@ namespace MsieJavaScriptEngine.JsRt.Ie /// time. /// /// - /// NOTE: A , unlike other objects in the Chakra hosting API, is not + /// NOTE: A , unlike other objects in the Chakra hosting API, is not /// garbage collected since it contains the garbage collected heap itself. A runtime will /// continue to exist until Dispose is called. /// diff --git a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs index aa56c5c..b7ad833 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsErrorCode.cs @@ -77,7 +77,7 @@ public enum JsErrorCode : uint HeapEnumInProgress, /// - /// A hosting API that operates on Object values was called with a non-Object value + /// A hosting API that operates on object values was called with a non-object value /// ArgumentNotObject, @@ -150,7 +150,7 @@ public enum JsErrorCode : uint ScriptTerminated, /// - /// A script was terminated because it tried to use "eval" or "function" and eval was disabled + /// A script was terminated because it tried to use eval or Function and eval was disabled /// [SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "Eval is a valid function name.")] ScriptEvalDisabled, diff --git a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs index cd0fdfd..a4c3536 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsRuntimeAttributes.cs @@ -27,7 +27,7 @@ internal enum JsRuntimeAttributes AllowScriptInterrupt = 0x00000002, /// - /// Host will call Idle, so enable idle processing. Otherwise, the runtime will manage + /// Host will call Idle, so enable idle processing. Otherwise, the runtime will manage /// memory slightly more aggressively. /// EnableIdleProcessing = 0x00000004, diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index 93f21b9..e807c48 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -1044,7 +1044,7 @@ public T CallFunction(string functionName, params object[] args) } /// - /// Сhecks for the existence of a variable + /// Checks for the existence of a variable /// /// Name of variable /// Result of check (true - exists; false - not exists @@ -1276,9 +1276,11 @@ public void RemoveVariable(string variableName) /// /// Embeds a host object to script code /// + /// + /// Allows to embed instances of simple classes (or structures) and delegates. + /// /// The name for the new global variable or function that will represent the object /// The object to expose - /// Allows to embed instances of simple classes (or structures) and delegates. /// /// /// @@ -1336,12 +1338,12 @@ public void EmbedHostObject(string itemName, object value) /// /// Embeds a host type to script code /// - /// The name for the new global variable that will represent the type - /// The type to expose /// /// Host types are exposed to script code in the form of objects whose properties and /// methods are bound to the type's static members. /// + /// The name for the new global variable that will represent the type + /// The type to expose /// /// /// diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 4cdbdf2..d3ba763 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -150,7 +150,7 @@ private void ExecuteTask(ScriptTask task) /// /// Runs a specified delegate on the thread with modified stack size, - /// and returns its result as an . + /// and returns its result as an . /// Blocks until the invocation of delegate is completed. /// /// The type of the return value of the method, diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 7acb73a..0c6838a 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -31,7 +31,7 @@ public static bool Is64BitProcess() /// /// The case-sensitive resource name /// The assembly, which contains the embedded resource - /// Сontent of the embedded resource as string + /// Content of the embedded resource as string public static string GetResourceAsString(string resourceName, Assembly assembly) { if (resourceName == null) From a61ba63a5fff5858c2999f8813fbda96db4d66c5 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 12 Feb 2023 19:43:35 +0300 Subject: [PATCH 210/238] Fixed a minor flaws --- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- .../Resources/CommonStrings.Designer.cs | 10 +++++----- src/MsieJavaScriptEngine/Resources/CommonStrings.resx | 10 +++++----- .../CommonTestsBase.cs | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index a11afff..41e1e91 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -83,7 +83,7 @@
    - + diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 4d846c4..1154f28 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -410,7 +410,7 @@ internal static string Runtime_SuitableMethodOfHostObjectNotFound } /// - /// Looks up a localized string similar to "Сannot execute a '{0}' file, because it is empty." + /// Looks up a localized string similar to "Cannot execute a '{0}' file, because it is empty." /// internal static string Usage_CannotExecuteEmptyFile { @@ -418,7 +418,7 @@ internal static string Usage_CannotExecuteEmptyFile } /// - /// Looks up a localized string similar to "Сannot execute a '{0}' resource, because it is empty." + /// Looks up a localized string similar to "Cannot execute a '{0}' resource, because it is empty." /// internal static string Usage_CannotExecuteEmptyResource { @@ -426,7 +426,7 @@ internal static string Usage_CannotExecuteEmptyResource } /// - /// Looks up a localized string similar to "Сannot execute a pre-compiled script, because it was created for another mode with name `{0}`." + /// Looks up a localized string similar to "Cannot execute a pre-compiled script, because it was created for another mode with name `{0}`." /// internal static string Usage_CannotExecutePrecompiledScriptForAnotherJsEngineMode { @@ -434,7 +434,7 @@ internal static string Usage_CannotExecutePrecompiledScriptForAnotherJsEngineMod } /// - /// Looks up a localized string similar to "Сannot pre-compile a '{0}' file, because it is empty." + /// Looks up a localized string similar to "Cannot pre-compile a '{0}' file, because it is empty." /// internal static string Usage_CannotPrecompileEmptyFile { @@ -442,7 +442,7 @@ internal static string Usage_CannotPrecompileEmptyFile } /// - /// Looks up a localized string similar to "Сannot pre-compile a '{0}' resource, because it is empty." + /// Looks up a localized string similar to "Cannot pre-compile a '{0}' resource, because it is empty." /// internal static string Usage_CannotPrecompileEmptyResource { diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx index 6f41f9e..e950347 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.resx +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.resx @@ -250,19 +250,19 @@ Could not find suitable method or not enough arguments to invoke of '{0}' method of the host object. - Сannot execute a '{0}' file, because it is empty. + Cannot execute a '{0}' file, because it is empty. - Сannot execute a '{0}' resource, because it is empty. + Cannot execute a '{0}' resource, because it is empty. - Сannot execute a pre-compiled script, because it was created for another mode with name `{0}`. + Cannot execute a pre-compiled script, because it was created for another mode with name `{0}`. - Сannot pre-compile a '{0}' file, because it is empty. + Cannot pre-compile a '{0}' file, because it is empty. - Сannot pre-compile a '{0}' resource, because it is empty. + Cannot pre-compile a '{0}' resource, because it is empty. The embedded host object '{0}' has a type `{1}`, which is not supported. diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 666be5f..9559651 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -977,7 +977,7 @@ public virtual void RemovingVariableWithNameContainingUnicodeCharacters() public virtual void ScriptInterruption() { // Arrange - const string sleepyСode = @"function sleep(millisecondsTimeout) { + const string sleepyCode = @"function sleep(millisecondsTimeout) { var totalMilliseconds = new Date().getTime() + millisecondsTimeout; while (new Date() < totalMilliseconds) @@ -1008,7 +1008,7 @@ public virtual void ScriptInterruption() try { - jsEngine.Execute(sleepyСode); + jsEngine.Execute(sleepyCode); } catch (Exception e) { From 0deec16fc448fb10c753a47f19538050a71ab339 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 26 Feb 2023 15:37:52 +0300 Subject: [PATCH 211/238] In JavaScript engine settings was added one new property - `AllowReflection` (default `false`) --- build-js.cmd | 34 +++++ global.json | 2 +- src/MsieJavaScriptEngine/.uglifyjsrc | 11 ++ .../ActiveScript/ActiveScriptJsEngineBase.cs | 6 +- .../ActiveScript/HostItemBase.cs | 60 +++++++- .../ActiveScript/HostObject.cs | 7 +- .../ActiveScript/HostType.cs | 7 +- .../Helpers/ReflectionHelpers.cs | 82 ++++++++--- .../Helpers/TypeMappingHelpers.cs | 10 +- src/MsieJavaScriptEngine/JsEngineSettings.cs | 14 ++ .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- .../JsRt/Edge/EdgeTypeMapper.cs | 16 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- .../JsRt/Ie/IeTypeMapper.cs | 16 +- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 41 ++++++ .../MsieJavaScriptEngine.csproj | 10 +- src/MsieJavaScriptEngine/bundleconfig.json | 14 -- src/MsieJavaScriptEngine/package.json | 12 ++ src/MsieJavaScriptEngine/readme.txt | 5 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../InteropTests.cs | 40 +++++ .../MsieJavaScriptEngine.Test.Auto.csproj | 9 +- .../CommonTests.cs | 6 +- .../InteropTests.cs | 30 ++++ ...criptEngine.Test.ChakraActiveScript.csproj | 1 + .../CommonTests.cs | 6 +- .../InteropTests.cs | 25 ---- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 9 +- .../CommonTests.cs | 6 +- .../InteropTests.cs | 25 ---- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 9 +- .../CommonTests.cs | 6 +- .../InteropTests.cs | 113 +++++++++++++++ .../MsieJavaScriptEngine.Test.Classic.csproj | 1 + .../Interop/LoginFailedException.cs | 50 +++++++ .../InteropTestsBase.cs | 137 +++++++++++++++++- .../MsieJavaScriptEngine.Test.Common.csproj | 10 +- .../TestsBase.cs | 8 +- 38 files changed, 696 insertions(+), 148 deletions(-) create mode 100644 build-js.cmd create mode 100644 src/MsieJavaScriptEngine/.uglifyjsrc delete mode 100644 src/MsieJavaScriptEngine/bundleconfig.json create mode 100644 src/MsieJavaScriptEngine/package.json create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs diff --git a/build-js.cmd b/build-js.cmd new file mode 100644 index 0000000..1e607da --- /dev/null +++ b/build-js.cmd @@ -0,0 +1,34 @@ +@echo off +setlocal + +cd ./src/MsieJavaScriptEngine/ + +::-------------------------------------------------------------------------------- +:: Build +::-------------------------------------------------------------------------------- + +echo Installing Node.js packages ... +echo. +call npm install +if errorlevel 1 goto error +echo. + +echo Minifying JS files ... +echo. +call npm run -s minify-js +if errorlevel 1 goto error +echo. + +::-------------------------------------------------------------------------------- +:: Exit +::-------------------------------------------------------------------------------- + +echo Succeeded! +goto exit + +:error +echo *** Error: The previous step failed! + +:exit +cd ../../ +endlocal \ No newline at end of file diff --git a/global.json b/global.json index 9b92080..4347eeb 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.102" + "version": "7.0.200" } } diff --git a/src/MsieJavaScriptEngine/.uglifyjsrc b/src/MsieJavaScriptEngine/.uglifyjsrc new file mode 100644 index 0000000..8a91584 --- /dev/null +++ b/src/MsieJavaScriptEngine/.uglifyjsrc @@ -0,0 +1,11 @@ +{ + "compress": { + "hoist_funs": true, + "hoist_vars": true, + "passes": 2 + }, + "mangle": {}, + "output": { + "comments": "/^!/" + } +} diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 1b71fa8..eeabc4e 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -571,7 +571,7 @@ private void InnerCollectGarbage(ScriptGCType type) /// The mapped value private object MapToScriptType(object value) { - return TypeMappingHelpers.MapToScriptType(value, _settings.EngineMode); + return TypeMappingHelpers.MapToScriptType(value, _settings.EngineMode, _settings.AllowReflection); } /// @@ -581,7 +581,7 @@ private object MapToScriptType(object value) /// The mapped array private object[] MapToScriptType(object[] args) { - return TypeMappingHelpers.MapToScriptType(args, _settings.EngineMode); + return TypeMappingHelpers.MapToScriptType(args, _settings.EngineMode, _settings.AllowReflection); } /// @@ -900,7 +900,7 @@ public override void EmbedHostObject(string itemName, object value) public override void EmbedHostType(string itemName, Type type) { - var typeValue = new HostType(type, _settings.EngineMode); + var typeValue = new HostType(type, _settings.EngineMode, _settings.AllowReflection); _dispatcher.Invoke(() => { diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs index 5e9cbf7..7d0b945 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs @@ -27,6 +27,11 @@ internal abstract class HostItemBase : IReflect /// protected readonly JsEngineMode _engineMode; + /// + /// Flag for whether to allow the usage of reflection API in the script code + /// + protected readonly bool _allowReflection; + /// /// List of fields /// @@ -57,20 +62,26 @@ public object Target /// Target type /// Target object /// JS engine mode + /// Flag for whether to allow the usage of reflection API in the script code /// Flag for whether to allow access to members of the instance - protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool instance) + protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool allowReflection, bool instance) { _type = type; _target = target; + _allowReflection = allowReflection; _engineMode = engineMode; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); FieldInfo[] fields = _type.GetFields(defaultBindingFlags); PropertyInfo[] properties = _type.GetProperties(defaultBindingFlags); + if (properties.Length > 0 && !allowReflection) + { + properties = GetAvailableProperties(properties); + } MethodInfo[] methods = _type.GetMethods(defaultBindingFlags); - if (methods.Length > 0 && properties.Length > 0) + if (methods.Length > 0 && (properties.Length > 0 || !allowReflection)) { - methods = ReflectionHelpers.GetFullyFledgedMethods(methods); + methods = GetAvailableMethods(methods, allowReflection); } _fields = fields; @@ -79,6 +90,49 @@ protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool i } + private static PropertyInfo[] GetAvailableProperties(PropertyInfo[] properties) + { + int propertyCount = properties.Length; + var availableProperties = new PropertyInfo[propertyCount]; + int availablePropertyIndex = 0; + + for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) + { + PropertyInfo property = properties[propertyIndex]; + if (ReflectionHelpers.IsAllowedProperty(property)) + { + availableProperties[availablePropertyIndex] = property; + availablePropertyIndex++; + } + } + + Array.Resize(ref availableProperties, availablePropertyIndex); + + return availableProperties; + } + + private static MethodInfo[] GetAvailableMethods(MethodInfo[] methods, bool allowReflection) + { + int methodCount = methods.Length; + var availableMethods = new MethodInfo[methodCount]; + int availableMethodIndex = 0; + + for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) + { + MethodInfo method = methods[methodIndex]; + if (ReflectionHelpers.IsFullyFledgedMethod(method) + && (allowReflection || ReflectionHelpers.IsAllowedMethod(method))) + { + availableMethods[availableMethodIndex] = method; + availableMethodIndex++; + } + } + + Array.Resize(ref availableMethods, availableMethodIndex); + + return availableMethods; + } + private bool IsField(string name) { bool isField = false; diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs index fd91ba0..cb00656 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs @@ -25,8 +25,9 @@ internal sealed class HostObject : HostItemBase /// /// Target object /// JS engine mode - public HostObject(object target, JsEngineMode engineMode) - : base(target.GetType(), target, engineMode, true) + /// Flag for whether to allow the usage of reflection API in the script code + public HostObject(object target, JsEngineMode engineMode, bool allowReflection) + : base(target.GetType(), target, engineMode, allowReflection, true) { var del = _target as Delegate; if (del != null) @@ -88,7 +89,7 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr processedArgs, modifiers, culture, namedParameters); } - return TypeMappingHelpers.MapToScriptType(result, _engineMode); + return TypeMappingHelpers.MapToScriptType(result, _engineMode, _allowReflection); } #endregion diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostType.cs b/src/MsieJavaScriptEngine/ActiveScript/HostType.cs index 0071c0b..855d02d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostType.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostType.cs @@ -19,8 +19,9 @@ internal sealed class HostType : HostItemBase /// /// Target type /// JS engine mode - public HostType(Type type, JsEngineMode engineMode) - : base(type, null, engineMode, false) + /// Flag for whether to allow the usage of reflection API in the script code + public HostType(Type type, JsEngineMode engineMode, bool allowReflection) + : base(type, null, engineMode, allowReflection, false) { } @@ -51,7 +52,7 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr processedArgs, modifiers, culture, namedParameters); } - return TypeMappingHelpers.MapToScriptType(result, _engineMode); + return TypeMappingHelpers.MapToScriptType(result, _engineMode, _allowReflection); } #endregion diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 0f37cf5..304edc0 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -12,6 +12,19 @@ namespace MsieJavaScriptEngine.Helpers /// internal static class ReflectionHelpers { + private static readonly PropertyInfo[] _disallowedProperties = + { + typeof(Delegate).GetProperty("Method"), + typeof(Exception).GetProperty("TargetSite") + }; + + private static readonly MethodInfo[] _disallowedMethods = + { + typeof(object).GetMethod("GetType"), + typeof(Exception).GetMethod("GetType") + }; + + public static BindingFlags GetDefaultBindingFlags(bool instance) { BindingFlags bindingFlags = BindingFlags.Public; @@ -27,6 +40,20 @@ public static BindingFlags GetDefaultBindingFlags(bool instance) return bindingFlags; } + public static bool IsAllowedProperty(PropertyInfo property) + { + bool isAllowed = !_disallowedProperties.Contains(property, MemberComparer.Instance); + + return isAllowed; + } + + public static bool IsAllowedMethod(MethodInfo method) + { + bool isAllowed = !_disallowedMethods.Contains(method, MemberComparer.Instance); + + return isAllowed; + } + public static bool IsFullyFledgedMethod(MethodInfo method) { if (!method.Attributes.HasFlag(MethodAttributes.SpecialName)) @@ -40,29 +67,6 @@ public static bool IsFullyFledgedMethod(MethodInfo method) return isFullyFledged; } -#if NETFRAMEWORK - - public static MethodInfo[] GetFullyFledgedMethods(MethodInfo[] methods) - { - int methodCount = methods.Length; - var fullyFledgedMethods = new MethodInfo[methodCount]; - int fullyFledgedMethodIndex = 0; - - for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) - { - MethodInfo method = methods[methodIndex]; - if (IsFullyFledgedMethod(method)) - { - fullyFledgedMethods[fullyFledgedMethodIndex] = method; - fullyFledgedMethodIndex++; - } - } - - Array.Resize(ref fullyFledgedMethods, fullyFledgedMethodIndex); - - return fullyFledgedMethods; - } -#endif public static void FixFieldValueType(ref object value, FieldInfo field) { @@ -244,6 +248,38 @@ private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, T } + private sealed class MemberComparer : EqualityComparer + where T : MemberInfo + { + public static MemberComparer Instance { get; } = new MemberComparer(); + + + private MemberComparer() + { } + + + #region MemberComparer overrides + + public override bool Equals(T x, T y) + { + return x.Module == y.Module +#if !NETSTANDARD1_3 + && x.MetadataToken == y.MetadataToken +#else + && x.DeclaringType == y.DeclaringType + && x.Name == y.Name +#endif + ; + } + + public override int GetHashCode(T obj) + { + return obj != null ? obj.GetHashCode() : 0; + } + + #endregion + } + private sealed class MethodWithMetadata { public MethodBase Method diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index 424f45a..843ef9c 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -17,8 +17,9 @@ internal static class TypeMappingHelpers /// /// The source value /// JavaScript engine mode + /// Flag for whether to allow the usage of reflection API in the script code /// The mapped value - public static object MapToScriptType(object value, JsEngineMode engineMode) + public static object MapToScriptType(object value, JsEngineMode engineMode, bool allowReflection) { if (value == null) { @@ -36,7 +37,7 @@ public static object MapToScriptType(object value, JsEngineMode engineMode) return value; } - var result = new HostObject(value, engineMode); + var result = new HostObject(value, engineMode, allowReflection); return result; } @@ -46,10 +47,11 @@ public static object MapToScriptType(object value, JsEngineMode engineMode) /// /// The source array /// JavaScript engine mode + /// Flag for whether to allow the usage of reflection API in the script code /// The mapped array - public static object[] MapToScriptType(object[] args, JsEngineMode engineMode) + public static object[] MapToScriptType(object[] args, JsEngineMode engineMode, bool allowReflection) { - return args.Select(arg => MapToScriptType(arg, engineMode)).ToArray(); + return args.Select(arg => MapToScriptType(arg, engineMode, allowReflection)).ToArray(); } /// diff --git a/src/MsieJavaScriptEngine/JsEngineSettings.cs b/src/MsieJavaScriptEngine/JsEngineSettings.cs index 85c0e6f..ff92ee5 100644 --- a/src/MsieJavaScriptEngine/JsEngineSettings.cs +++ b/src/MsieJavaScriptEngine/JsEngineSettings.cs @@ -27,6 +27,19 @@ public sealed class JsEngineSettings private int _maxStackSize; #endif + /// + /// Gets or sets a flag for whether to allow the usage of reflection API in the script code + /// + /// + /// This affects , Exception.GetType, + /// Exception.TargetSite and Delegate.Method. + /// + public bool AllowReflection + { + get; + set; + } + /// /// Gets or sets a flag for whether to enable script debugging features /// @@ -95,6 +108,7 @@ public bool UseJson2Library /// public JsEngineSettings() { + AllowReflection = false; EnableDebugging = false; EngineMode = JsEngineMode.Auto; #if !NETSTANDARD1_3 diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index d7271ac..7ed6c07 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -61,7 +61,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraEdgeJsRtJsEngine(JsEngineSettings settings) : base(settings) { - _typeMapper = new EdgeTypeMapper(); + _typeMapper = new EdgeTypeMapper(settings.AllowReflection); try { diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 37ca65b..eabfe7a 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -26,7 +26,9 @@ internal sealed class EdgeTypeMapper : TypeMapper /// Constructs an instance of the “Edge” type mapper /// - public EdgeTypeMapper() + /// Flag for whether to allow the usage of reflection API in the script code + public EdgeTypeMapper(bool allowReflection) + : base(allowReflection) { } @@ -437,6 +439,11 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) foreach (PropertyInfo property in properties) { + if (!IsAvailableProperty(property)) + { + continue; + } + string propertyName = property.Name; EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); @@ -565,11 +572,10 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - IEnumerable methods = type.GetMethods(defaultBindingFlags) - .Where(ReflectionHelpers.IsFullyFledgedMethod); - IEnumerable> methodGroups = methods.GroupBy(m => m.Name); + MethodInfo[] methods = type.GetMethods(defaultBindingFlags); + IEnumerable> availableMethodGroups = GetAvailableMethodGroups(methods); - foreach (IGrouping methodGroup in methodGroups) + foreach (IGrouping methodGroup in availableMethodGroups) { string methodName = methodGroup.Key; MethodInfo[] methodCandidates = methodGroup.ToArray(); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 11fddd7..c405866 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -69,7 +69,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase public ChakraIeJsRtJsEngine(JsEngineSettings settings) : base(settings) { - _typeMapper = new IeTypeMapper(); + _typeMapper = new IeTypeMapper(settings.AllowReflection); try { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index 5d50d7c..a3e4944 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -26,7 +26,9 @@ internal sealed class IeTypeMapper : TypeMapper /// /// Constructs an instance of the “IE” type mapper /// - public IeTypeMapper() + /// Flag for whether to allow the usage of reflection API in the script code + public IeTypeMapper(bool allowReflection) + : base(allowReflection) { } @@ -437,6 +439,11 @@ private void ProjectProperties(IeEmbeddedItem externalItem) foreach (PropertyInfo property in properties) { + if (!IsAvailableProperty(property)) + { + continue; + } + string propertyName = property.Name; IeJsValue descriptorValue = IeJsValue.CreateObject(); @@ -565,11 +572,10 @@ private void ProjectMethods(IeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); - IEnumerable methods = type.GetMethods(defaultBindingFlags) - .Where(ReflectionHelpers.IsFullyFledgedMethod); - IEnumerable> methodGroups = methods.GroupBy(m => m.Name); + MethodInfo[] methods = type.GetMethods(defaultBindingFlags); + IEnumerable> availableMethodGroups = GetAvailableMethodGroups(methods); - foreach (IGrouping methodGroup in methodGroups) + foreach (IGrouping methodGroup in availableMethodGroups) { string methodName = methodGroup.Key; MethodInfo[] methodCandidates = methodGroup.ToArray(); diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index a4a50f6..8615e09 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Concurrent; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; +using MsieJavaScriptEngine.Helpers; using MsieJavaScriptEngine.JsRt.Embedding; using MsieJavaScriptEngine.Utilities; @@ -23,6 +25,11 @@ internal abstract class TypeMapper : IDisposable /// protected const string ExternalObjectPropertyName = "_MsieJavaScriptEngine_externalObject"; + /// + /// Flag for whether to allow the usage of reflection API in the script code + /// + protected readonly bool _allowReflection; + /// /// Storage for lazy-initialized embedded objects /// @@ -69,6 +76,16 @@ internal abstract class TypeMapper : IDisposable private InterlockedStatedFlag _disposedFlag = new InterlockedStatedFlag(); + /// + /// Constructs an instance of the type mapper + /// + /// Flag for whether to allow the usage of reflection API in the script code + protected TypeMapper(bool allowReflection) + { + _allowReflection = allowReflection; + } + + /// /// Creates a JavaScript value from an host object if the it does not already exist /// @@ -200,6 +217,30 @@ private void EmbeddedTypeFinalizeCallback(IntPtr ptr) embeddedTypeHandle.Free(); } + protected bool IsAvailableProperty(PropertyInfo property) + { + if (_allowReflection) + { + return true; + } + + bool isAvailable = ReflectionHelpers.IsAllowedProperty(property); + + return isAvailable; + } + + protected IEnumerable> GetAvailableMethodGroups(MethodInfo[] methods) + { + IEnumerable availableMethods = methods.Where(ReflectionHelpers.IsFullyFledgedMethod); + if (!_allowReflection) + { + availableMethods = availableMethods.Where(ReflectionHelpers.IsAllowedMethod); + } + IEnumerable> availableMethodGroups = availableMethods.GroupBy(m => m.Name); + + return availableMethodGroups; + } + protected object[] GetHostItemMemberArguments(TValue[] args, int maxArgCount = -1) { if (args == null) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 41e1e91..72acc70 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,8 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types; -2. JSON2 library was updated to version of October 30, 2022. + In JavaScript engine settings was added one new property - `AllowReflection` (default `false`). en-US ../../nuget true @@ -40,7 +39,6 @@ - @@ -87,4 +85,10 @@ + + + + \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/bundleconfig.json b/src/MsieJavaScriptEngine/bundleconfig.json deleted file mode 100644 index 9153a95..0000000 --- a/src/MsieJavaScriptEngine/bundleconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "outputFileName": "Resources/ES5.min.js", - "inputFiles": [ - "Resources/ES5.js" - ] - }, - { - "outputFileName": "Resources/json2.min.js", - "inputFiles": [ - "Resources/json2.js" - ] - } -] diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json new file mode 100644 index 0000000..381dbb5 --- /dev/null +++ b/src/MsieJavaScriptEngine/package.json @@ -0,0 +1,12 @@ +{ + "name": "MsieJavaScriptEngine", + "version": "3.1.0", + "devDependencies": { + "uglify-js": "3.16.1" + }, + "scripts": { + "minify-es5-js": "uglifyjs ./Resources/ES5.js --output ./Resources/ES5.min.js --config-file ./.uglifyjsrc", + "minify-json2-js": "uglifyjs ./Resources/json2.js --output ./Resources/json2.min.js --config-file ./.uglifyjsrc", + "minify-js": "npm run -s minify-es5-js && npm run -s minify-json2-js" + } +} diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 6827039..319849c 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,9 +21,8 @@ ============= RELEASE NOTES ============= - 1. In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are - no longer used for embedding objects and types; - 2. JSON2 library was updated to version of October 30, 2022. + In JavaScript engine settings was added one new property - `AllowReflection` + (default `false`). ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index c122933..674cebb 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -21,7 +21,7 @@
    - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs index c6e4def..3034802 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Auto/InteropTests.cs @@ -8,5 +8,45 @@ namespace MsieJavaScriptEngine.Test.Auto public class InteropTests : InteropTestsBase { protected override JsEngineMode EngineMode => JsEngineMode.Auto; + + + #region Embedding of objects + + #region Objects with methods + + public override void EmbeddingOfInstanceOfCustomValueTypeAndCallingOfItsGetTypeMethod() + { } + + public override void EmbeddingOfInstanceOfCustomReferenceTypeAndCallingOfItsGetTypeMethod() + { } + + #endregion + + #region Delegates + + public override void EmbeddingOfInstanceOfDelegateAndCheckingItsPrototype() + { } + + public override void EmbeddingOfInstanceOfDelegateAndGettingItsMethodProperty() + { } + + #endregion + + #endregion + + + #region Embedding of types + + #region Creating of instances + + public override void CreatingAnInstanceOfEmbeddedBuiltinExceptionAndGettingItsTargetSiteProperty() + { } + + public override void CreatingAnInstanceOfEmbeddedCustomExceptionAndCallingOfItsGetTypeMethod() + { } + + #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index ef7fdd3..7748d17 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library + latest true true false @@ -14,9 +15,15 @@ + + + + + - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs index a3d4893..b33e52e 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/CommonTests.cs @@ -65,7 +65,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -186,7 +186,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -300,7 +300,7 @@ public void GenerationOfCompilationErrorMessageInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs index d6c6443..432f127 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; +using MsieJavaScriptEngine.Test.Common.Interop.Animals; namespace MsieJavaScriptEngine.Test.ChakraActiveScript { @@ -15,6 +16,35 @@ public class InteropTests : InteropTestsBase #region Embedding of objects + #region Delegates + + [Test] + public override void EmbeddingOfInstanceOfDelegateAndCheckingItsPrototype() + { } + + [Test] + public override void EmbeddingOfInstanceOfDelegateAndGettingItsMethodProperty() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var cat = new Cat(); + var cryFunc = new Func(cat.Cry); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("cry", cryFunc); + return jsEngine.Evaluate("cry.Method;"); + } + } + + // Act and Assert + Assert.AreEqual("System.String Cry()", TestAllowReflectionSetting(true)); + Assert.AreEqual("undefined", TestAllowReflectionSetting(false)); + } + + #endregion + #region Recursive calls #region Mapping of errors diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 8bd96f8..3ba8b43 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45 Library + latest true true false diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs index 8549729..09acc27 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/CommonTests.cs @@ -66,7 +66,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -187,7 +187,7 @@ public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -305,7 +305,7 @@ public void GenerationOfCompilationErrorMessageInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index 65bca83..14eefa0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -15,31 +15,6 @@ public class InteropTests : InteropTestsBase #region Embedding of objects - #region Delegates - - [Test] - public void EmbeddedInstanceOfDelegateHasFunctionPrototype() - { - // Arrange - var someFunc = new Func(() => 42); - - const string input = "Object.getPrototypeOf(embeddedFunc) === Function.prototype"; - - // Act - bool output; - - using (var jsEngine = CreateJsEngine()) - { - jsEngine.EmbedHostObject("embeddedFunc", someFunc); - output = jsEngine.Evaluate(input); - } - - // Assert - Assert.True(output); - } - - #endregion - #region Recursive calls #region Mapping of errors diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index b087cc1..07c196f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library + latest true true false @@ -14,9 +15,15 @@ + + + + + - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs index 2c34764..9983e4a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/CommonTests.cs @@ -65,7 +65,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -186,7 +186,7 @@ public virtual void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -304,7 +304,7 @@ public void GenerationOfCompilationErrorMessageInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index 3d06904..15ee2c5 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -15,31 +15,6 @@ public class InteropTests : InteropTestsBase #region Embedding of objects - #region Delegates - - [Test] - public void EmbeddedInstanceOfDelegateHasFunctionPrototype() - { - // Arrange - var someFunc = new Func(() => 42); - - const string input = "Object.getPrototypeOf(embeddedFunc) === Function.prototype"; - - // Act - bool output; - - using (var jsEngine = CreateJsEngine()) - { - jsEngine.EmbedHostObject("embeddedFunc", someFunc); - output = jsEngine.Evaluate(input); - } - - // Assert - Assert.True(output); - } - - #endregion - #region Recursive calls #region Mapping of errors diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index a6090e4..d849933 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library + latest true true false @@ -14,9 +15,15 @@ + + + + + - + + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs index 43b314c..45a5ac3 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/CommonTests.cs @@ -65,7 +65,7 @@ public void MappingCompilationErrorDuringEvaluationOfExpressionInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -186,7 +186,7 @@ public void MappingCompilationErrorDuringExecutionOfCodeInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { @@ -300,7 +300,7 @@ public void GenerationOfCompilationErrorMessageInDebugMode() JsCompilationException exception = null; // Act - using (var jsEngine = CreateJsEngine(true)) + using (var jsEngine = CreateJsEngine(enableDebugging: true)) { try { diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs index 41d91a0..48763b5 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -4,6 +4,8 @@ using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; +using MsieJavaScriptEngine.Test.Common.Interop; +using MsieJavaScriptEngine.Test.Common.Interop.Animals; namespace MsieJavaScriptEngine.Test.Classic { @@ -15,6 +17,85 @@ public class InteropTests : InteropTestsBase #region Embedding of objects + #region Objects with methods + + [Test] + public override void EmbeddingOfInstanceOfCustomValueTypeAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var date = new Date(); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("date", date); + return jsEngine.Evaluate("date.GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(Date).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support this property or method", exception.Description); + } + + [Test] + public override void EmbeddingOfInstanceOfCustomReferenceTypeAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var cat = new Cat(); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("cat", cat); + return jsEngine.Evaluate("cat.GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(Cat).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support this property or method", exception.Description); + } + + #endregion + + #region Delegates + + [Test] + public override void EmbeddingOfInstanceOfDelegateAndCheckingItsPrototype() + { } + + [Test] + public override void EmbeddingOfInstanceOfDelegateAndGettingItsMethodProperty() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var cat = new Cat(); + var cryFunc = new Func(cat.Cry); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("cry", cryFunc); + return jsEngine.Evaluate("cry.Method;"); + } + } + + // Act and Assert + Assert.AreEqual("System.String Cry()", TestAllowReflectionSetting(true)); + Assert.AreEqual("undefined", TestAllowReflectionSetting(false)); + } + + #endregion + #region Recursive calls #region Mapping of errors @@ -67,5 +148,37 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFiles() #endregion #endregion + + + #region Embedding of types + + #region Creating of instances + + [Test] + public override void CreatingAnInstanceOfEmbeddedCustomExceptionAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + Type loginFailedExceptionType = typeof(LoginFailedException); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostType("LoginFailedError", loginFailedExceptionType); + return jsEngine.Evaluate("new LoginFailedError(\"Wrong password entered!\").GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(LoginFailedException).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support this property or method", exception.Description); + } + + #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index beaee3e..d8d21a3 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45 Library + latest true true false diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs new file mode 100644 index 0000000..72e6b20 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs @@ -0,0 +1,50 @@ +using System; +using System.Runtime.Serialization; + +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + [Serializable] + public class LoginFailedException : Exception + { + private string _userName; + + public string UserName + { + get { return _userName; } + set { _userName = value; } + } + + + public LoginFailedException() + { } + + public LoginFailedException(string message) + : base(message) + { } + + public LoginFailedException(string message, Exception innerException) + : base(message, innerException) + { } + + protected LoginFailedException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + if (info != null) + { + _userName = info.GetString("UserName"); + } + } + + + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + if (info == null) + { + throw new ArgumentNullException(nameof(info)); + } + + base.GetObjectData(info, context); + info.AddValue("UserName", this._userName); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 9bd2684..53274a2 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -432,7 +432,7 @@ public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithMethod() } [Test] - public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameter() + public virtual void EmbeddingOfInstancesOfCustomReferenceTypesAndCallingOfMethodOfWithInterfaceParameter() { // Arrange var animalTrainer = new AnimalTrainer(); @@ -463,6 +463,52 @@ public virtual void CallingOfMethodOfCustomReferenceTypeWithInterfaceParameter() Assert.AreEqual(targetOutput2, output2); } + [Test] + public virtual void EmbeddingOfInstanceOfCustomValueTypeAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var date = new Date(); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("date", date); + return jsEngine.Evaluate("date.GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(Date).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support property or method 'GetType'", exception.Description); + } + + [Test] + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var cat = new Cat(); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("cat", cat); + return jsEngine.Evaluate("cat.GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(Cat).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support property or method 'GetType'", exception.Description); + } + #endregion #region Delegates @@ -597,7 +643,28 @@ public virtual void EmbeddingOfInstanceOfDelegateWithoutResult() } [Test] - public virtual void CallingOfEmbeddedDelegateWithMissingParameter() + public virtual void EmbeddingOfInstanceOfDelegateAndCheckingItsPrototype() + { + // Arrange + var someFunc = new Func(() => 42); + + const string input = "Object.getPrototypeOf(embeddedFunc) === Function.prototype"; + + // Act + bool output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("embeddedFunc", someFunc); + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.True(output); + } + + [Test] + public virtual void EmbeddingOfInstanceOfDelegateAndCallingItWithMissingParameter() { // Arrange var sumFunc = new Func((a, b) => a + b); @@ -625,7 +692,7 @@ public virtual void CallingOfEmbeddedDelegateWithMissingParameter() } [Test] - public virtual void CallingOfEmbeddedDelegateWithExtraParameter() + public virtual void EmbeddingOfInstanceOfDelegateAndCallingItWithExtraParameter() { // Arrange var sumFunc = new Func((a, b) => a + b); @@ -646,6 +713,27 @@ public virtual void CallingOfEmbeddedDelegateWithExtraParameter() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void EmbeddingOfInstanceOfDelegateAndGettingItsMethodProperty() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + var cat = new Cat(); + var cryFunc = new Func(cat.Cry); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostObject("cry", cryFunc); + return jsEngine.Evaluate("cry.Method;"); + } + } + + // Act and Assert + Assert.AreEqual("undefined", TestAllowReflectionSetting(true)); + Assert.AreEqual("undefined", TestAllowReflectionSetting(false)); + } + #endregion #region Integration @@ -888,6 +976,49 @@ public virtual void CreatingAnInstanceOfEmbeddedCustomReferenceType() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void CreatingAnInstanceOfEmbeddedBuiltinExceptionAndGettingItsTargetSiteProperty() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + Type invalidOperationExceptionType = typeof(InvalidOperationException); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostType("InvalidOperationError", invalidOperationExceptionType); + return jsEngine.Evaluate("new InvalidOperationError(\"A terrible thing happened!\").TargetSite;"); + } + } + + // Act and Assert + Assert.AreEqual(null, TestAllowReflectionSetting(true)); + Assert.AreEqual("undefined", TestAllowReflectionSetting(false)); + } + + [Test] + public virtual void CreatingAnInstanceOfEmbeddedCustomExceptionAndCallingOfItsGetTypeMethod() + { + // Arrange + string TestAllowReflectionSetting(bool allowReflection) + { + Type loginFailedExceptionType = typeof(LoginFailedException); + + using (var jsEngine = CreateJsEngine(allowReflection: allowReflection)) + { + jsEngine.EmbedHostType("LoginFailedError", loginFailedExceptionType); + return jsEngine.Evaluate("new LoginFailedError(\"Wrong password entered!\").GetType();"); + } + } + + // Act and Assert + Assert.AreEqual(typeof(LoginFailedException).FullName, TestAllowReflectionSetting(true)); + + var exception = Assert.Throws(() => TestAllowReflectionSetting(false)); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("Object doesn't support property or method 'GetType'", exception.Description); + } + #endregion #region Types with constants diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 1398b23..c32328a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -5,6 +5,7 @@ 3.1.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library + latest true true false @@ -15,12 +16,19 @@ - + + + + + + + + diff --git a/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs index 81c99f7..6854dfb 100644 --- a/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/TestsBase.cs @@ -18,15 +18,11 @@ public abstract class TestsBase protected virtual bool UseJson2Library => false; - protected MsieJsEngine CreateJsEngine() - { - return CreateJsEngine(false); - } - - protected MsieJsEngine CreateJsEngine(bool enableDebugging) + protected MsieJsEngine CreateJsEngine(bool allowReflection = false, bool enableDebugging = false) { var jsEngine = new MsieJsEngine(new JsEngineSettings { + AllowReflection = allowReflection, EnableDebugging = enableDebugging, EngineMode = EngineMode, UseEcmaScript5Polyfill = UseEcmaScript5Polyfill, From 4856631f01ab84091ccbabc33d14734812129324 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 26 Feb 2023 20:12:21 +0300 Subject: [PATCH 212/238] Version 3.2.0 --- CHANGELOG.md | 3 ++ Licenses/bundler-and-minifier-license.txt | 13 --------- Licenses/uglify-js-license.txt | 29 +++++++++++++++++++ README.md | 11 ++++++- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 +-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- ...criptEngine.Test.ChakraActiveScript.csproj | 2 +- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 14 files changed, 53 insertions(+), 25 deletions(-) delete mode 100644 Licenses/bundler-and-minifier-license.txt create mode 100644 Licenses/uglify-js-license.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c11bf7..1c3d8da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.0 - February 26, 2023 + * In JavaScript engine settings was added one new property - `AllowReflection` (default `false`) + ## v3.1.0 - February 6, 2023 * In JsRT modes, `JsVariantToValue` and `JsValueToVariant` native methods are no longer used for embedding objects and types * JSON2 library was updated to version of October 30, 2022 diff --git a/Licenses/bundler-and-minifier-license.txt b/Licenses/bundler-and-minifier-license.txt deleted file mode 100644 index 3115a6d..0000000 --- a/Licenses/bundler-and-minifier-license.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2015-2020 Mads Kristensen - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file diff --git a/Licenses/uglify-js-license.txt b/Licenses/uglify-js-license.txt new file mode 100644 index 0000000..87a0854 --- /dev/null +++ b/Licenses/uglify-js-license.txt @@ -0,0 +1,29 @@ +UglifyJS is released under the BSD license: + +Copyright 2012-2019 (c) Mihai Bazon + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. \ No newline at end of file diff --git a/README.md b/README.md index c152ac5..ddbfcdc 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,15 @@ Consider in detail properties of the + AllowReflection + Boolean + false + +

    Flag for whether to allow the usage of reflection API in the script code.

    +

    This affects Object.GetType, Exception.GetType, Exception.TargetSite and Delegate.Method.

    + + EnableDebugging Boolean @@ -153,7 +162,7 @@ See the [changelog](CHANGELOG.md). * [ECMAScript 5 Polyfill](https://www.nuget.org/packages/ES5) and [MDN JavaScript Polyfills](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference) - Adds support for many of the new functions in ECMAScript 5 to downlevel browsers. * [Cross-Browser Split](https://blog.stevenlevithan.com/archives/cross-browser-split) - Adds ECMAScript compliant and uniform cross-browser split method. * [JSON2 library](https://github.com/douglascrockford/JSON-js) - Adds support of the JSON object from ECMAScript 5 to downlevel browsers. - * [Bundler and Minifier](https://github.com/madskristensen/BundlerMinifier) - [License: Apache License 2.0 (Apache)](http://github.com/madskristensen/BundlerMinifier/blob/master/LICENSE) JS-files, that used MSIE JS Engine, minificated by using this tool. + * [UglifyJS](https://github.com/mishoo/UglifyJS) - [License: BSD License (BSD)](https://github.com/mishoo/UglifyJS/blob/master/LICENSE) JS-files, that used MSIE JS Engine, minificated by using this tool. ## Who's Using MSIE JavaScript Engine If you use the MSIE JavaScript Engine in some project, please send me a message so I can include it in this list: diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 72acc70..68a40e4 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.1.0 + 3.2.0 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index 381dbb5..3810707 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.1.0", + "version": "3.2.0", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 319849c..b22abec 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.1.0 + README file for MSIE JavaScript Engine for .NET v3.2.0 -------------------------------------------------------------------------------- @@ -27,4 +27,4 @@ ============ PROJECT SITE ============ - http://github.com/Taritsyn/MsieJavaScriptEngine \ No newline at end of file + https://github.com/Taritsyn/MsieJavaScriptEngine \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 674cebb..cdc78e3 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.1.0 + 3.2.0 net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 7748d17..a3b6049 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.1.0 + 3.2.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 3ba8b43..f7765fc 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.1.0 + 3.2.0 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 07c196f..142818d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.1.0 + 3.2.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index d849933..ce18c31 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.1.0 + 3.2.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index d8d21a3..61e1770 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.1.0 + 3.2.0 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index c32328a..b1ea524 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.1.0 + 3.2.0 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest From 96ab036cf21c7ee1343770ee1142b92c40f95604 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 27 Feb 2023 20:02:08 +0300 Subject: [PATCH 213/238] In JsRT modes improved a performance of .NET methods projection --- .../JsRt/Edge/EdgeTypeMapper.cs | 6 ++-- .../JsRt/Ie/IeTypeMapper.cs | 6 ++-- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 33 ++++++++++++++++--- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 +- 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index eabfe7a..4cae2b4 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -573,12 +573,12 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); MethodInfo[] methods = type.GetMethods(defaultBindingFlags); - IEnumerable> availableMethodGroups = GetAvailableMethodGroups(methods); + Dictionary> availableMethodGroups = GetAvailableMethodGroups(methods); - foreach (IGrouping methodGroup in availableMethodGroups) + foreach (KeyValuePair> methodGroup in availableMethodGroups) { string methodName = methodGroup.Key; - MethodInfo[] methodCandidates = methodGroup.ToArray(); + MethodInfo[] methodCandidates = methodGroup.Value.ToArray(); EdgeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index a3e4944..004c7e9 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -573,12 +573,12 @@ private void ProjectMethods(IeEmbeddedItem externalItem) string typeName = type.FullName; BindingFlags defaultBindingFlags = ReflectionHelpers.GetDefaultBindingFlags(instance); MethodInfo[] methods = type.GetMethods(defaultBindingFlags); - IEnumerable> availableMethodGroups = GetAvailableMethodGroups(methods); + Dictionary> availableMethodGroups = GetAvailableMethodGroups(methods); - foreach (IGrouping methodGroup in availableMethodGroups) + foreach (KeyValuePair> methodGroup in availableMethodGroups) { string methodName = methodGroup.Key; - MethodInfo[] methodCandidates = methodGroup.ToArray(); + MethodInfo[] methodCandidates = methodGroup.Value.ToArray(); IeJsNativeFunction nativeFunction = (callee, isConstructCall, args, argCount, callbackData) => { diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 8615e09..de3fd5a 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -229,14 +229,37 @@ protected bool IsAvailableProperty(PropertyInfo property) return isAvailable; } - protected IEnumerable> GetAvailableMethodGroups(MethodInfo[] methods) + protected Dictionary> GetAvailableMethodGroups(MethodInfo[] methods) { - IEnumerable availableMethods = methods.Where(ReflectionHelpers.IsFullyFledgedMethod); - if (!_allowReflection) + int methodCount = methods.Length; + if (methodCount == 0) { - availableMethods = availableMethods.Where(ReflectionHelpers.IsAllowedMethod); + return new Dictionary>(); + } + + var availableMethodGroups = new Dictionary>(methodCount); + + foreach (MethodInfo method in methods) + { + if (!ReflectionHelpers.IsFullyFledgedMethod(method) + || (!_allowReflection && !ReflectionHelpers.IsAllowedMethod(method))) + { + continue; + } + + string methodName = method.Name; + List methodGroup; + + if (availableMethodGroups.TryGetValue(methodName, out methodGroup)) + { + methodGroup.Add(method); + } + else + { + methodGroup = new List { method }; + availableMethodGroups.Add(methodName, methodGroup); + } } - IEnumerable> availableMethodGroups = availableMethods.GroupBy(m => m.Name); return availableMethodGroups; } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 68a40e4..7a37a41 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In JavaScript engine settings was added one new property - `AllowReflection` (default `false`). + In JsRT modes improved a performance of .NET methods projection. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index b22abec..4d4626a 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - In JavaScript engine settings was added one new property - `AllowReflection` - (default `false`). + In JsRT modes improved a performance of .NET methods projection. ============ PROJECT SITE From 957737bc9e4b02d92757135e353fdea947ec6d5a Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 27 Feb 2023 20:43:30 +0300 Subject: [PATCH 214/238] Version 3.2.1 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 11 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c3d8da..a0532e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.1 - February 27, 2023 + * In JsRT modes improved a performance of .NET methods projection + ## v3.2.0 - February 26, 2023 * In JavaScript engine settings was added one new property - `AllowReflection` (default `false`) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 7a37a41..b876aa4 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.2.0 + 3.2.1 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index 3810707..b7509ba 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.2.0", + "version": "3.2.1", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 4d4626a..33694cc 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.0 + README file for MSIE JavaScript Engine for .NET v3.2.1 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index cdc78e3..cda4be2 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.2.0 + 3.2.1 net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index a3b6049..0f3a008 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.0 + 3.2.1 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index f7765fc..5ac0f22 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.0 + 3.2.1 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 142818d..29d9f82 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.0 + 3.2.1 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index ce18c31..dbe005c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.0 + 3.2.1 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 61e1770..2644a7c 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.0 + 3.2.1 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index b1ea524..cc5ff94 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.2.0 + 3.2.1 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest From 3dad6404a9e62fb7421311c5645997e151a994c7 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 9 Apr 2023 20:33:10 +0300 Subject: [PATCH 215/238] Fixed a error due to which the global object to become read-only after embedding of the host objects and types --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 +- .../Interop/SomeClass.cs | 10 +++ .../InteropTestsBase.cs | 70 +++++++++++++++++++ 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/SomeClass.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index eeabc4e..57bca46 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -535,7 +535,7 @@ private void InnerEmbedHostItem(string itemName, object value) try { - _activeScriptWrapper.AddNamedItem(itemName, ScriptItemFlags.IsVisible | ScriptItemFlags.GlobalMembers); + _activeScriptWrapper.AddNamedItem(itemName, ScriptItemFlags.IsVisible); } catch { diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index b876aa4..cecd1c4 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In JsRT modes improved a performance of .NET methods projection. + Fixed a error due to which the global object to become read-only after embedding of the host objects and types. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 33694cc..e6e2cd8 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - In JsRT modes improved a performance of .NET methods projection. + Fixed a error due to which the global object to become read-only after embedding + of the host objects and types. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/SomeClass.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/SomeClass.cs new file mode 100644 index 0000000..8a85635 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/SomeClass.cs @@ -0,0 +1,10 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public class SomeClass + { + public int SomeProperty { get; set; } = 123; + public string SomeOtherProperty { get; set; } = "abc"; + + public static SomeClass Instance { get; } = new SomeClass(); + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 53274a2..8cbb90a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -877,6 +877,41 @@ public virtual void RemovingOfEmbeddedInstanceOfCustomReferenceType() #endregion + #region Special cases + + [Test] + public virtual void EmbeddingOfInstanceOfCustomReferenceTypeAndModificationOfGlobalObject() + { + // Arrange + var someObj = new SomeClass(); + + const string modifyingCode = @"(function () { + 'use strict'; + + var global = typeof self != 'undefined' && self.Math == Math ? + self : Function('return this')(); + + global['foo'] = 'bar'; +})();"; + const string variableName = "foo"; + const string targetOutput = "bar"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("someObj", someObj); + jsEngine.Execute(modifyingCode); + output = jsEngine.GetVariableValue(variableName); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + #endregion @@ -1443,6 +1478,41 @@ public virtual void RemovingOfEmbeddedCustomReferenceType() #endregion + #region Special cases + + [Test] + public virtual void EmbeddingOfCustomReferenceTypeAndModificationOfGlobalObject() + { + // Arrange + var someType = typeof(SomeClass); + + const string modifyingCode = @"(function () { + 'use strict'; + + var global = typeof self != 'undefined' && self.Math == Math ? + self : Function('return this')(); + + global.foo = 'baz'; +})();"; + const string variableName = "foo"; + const string targetOutput = "baz"; + + // Act + string output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("SomeType", someType); + jsEngine.Execute(modifyingCode); + output = jsEngine.GetVariableValue(variableName); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + + #endregion + #endregion } } \ No newline at end of file From 7f7332cc4a8b33d68a3e16e119871a69b108b460 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 10 Apr 2023 15:47:05 +0300 Subject: [PATCH 216/238] Version 3.2.2 --- CHANGELOG.md | 3 +++ global.json | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 4 ++-- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 11 files changed, 15 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a0532e8..7773510 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.2 - April 10, 2023 + * Fixed a error due to which the global object to become read-only after embedding of the host objects and types. Special thanks to [Denis Pushkarev](https://github.com/zloirock). + ## v3.2.1 - February 27, 2023 * In JsRT modes improved a performance of .NET methods projection diff --git a/global.json b/global.json index 4347eeb..8344741 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.200" + "version": "7.0.202" } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index cecd1c4..ad652ec 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.2.1 + 3.2.2 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error due to which the global object to become read-only after embedding of the host objects and types. + Fixed a error due to which the global object to become read-only after embedding of the host objects and types. Special thanks to Denis Pushkarev. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index e6e2cd8..8e0235c 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.1 + README file for MSIE JavaScript Engine for .NET v3.2.2 -------------------------------------------------------------------------------- @@ -22,7 +22,7 @@ RELEASE NOTES ============= Fixed a error due to which the global object to become read-only after embedding - of the host objects and types. + of the host objects and types. Special thanks to Denis Pushkarev. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index cda4be2..68810ee 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.2.1 + 3.2.2 net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 0f3a008..6725fcf 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.1 + 3.2.2 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 5ac0f22..1e6b845 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.1 + 3.2.2 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 29d9f82..205cbe6 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.1 + 3.2.2 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index dbe005c..0ccf555 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.1 + 3.2.2 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 2644a7c..e95caaa 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.1 + 3.2.2 net40;net45 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index cc5ff94..6cade8f 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.2.1 + 3.2.2 net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Library latest From ab17463dc27702bdd02bf7b50b54c6bd5612d7bc Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 18 Apr 2023 12:39:37 +0300 Subject: [PATCH 217/238] Changed a `SupportsFunctionBindMethod` test --- global.json | 2 +- .../Es5TestsBase.cs | 23 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/global.json b/global.json index 8344741..ad7cdc7 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.202" + "version": "7.0.203" } } diff --git a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs index ca95a34..762cf9a 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Es5TestsBase.cs @@ -393,18 +393,25 @@ public virtual void SupportsDateToIsoStringMethod() public virtual void SupportsFunctionBindMethod() { // Arrange - const string initCode = @"var a = 5, - module = { - a: 12, - getA: function() { return this.a; } - }, - getA = module.getA + const string initCode = @"var A = (function () { + function A(a) { + this.a = a; + } + + A.prototype.getA = function() { + return this.a; + }; + + return A; + })(), + a = new A(5), + otherContext = { a: 12 } ;"; - const string input1 = "getA();"; + const string input1 = "a.getA();"; const int targetOutput1 = 5; - const string input2 = "getA.bind(module)();"; + const string input2 = "a.getA.bind(otherContext)();"; const int targetOutput2 = 12; // Act From 0e59be14e67afc2ba13b3d3804acb03dcea6cccd Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 1 Dec 2023 20:49:17 +0300 Subject: [PATCH 218/238] In test projects added support of .NET 8 --- global.json | 2 +- .../MsieJavaScriptEngine.csproj | 2 +- .../Resources/CommonStrings.Designer.cs | 2 +- .../Resources/NetCoreStrings.Designer.cs | 2 +- .../Resources/NetFrameworkStrings.Designer.cs | 2 +- .../HostObjectsEmbeddingBenchmark.cs | 6 ++++- .../HostTypesEmbeddingBenchmark.cs | 6 ++++- .../JsExecutionBenchmark.cs | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 13 +++------- .../MsieJavaScriptEngine.Test.Auto.csproj | 13 +++------- ...criptEngine.Test.ChakraActiveScript.csproj | 4 +-- ...avaScriptEngine.Test.ChakraEdgeJsRt.csproj | 13 +++------- ...eJavaScriptEngine.Test.ChakraIeJsRt.csproj | 13 +++------- .../MsieJavaScriptEngine.Test.Classic.csproj | 4 +-- .../CommonTestsBase.cs | 4 --- .../Interop/LoginFailedException.cs | 4 +++ .../MsieJavaScriptEngine.Test.Common.csproj | 25 ++++--------------- .../PrecompilationTestsBase.cs | 4 --- 18 files changed, 41 insertions(+), 80 deletions(-) diff --git a/global.json b/global.json index ad7cdc7..5ce8495 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "7.0.203" + "version": "8.0.100" } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index ad652ec..c83aa82 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -40,7 +40,7 @@ - + diff --git a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs index 1154f28..07f2d33 100644 --- a/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/CommonStrings.Designer.cs @@ -21,7 +21,7 @@ internal class CommonStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.CommonStrings", -#if NET40 +#if NET20 || NET30 || NET35 || NET40 typeof(CommonStrings).Assembly #else typeof(CommonStrings).GetTypeInfo().Assembly diff --git a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs index a115222..21c4dc4 100644 --- a/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetCoreStrings.Designer.cs @@ -21,7 +21,7 @@ internal class NetCoreStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetCoreStrings", -#if NET40 +#if NET20 || NET30 || NET35 || NET40 typeof(NetCoreStrings).Assembly #else typeof(NetCoreStrings).GetTypeInfo().Assembly diff --git a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs index feea37f..b5404bc 100644 --- a/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs +++ b/src/MsieJavaScriptEngine/Resources/NetFrameworkStrings.Designer.cs @@ -21,7 +21,7 @@ internal class NetFrameworkStrings private static Lazy _resourceManager = new Lazy(() => new ResourceManager( "MsieJavaScriptEngine.Resources.NetFrameworkStrings", -#if NET40 +#if NET20 || NET30 || NET35 || NET40 typeof(NetFrameworkStrings).Assembly #else typeof(NetFrameworkStrings).GetTypeInfo().Assembly diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs index b0a91df..700a6bf 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs @@ -66,7 +66,11 @@ private static void EmbedAndUseHostObjects(Func createJsEngine) return result; }(someObj, log));"; +#if NET462 const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA="; +#else + const string targetOutput = "RmFsc2V8MjkxNHwwLjg3Mjg1OTEwNzM4ODQyMzV8QVNERtCk0KvQktCQ"; +#endif string targetLogOutput = "-= Start code execution =-" + Environment.NewLine + "-= End of code execution =-" + Environment.NewLine; @@ -89,7 +93,7 @@ private static void EmbedAndUseHostObjects(Func createJsEngine) Assert.Equal(targetOutput, output); Assert.Equal(targetLogOutput, logOutput); } -#if NET461 +#if NET462 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs index a53ba9a..4bd965c 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs @@ -52,7 +52,11 @@ private static void EmbedAndUseHostTypes(Func createJsEngine) return result; }(SomeClass, Point, SomeOtherClass));"; +#if NET462 const string targetOutput = "RmFsc2V8MjkyMHwwLjg3Mjg1OTEwNzM4ODQyNHxBU0RG0KTQq9CS0JA="; +#else + const string targetOutput = "RmFsc2V8MjkyMHwwLjg3Mjg1OTEwNzM4ODQyMzV8QVNERtCk0KvQktCQ"; +#endif // Act string output; @@ -69,7 +73,7 @@ private static void EmbedAndUseHostTypes(Func createJsEngine) // Assert Assert.Equal(targetOutput, output); } -#if NET461 +#if NET462 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs index 75f135f..633680b 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs @@ -182,7 +182,7 @@ private static void TransliterateStrings(Func createJsEngine, bool Assert.Equal(_targetOutputStrings[itemIndex], outputStrings[itemIndex]); } } -#if NET461 +#if NET462 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 68810ee..4f032d7 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,25 +3,18 @@ MSIE JavaScript Engine: Benchmarks 3.2.2 - net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Exe true false - false - - + - - - - - - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 6725fcf..e9c7354 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,27 +3,20 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.2.2 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest true true false - false - - + - - - - - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 1e6b845..f5b51c7 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode 3.2.2 - net40;net45 + net462 Library latest true @@ -14,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 205cbe6..e6780c2 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,27 +3,20 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.2.2 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest true true false - false - - + - - - - - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 0ccf555..60cf7c7 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,27 +3,20 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.2.2 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest true true false - false - - + - - - - - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index e95caaa..c926391 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Tests for Classic Mode 3.2.2 - net40;net45 + net462 Library latest true @@ -14,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs index 9559651..76ee95e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/CommonTestsBase.cs @@ -1,8 +1,6 @@ using System; using System.IO; -#if !NET40 using System.Reflection; -#endif using System.Threading; using NUnit.Framework; @@ -247,9 +245,7 @@ public virtual void ExecutionOfResourceByNameAndAssembly() using (var jsEngine = CreateJsEngine()) { jsEngine.ExecuteResource(resourceName, typeof(CommonTestsBase) -#if !NET40 .GetTypeInfo() -#endif .Assembly ); output = jsEngine.Evaluate(input); diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs index 72e6b20..85f1f40 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs @@ -1,5 +1,7 @@ using System; +#if !NET8_0_OR_GREATER using System.Runtime.Serialization; +#endif namespace MsieJavaScriptEngine.Test.Common.Interop { @@ -25,6 +27,7 @@ public LoginFailedException(string message) public LoginFailedException(string message, Exception innerException) : base(message, innerException) { } +#if !NET8_0_OR_GREATER protected LoginFailedException(SerializationInfo info, StreamingContext context) : base(info, context) @@ -46,5 +49,6 @@ public override void GetObjectData(SerializationInfo info, StreamingContext cont base.GetObjectData(info, context); info.AddValue("UserName", this._userName); } +#endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 6cade8f..47521f5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,41 +3,26 @@ MSIE JavaScript Engine: Common Tests 3.2.2 - net40;net45;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest true true false - false - + + + - - - - - - - - - - - - - - - - - + diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index b50d472..772e218 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -1,7 +1,5 @@ using System.IO; -#if !NET40 using System.Reflection; -#endif using System.Threading.Tasks; using NUnit.Framework; @@ -207,9 +205,7 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndAssembly() if (supportsScriptPrecompilation) { precompiledResource = jsEngine.PrecompileResource(resourceName, typeof(PrecompilationTestsBase) -#if !NET40 .GetTypeInfo() -#endif .Assembly ); From bbd521cf4afba784f2089003f04cec228e41f326 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 4 Dec 2023 20:33:12 +0300 Subject: [PATCH 219/238] JSON2 library was updated to version of May 10, 2023 --- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/Resources/json2.js | 39 +------------------ src/MsieJavaScriptEngine/readme.txt | 3 +- 3 files changed, 3 insertions(+), 41 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index c83aa82..3a5a2ed 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error due to which the global object to become read-only after embedding of the host objects and types. Special thanks to Denis Pushkarev. + JSON2 library was updated to version of May 10, 2023. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Resources/json2.js b/src/MsieJavaScriptEngine/Resources/json2.js index adac444..b43526d 100644 --- a/src/MsieJavaScriptEngine/Resources/json2.js +++ b/src/MsieJavaScriptEngine/Resources/json2.js @@ -1,5 +1,5 @@ // json2.js -// 2022-10-30 +// 2023-05-10 // Public Domain. // NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. @@ -231,29 +231,6 @@ if (typeof JSON !== "object") { } -// This variable is initialized with an empty array every time -// JSON.stringify() is invoked and checked by the str() function. It's -// used to keep references to object structures and capture cyclic -// objects. Every new object is checked for its existence in this -// array. If it's found it means the JSON object is cyclic and we have -// to stop execution and throw a TypeError accordingly the ECMA262 -// (see NOTE 1 by the link https://tc39.es/ecma262/#sec-json.stringify). - - var seen; - -// Emulate [].includes(). It's actual for old-fashioned JScript. - - function includes(array, value) { - var i; - for (i = 0; i < array.length; i += 1) { - if (value === array[i]) { - return true; - } - } - return false; - } - - function str(key, holder) { // Produce a string from holder[key]. @@ -318,16 +295,6 @@ if (typeof JSON !== "object") { return "null"; } -// Check the value is not circular object. Otherwise throw TypeError. - - if (includes(seen, value)) { - throw new TypeError("Converting circular structure to JSON"); - } - -// Keep the value for the further check on circular references. - - seen.push(value); - // Make an array to hold the partial results of stringifying this object value. gap += indent; @@ -461,10 +428,6 @@ if (typeof JSON !== "object") { throw new Error("JSON.stringify"); } -// Initialize the reference keeper. - - seen = []; - // Make a fake root object containing our value under the key of "". // Return the result of stringifying the value. diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 8e0235c..dc9fe0c 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error due to which the global object to become read-only after embedding - of the host objects and types. Special thanks to Denis Pushkarev. + JSON2 library was updated to version of May 10, 2023. ============ PROJECT SITE From ed02816bb925f88ba3bfc46c6f5beb18bc9a865d Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 6 Dec 2023 19:30:50 +0300 Subject: [PATCH 220/238] Version 3.2.3 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 11 files changed, 14 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7773510..78e3d5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.3 - December 6, 2023 + * JSON2 library was updated to version of May 10, 2023 + ## v3.2.2 - April 10, 2023 * Fixed a error due to which the global object to become read-only after embedding of the host objects and types. Special thanks to [Denis Pushkarev](https://github.com/zloirock). diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 3a5a2ed..1ce2b1a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.2.2 + 3.2.3 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index b7509ba..5561b6a 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.2.1", + "version": "3.2.3", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index dc9fe0c..912fcad 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.2 + README file for MSIE JavaScript Engine for .NET v3.2.3 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 4f032d7..a84d2bb 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.2.2 + 3.2.3 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Exe true @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index e9c7354..f864fa1 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.2 + 3.2.3 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index f5b51c7..f7a318d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.2 + 3.2.3 net462 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index e6780c2..0716698 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.2 + 3.2.3 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 60cf7c7..c97a986 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.2 + 3.2.3 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index c926391..3bfafa1 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.2 + 3.2.3 net462 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 47521f5..69a5920 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.2.2 + 3.2.3 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest From c9e3190dee265704160db287b02987572983f969 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 8 Jan 2024 18:08:02 +0300 Subject: [PATCH 221/238] Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method when running on .NET Core 1.0 --- src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs | 9 +++++++++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 304edc0..3331909 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -262,6 +262,15 @@ private MemberComparer() public override bool Equals(T x, T y) { + if (x == null && y == null) + { + return true; + } + else if (x == null || y == null) + { + return false; + } + return x.Module == y.Module #if !NETSTANDARD1_3 && x.MetadataToken == y.MetadataToken diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 1ce2b1a..e312cb6 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - JSON2 library was updated to version of May 10, 2023. + Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method when running on .NET Core 1.0. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 912fcad..d393488 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - JSON2 library was updated to version of May 10, 2023. + Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method + when running on .NET Core 1.0. ============ PROJECT SITE From c848af9a5225fe90cac52dae558086ae8b605dcc Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 8 Jan 2024 19:11:55 +0300 Subject: [PATCH 222/238] Version 3.2.4 --- CHANGELOG.md | 3 +++ LICENSE.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 4 ++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 13 files changed, 17 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 78e3d5e..53a8522 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.4 - January 8, 2024 + * Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method when running on .NET Core 1.0 + ## v3.2.3 - December 6, 2023 * JSON2 library was updated to version of May 10, 2023 diff --git a/LICENSE.txt b/LICENSE.txt index 55c4d50..6e8f77b 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2023 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2024 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index 96e62fb..97ace32 100644 --- a/build/common.props +++ b/build/common.props @@ -1,5 +1,5 @@ - Copyright © 2012-2023 Andrey Taritsyn + Copyright © 2012-2024 Andrey Taritsyn \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index e312cb6..48253bf 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.2.3 + 3.2.4 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index 5561b6a..646111d 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.2.3", + "version": "3.2.4", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index d393488..93b7407 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.3 + README file for MSIE JavaScript Engine for .NET v3.2.4 -------------------------------------------------------------------------------- - Copyright (c) 2012-2023 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2024 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index a84d2bb..b36724c 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.2.3 + 3.2.4 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Exe true @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index f864fa1..0f03f7e 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.3 + 3.2.4 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index f7a318d..40a36a0 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.3 + 3.2.4 net462 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 0716698..162453a 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.3 + 3.2.4 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index c97a986..12a21d8 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.3 + 3.2.4 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 3bfafa1..c88e8d8 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.3 + 3.2.4 net462 Library latest diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 69a5920..4acc1e5 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.2.3 + 3.2.4 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library latest From 6090bc7ce98dfc178482dda8b1f7b77459d568e0 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 1 Mar 2024 13:18:25 +0300 Subject: [PATCH 223/238] Changed a `.gitignore` file --- .gitignore | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 40f5ee9..00376ec 100644 --- a/.gitignore +++ b/.gitignore @@ -2,15 +2,23 @@ [Bb]in/ [Oo]bj/ +# Node.js tools +node_modules/ +package-lock.json + # NUnit test results TestResult.xml +# BenchmarkDotNet artifacts +BenchmarkDotNet.Artifacts/ + ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files .vs/ .vscode/ +.idea/ *.sln.docstates *.suo *.user @@ -53,6 +61,7 @@ PublishProfiles/ # NuGet Packages packages/ *.nupkg +*.snupkg # Others .build/ @@ -70,4 +79,8 @@ packages/ _UpgradeReport_Files/ Backup*/ UpgradeLog.htm -UpgradeLog*.XML \ No newline at end of file +UpgradeLog*.XML + +# Current project-specific folders and files +nuget/ +**/Resources/*.min.js \ No newline at end of file From 1a7d2c766ca3a89194de9cb1eeeb0920c51611ea Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 1 Mar 2024 16:12:44 +0300 Subject: [PATCH 224/238] PackageLicenseFile -> PackageLicenseExpression --- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 48253bf..c024fcc 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -14,8 +14,7 @@ $(Product) Andrey Taritsyn This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (https://github.com/anaisbetts/SassAndCoffee), Chakra Sample Hosts (https://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (https://github.com/robpaveza/jsrt-dotnet). - LICENSE.txt - false + Apache-2.0 https://github.com/Taritsyn/MsieJavaScriptEngine https://raw.githubusercontent.com/Taritsyn/MsieJavaScriptEngine/master/images/MsieJavaScriptEngine_Logo_128x128.png icon.png @@ -65,7 +64,7 @@ false - $(PackageLicenseFile) + / true false @@ -76,7 +75,7 @@ - readme.txt + / true From 2199a203bbce2148dce8fa615c52e60b9b1dc1bf Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 1 Mar 2024 18:01:35 +0300 Subject: [PATCH 225/238] Added a `README.md` file to NuGet package --- global.json | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 9 +++++++-- src/MsieJavaScriptEngine/PACKAGE-DESCRIPTION.md | 2 ++ src/MsieJavaScriptEngine/readme.txt | 3 +-- 4 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 src/MsieJavaScriptEngine/PACKAGE-DESCRIPTION.md diff --git a/global.json b/global.json index 5ce8495..338c555 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "8.0.100" + "version": "8.0.200" } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index c024fcc..9445f25 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -13,7 +13,8 @@ true $(Product) Andrey Taritsyn - This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). Project was based on the code of SassAndCoffee.JavaScript (https://github.com/anaisbetts/SassAndCoffee), Chakra Sample Hosts (https://github.com/panopticoncentral/chakra-host) and jsrt-dotnet (https://github.com/robpaveza/jsrt-dotnet). + This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy. + README.md Apache-2.0 https://github.com/Taritsyn/MsieJavaScriptEngine https://raw.githubusercontent.com/Taritsyn/MsieJavaScriptEngine/master/images/MsieJavaScriptEngine_Logo_128x128.png @@ -24,7 +25,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method when running on .NET Core 1.0. + Added a `README.md` file to NuGet package. en-US ../../nuget true @@ -74,6 +75,10 @@ false + + $(PackageReadmeFile) + true + / true diff --git a/src/MsieJavaScriptEngine/PACKAGE-DESCRIPTION.md b/src/MsieJavaScriptEngine/PACKAGE-DESCRIPTION.md new file mode 100644 index 0000000..85c08b4 --- /dev/null +++ b/src/MsieJavaScriptEngine/PACKAGE-DESCRIPTION.md @@ -0,0 +1,2 @@ +This library is a .NET wrapper for working with the JavaScript engines of Internet Explorer and Edge Legacy (JsRT versions of Chakra, ActiveScript version of Chakra and Classic JavaScript Engine). +Project was based on the code of [SassAndCoffee.JavaScript](https://github.com/anaisbetts/SassAndCoffee), [Chakra Sample Hosts](https://github.com/panopticoncentral/chakra-host) and [jsrt-dotnet](https://github.com/robpaveza/jsrt-dotnet). \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 93b7407..05ba2c4 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,7 @@ ============= RELEASE NOTES ============= - Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method - when running on .NET Core 1.0. + Added a `README.md` file to NuGet package. ============ PROJECT SITE From 7c2dcede7cd2d18f5b5940d84f59f0823df3817b Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 1 Mar 2024 19:38:50 +0300 Subject: [PATCH 226/238] Version 3.2.5 --- CHANGELOG.md | 3 +++ build/common.props | 2 ++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 8 ++------ src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 3 ++- .../MsieJavaScriptEngine.Test.Auto.csproj | 5 ++--- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 5 ++--- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 5 ++--- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 5 ++--- .../MsieJavaScriptEngine.Test.Classic.csproj | 5 ++--- .../MsieJavaScriptEngine.Test.Common.csproj | 5 ++--- 12 files changed, 23 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53a8522..27dd2aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.2.5 - March 1, 2024 + * Added a `README.md` file to NuGet package + ## v3.2.4 - January 8, 2024 * Fixed a error that occurred in the `ReflectionHelpers.IsAllowedProperty` method when running on .NET Core 1.0 diff --git a/build/common.props b/build/common.props index 97ace32..6a65ecd 100644 --- a/build/common.props +++ b/build/common.props @@ -1,5 +1,7 @@ Copyright © 2012-2024 Andrey Taritsyn + false + false \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 9445f25..aa70849 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine for .NET - 3.2.4 + 3.2.5 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 - 7.3 Library true $(NoWarn);CS1591;NU1605 @@ -29,8 +28,6 @@ en-US ../../nuget true - false - false @@ -38,8 +35,7 @@ - - + diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index 646111d..2d65043 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.2.4", + "version": "3.2.5", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 05ba2c4..c1ec1c6 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.4 + README file for MSIE JavaScript Engine for .NET v3.2.5 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index b36724c..6a69fbb 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,10 +2,11 @@ MSIE JavaScript Engine: Benchmarks - 3.2.4 + 3.2.5 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Exe true + true false diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 0f03f7e..59d8bc1 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.4 + 3.2.5 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library - latest true true false @@ -14,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 40a36a0..45a6f86 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.4 + 3.2.5 net462 Library - latest true true false @@ -14,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 162453a..db28d38 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.4 + 3.2.5 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library - latest true true false @@ -14,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 12a21d8..816d0c4 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.4 + 3.2.5 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library - latest true true false @@ -14,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index c88e8d8..b14413f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.4 + 3.2.5 net462 Library - latest true true false @@ -14,7 +13,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 4acc1e5..826f89d 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,10 +2,9 @@ MSIE JavaScript Engine: Common Tests - 3.2.4 + 3.2.5 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 Library - latest true true false @@ -15,7 +14,7 @@ - + From 98bd0f86cb31d7cf01b39d2d4a883e0a40b35d69 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Thu, 22 Jan 2026 17:49:43 +0300 Subject: [PATCH 227/238] In test and sample projects added support for .NET 9 and 10 --- global.json | 3 ++- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 3 ++- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 3 ++- .../MsieJavaScriptEngine.Test.Common.csproj | 7 ++++--- 9 files changed, 23 insertions(+), 15 deletions(-) diff --git a/global.json b/global.json index 338c555..512142d 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,6 @@ { "sdk": { - "version": "8.0.200" + "version": "10.0.100", + "rollForward": "latestFeature" } } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index aa70849..b3056ae 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -7,7 +7,7 @@ 1.6.0 Library true - $(NoWarn);CS1591;NU1605 + $(NoWarn);CS1591;NETSDK1215;NU1605 true true $(Product) diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 6a69fbb..a6a272c 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,17 +3,18 @@ MSIE JavaScript Engine: Benchmarks 3.2.5 - net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Exe true true + false false - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 59d8bc1..976682c 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -3,9 +3,10 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.2.5 - net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true + false true false @@ -13,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 45a6f86..26cd17f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -6,6 +6,7 @@ net462 Library true + false true false @@ -13,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index db28d38..d986717 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -3,9 +3,10 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.2.5 - net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true + false true false @@ -13,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 816d0c4..e921469 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -3,9 +3,10 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.2.5 - net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true + false true false @@ -13,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index b14413f..9ccbded 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -6,6 +6,7 @@ net462 Library true + false true false @@ -13,7 +14,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 826f89d..3412603 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -3,9 +3,10 @@ MSIE JavaScript Engine: Common Tests 3.2.5 - net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0 + net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true + false true false @@ -14,9 +15,9 @@ - + - + From 9739da3b381478ca626d832404b8c17cee6697b3 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 23 Jan 2026 20:05:10 +0300 Subject: [PATCH 228/238] .sln -> .slnx --- .editorconfig | 5 +- .gitattributes | 2 +- MsieJavaScriptEngine.sln | 120 -------------------------------------- MsieJavaScriptEngine.slnx | 56 ++++++++++++++++++ 4 files changed, 58 insertions(+), 125 deletions(-) delete mode 100644 MsieJavaScriptEngine.sln create mode 100644 MsieJavaScriptEngine.slnx diff --git a/.editorconfig b/.editorconfig index cbaf667..f7c68a0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -17,13 +17,10 @@ insert_final_newline = true indent_style = space indent_size = 4 -[*.{xml,config,csproj,props,targets}] +[*.{xml,config,slnx,csproj,props,targets}] indent_style = space indent_size = 2 -[*.sln] -insert_final_newline = true - [*.{txt,md}] indent_style = space indent_size = unset diff --git a/.gitattributes b/.gitattributes index 4fce753..9607807 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,7 +3,7 @@ # Custom for Visual Studio *.cs diff=csharp -*.sln merge=union +*.slnx merge=union *.csproj merge=union # Standard to msysgit diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln deleted file mode 100644 index b0d2432..0000000 --- a/MsieJavaScriptEngine.sln +++ /dev/null @@ -1,120 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4BC3AE92-2685-4223-AA35-097A54C5FBEA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{262F5A48-E8AC-41F1-9FC6-4DA3785CCD93}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1F9B41F3-53ED-4254-98B7-F4309EA0D53E}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles", "{E3F8640B-91D8-4BBE-B807-D69D1DE0D818}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\declinationOfMinutes.js = test\SharedFiles\declinationOfMinutes.js - test\SharedFiles\link.txt = test\SharedFiles\link.txt - test\SharedFiles\square.js = test\SharedFiles\square.js - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "recursiveEvaluation", "recursiveEvaluation", "{BEEE3756-112D-4D3B-AE72-8F973ABC9522}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "noError", "noError", "{A2F0B579-9EA7-4DB3-AC75-746D84A067C1}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\recursiveEvaluation\noError\index.js = test\SharedFiles\recursiveEvaluation\noError\index.js - test\SharedFiles\recursiveEvaluation\noError\math.js = test\SharedFiles\recursiveEvaluation\noError\math.js - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "runtimeError", "runtimeError", "{DE2AB601-AA34-4451-8729-EAE16B737673}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\recursiveEvaluation\runtimeError\index.js = test\SharedFiles\recursiveEvaluation\runtimeError\index.js - test\SharedFiles\recursiveEvaluation\runtimeError\math.js = test\SharedFiles\recursiveEvaluation\runtimeError\math.js - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "recursiveExecution", "recursiveExecution", "{6A8412E2-4DF8-4248-BB54-DC823BB11906}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "noError", "noError", "{06BFE84E-3448-4A01-94F1-4F496D8B3AAB}" - ProjectSection(SolutionItems) = preProject - test\SharedFiles\recursiveExecution\noError\firstFile.js = test\SharedFiles\recursiveExecution\noError\firstFile.js - test\SharedFiles\recursiveExecution\noError\mainFile.js = test\SharedFiles\recursiveExecution\noError\mainFile.js - test\SharedFiles\recursiveExecution\noError\secondFile.js = test\SharedFiles\recursiveExecution\noError\secondFile.js - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{3C9CD486-50AD-476E-9515-3F85EBAFCC38}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Benchmarks", "test\MsieJavaScriptEngine.Benchmarks\MsieJavaScriptEngine.Benchmarks.csproj", "{A304B8BE-B946-453B-B2B5-D21305A299F8}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Auto", "test\MsieJavaScriptEngine.Test.Auto\MsieJavaScriptEngine.Test.Auto.csproj", "{3DD423C5-DC32-42D4-9924-B5D8C2F23195}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraEdgeJsRt", "test\MsieJavaScriptEngine.Test.ChakraEdgeJsRt\MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj", "{56218CBF-F251-4A3A-A50F-7C3FCC9258F6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraIeJsRt", "test\MsieJavaScriptEngine.Test.ChakraIeJsRt\MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj", "{5864D57D-2EB8-4684-9908-26111127E75B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.ChakraActiveScript", "test\MsieJavaScriptEngine.Test.ChakraActiveScript\MsieJavaScriptEngine.Test.ChakraActiveScript.csproj", "{EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{72233C70-DF61-449F-8D53-D456284CDA5D}" -EndProject - -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Release|Any CPU.Build.0 = Release|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.Build.0 = Release|Any CPU - {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Release|Any CPU.Build.0 = Release|Any CPU - {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DD423C5-DC32-42D4-9924-B5D8C2F23195}.Release|Any CPU.Build.0 = Release|Any CPU - {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {56218CBF-F251-4A3A-A50F-7C3FCC9258F6}.Release|Any CPU.Build.0 = Release|Any CPU - {5864D57D-2EB8-4684-9908-26111127E75B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5864D57D-2EB8-4684-9908-26111127E75B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5864D57D-2EB8-4684-9908-26111127E75B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5864D57D-2EB8-4684-9908-26111127E75B}.Release|Any CPU.Build.0 = Release|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B}.Release|Any CPU.Build.0 = Release|Any CPU - {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {3C9CD486-50AD-476E-9515-3F85EBAFCC38} = {262F5A48-E8AC-41F1-9FC6-4DA3785CCD93} - {A304B8BE-B946-453B-B2B5-D21305A299F8} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {3DD423C5-DC32-42D4-9924-B5D8C2F23195} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {56218CBF-F251-4A3A-A50F-7C3FCC9258F6} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {5864D57D-2EB8-4684-9908-26111127E75B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {72233C70-DF61-449F-8D53-D456284CDA5D} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {BEEE3756-112D-4D3B-AE72-8F973ABC9522} = {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} - {A2F0B579-9EA7-4DB3-AC75-746D84A067C1} = {BEEE3756-112D-4D3B-AE72-8F973ABC9522} - {DE2AB601-AA34-4451-8729-EAE16B737673} = {BEEE3756-112D-4D3B-AE72-8F973ABC9522} - {6A8412E2-4DF8-4248-BB54-DC823BB11906} = {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} - {06BFE84E-3448-4A01-94F1-4F496D8B3AAB} = {6A8412E2-4DF8-4248-BB54-DC823BB11906} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {5035D2B6-B7C8-4A7F-8764-07B60AD66E96} - EndGlobalSection -EndGlobal diff --git a/MsieJavaScriptEngine.slnx b/MsieJavaScriptEngine.slnx new file mode 100644 index 0000000..4508614 --- /dev/null +++ b/MsieJavaScriptEngine.slnx @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 0547eda8dfbf4025b0af245cb3a4772108ed4589 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 30 Jan 2026 13:02:26 +0300 Subject: [PATCH 229/238] Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method --- .../Helpers/ReflectionHelpers.cs | 127 +++++++++++------- .../MsieJavaScriptEngine.csproj | 24 +++- src/MsieJavaScriptEngine/readme.txt | 2 +- 3 files changed, 96 insertions(+), 57 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 3331909..9e1f323 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,7 +1,14 @@ using System; +#if NET45_OR_GREATER || NETSTANDARD +using System.Buffers; +#endif using System.Collections.Generic; using System.Linq; using System.Reflection; +#if NET40 + +using PolyfillsForOldDotNet.System.Buffers; +#endif using MsieJavaScriptEngine.Utilities; @@ -113,6 +120,11 @@ public static void FixPropertyValueType(ref object value, PropertyInfo property) public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] parameters) { int argCount = argValues.Length; + if (argCount == 0) + { + return; + } + int parameterCount = parameters.Length; for (int argIndex = 0; argIndex < argCount; argIndex++) @@ -147,54 +159,72 @@ public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] para public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValues) { - MethodWithMetadata[] methodCandidates = methods - .Select(m => new MethodWithMetadata - { - Method = m, - ParameterTypes = m.GetParameters() - .Select(p => p.ParameterType) - .ToArray() - }) - .ToArray() - ; - int argCount = argValues.Length; - MethodWithMetadata[] sameArityMethods = methodCandidates - .Where(m => m.ParameterTypes.Length == argCount) - .ToArray() - ; - - int sameArityMethodCount = sameArityMethods.Length; - if (sameArityMethodCount == 0) + int methodCount = methods.Length; + if (methodCount == 0) { return null; } - Type[] argTypes = argValues - .Select(a => a != null ? a.GetType() : typeof(object)) - .ToArray() - ; - var compatibleMethods = new List(); - - for (int methodIndex = 0; methodIndex < sameArityMethodCount; methodIndex++) + if (methodCount == 1) { - MethodWithMetadata method = sameArityMethods[methodIndex]; - ushort compatibilityScore; + MethodBase method = methods[0]; + ParameterInfo[] parameters = method.GetParameters(); - if (CompareParameterTypes(argValues, argTypes, method.ParameterTypes, out compatibilityScore)) + MethodBase bestFitMethod = null; + if (CompareParameterTypes(argValues, parameters, out _)) { - method.CompatibilityScore = compatibilityScore; - compatibleMethods.Add(method); + bestFitMethod = method; } + + return bestFitMethod; } - int compatibleMethodCount = compatibleMethods.Count; - if (compatibleMethodCount > 0) + MethodWithMetadata[] compatibleMethods = null; + int compatibleMethodCount = 0; + + var methodArrayPool = ArrayPool.Shared; + MethodWithMetadata[] buffer = methodArrayPool.Rent(methodCount); + + try { - if (compatibleMethodCount == 1) + for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) + { + MethodBase method = methods[methodIndex]; + ParameterInfo[] parameters = method.GetParameters(); + ushort compatibilityScore; + + if (CompareParameterTypes(argValues, parameters, out compatibilityScore)) + { + compatibleMethodCount++; + + int compatibleMethodIndex = compatibleMethodCount - 1; + buffer[compatibleMethodIndex] = new MethodWithMetadata + { + Method = method, + CompatibilityScore = compatibilityScore + }; + } + } + + if (compatibleMethodCount > 0) { - return compatibleMethods[0].Method; + if (compatibleMethodCount == 1) + { + return buffer[0].Method; + } + + compatibleMethods = new MethodWithMetadata[compatibleMethodCount]; + Array.Copy(buffer, compatibleMethods, compatibleMethodCount); } + } + finally + { + bool clearArray = compatibleMethodCount > 0; + methodArrayPool.Return(buffer, clearArray); + } + if (compatibleMethods != null) + { MethodWithMetadata bestFitMethod = compatibleMethods .OrderByDescending(m => m.CompatibilityScore) .First() @@ -206,24 +236,29 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu return null; } - private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, Type[] parameterTypes, + private static bool CompareParameterTypes(object[] argValues, ParameterInfo[] parameters, out ushort compatibilityScore) { - int argValueCount = argValues.Length; - int argTypeCount = argTypes.Length; - int parameterCount = parameterTypes.Length; + int argCount = argValues.Length; + int parameterCount = parameters.Length; compatibilityScore = 0; - if (argValueCount != argTypeCount || argTypeCount != parameterCount) + if (argCount != parameterCount) { return false; } + else if (argCount == 0) + { + compatibilityScore = ushort.MaxValue; + return true; + } - for (int argIndex = 0; argIndex < argValueCount; argIndex++) + for (int argIndex = 0; argIndex < argCount; argIndex++) { object argValue = argValues[argIndex]; - Type argType = argTypes[argIndex]; - Type parameterType = parameterTypes[argIndex]; + Type argType = argValue != null ? argValue.GetType() : typeof(object); + ParameterInfo parameter = parameters[argIndex]; + Type parameterType = parameter.ParameterType; if (argType == parameterType) { @@ -239,8 +274,6 @@ private static bool CompareParameterTypes(object[] argValues, Type[] argTypes, T { return false; } - - continue; } } @@ -297,12 +330,6 @@ public MethodBase Method set; } - public Type[] ParameterTypes - { - get; - set; - } - /// TODO: In future will need to change type to double public ushort CompatibilityScore { diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index b3056ae..a2b4e2a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,7 +24,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Added a `README.md` file to NuGet package. + Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method. en-US ../../nuget true @@ -39,13 +39,12 @@ - - - + + - - + + @@ -54,6 +53,19 @@ + + + + + + + + + + + + + $(PackageIcon) diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index c1ec1c6..3ae75e3 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,7 @@ ============= RELEASE NOTES ============= - Added a `README.md` file to NuGet package. + Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method. ============ PROJECT SITE From a64c4995c7550f963babb71b5ea962bee872a427 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Fri, 30 Jan 2026 13:33:59 +0300 Subject: [PATCH 230/238] Added support for .NET Standard 2.1 --- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 5 +++-- src/MsieJavaScriptEngine/readme.txt | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index a2b4e2a..b90f8ed 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine for .NET 3.2.5 - net40-client;net45;netstandard1.3;netstandard2.0 + net40-client;net45;netstandard1.3;netstandard2.0;netstandard2.1 1.6.0 Library true @@ -24,7 +24,8 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method. + 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; +2. Added support for .NET Standard 2.1. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 3ae75e3..da1d4c5 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,7 +21,8 @@ ============= RELEASE NOTES ============= - Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method. + 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; + 2. Added support for .NET Standard 2.1. ============ PROJECT SITE From bf49bcd088f462e9e748d6781a12e5b0660fa6fb Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 1 Feb 2026 20:32:29 +0300 Subject: [PATCH 231/238] Performed a migration to the modern C# null/not-null checks --- build/common.props | 1 + .../ActiveScript/ActiveScriptException.cs | 4 +- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 6 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 32 +++++----- .../ActiveScriptJsErrorHelpers.cs | 4 +- .../ActiveScript/ActiveScriptWrapper32.cs | 2 +- .../ActiveScript/ActiveScriptWrapper64.cs | 2 +- .../ActiveScript/ActiveScriptWrapperBase.cs | 6 +- .../ClassicActiveScriptJsEngine.ScriptSite.cs | 2 +- .../ActiveScript/Debugging/DebugDocument.cs | 4 +- .../ActiveScript/HostObject.cs | 2 +- .../Extensions/ExceptionExtensions.cs | 2 +- .../Extensions/StringExtensions.cs | 14 ++-- .../Extensions/TypeExtensions.cs | 2 +- .../Helpers/ComHelpers.cs | 4 +- .../Helpers/JsErrorHelpers.cs | 18 +++--- .../Helpers/ReflectionHelpers.cs | 16 ++--- .../Helpers/TypeMappingHelpers.cs | 6 +- src/MsieJavaScriptEngine/JsException.cs | 8 +-- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 6 +- .../JsRt/Edge/EdgeTypeMapper.cs | 38 +++++------ .../JsRt/Embedding/EmbeddedItem.cs | 2 +- .../JsRt/Embedding/EmbeddedObjectKey.cs | 6 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 6 +- .../JsRt/Ie/IeTypeMapper.cs | 38 +++++------ src/MsieJavaScriptEngine/JsRt/JsException.cs | 4 +- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 14 ++-- .../JsRuntimeException.cs | 4 +- src/MsieJavaScriptEngine/JsScriptException.cs | 4 +- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 64 +++++++++---------- .../System/Reflection/TypeInfoExtensions.cs | 4 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 16 ++--- .../Utilities/TypeConverter.cs | 6 +- .../Utilities/UniqueDocumentNameManager.cs | 2 +- src/MsieJavaScriptEngine/Utilities/Utils.cs | 6 +- src/MsieJavaScriptEngine/readme.txt | 3 +- .../Interop/FileManager.cs | 2 +- .../Interop/LoginFailedException.cs | 4 +- 39 files changed, 185 insertions(+), 182 deletions(-) diff --git a/build/common.props b/build/common.props index 6a65ecd..e683307 100644 --- a/build/common.props +++ b/build/common.props @@ -3,5 +3,6 @@ Copyright © 2012-2024 Andrey Taritsyn false false + 14.0 \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs index be86036..a005e9a 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptException.cs @@ -163,7 +163,7 @@ public ActiveScriptException(string message, Exception innerException) private ActiveScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _errorCode = info.GetInt32("ErrorCode"); _type = info.GetString("Type"); @@ -187,7 +187,7 @@ private ActiveScriptException(SerializationInfo info, StreamingContext context) [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException("info"); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index ef2011a..aa6bda9 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -200,7 +200,7 @@ public void GetLcid(out int lcid) public void GetItemInfo(string name, ScriptInfoFlags mask, ref IntPtr pUnkItem, ref IntPtr pTypeInfo) { object item = _jsEngine._hostItems[name]; - if (item == null) + if (item is null) { throw new COMException( string.Format(NetFrameworkStrings.Runtime_ItemNotFound, name), @@ -254,7 +254,7 @@ public void OnScriptErrorDebug(IActiveScriptErrorDebug errorDebug, out bool ente out bool callOnScriptErrorWhenContinuing) { var error = errorDebug as IActiveScriptError; - if (error != null) + if (error is not null) { ProcessActiveScriptError(error); } @@ -329,7 +329,7 @@ public CustomQueryInterfaceResult GetInterface(ref Guid iid, out IntPtr pInterfa || iid == typeof(IActiveScriptSiteDebug64).GUID || iid == typeof(IActiveScriptSiteDebugEx).GUID) { - return _jsEngine._processDebugManagerWrapper != null ? + return _jsEngine._processDebugManagerWrapper is not null ? CustomQueryInterfaceResult.NotHandled : CustomQueryInterfaceResult.Failed; } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 57bca46..30c6af2 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -172,7 +172,7 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, } finally { - if (_dispatch == null) + if (_dispatch is null) { Dispose(); } @@ -187,14 +187,14 @@ protected ActiveScriptJsEngineBase(JsEngineSettings settings, string clsid, /// or 0 to use the default maximum stack size specified in the header for the executable. private static void InitScriptDispatcher(int maxStackSize) { - if (_dispatcher != null) + if (_dispatcher is not null) { return; } lock (_dispatcherSynchronizer) { - if (_dispatcher != null) + if (_dispatcher is not null) { return; } @@ -328,7 +328,7 @@ private ActiveScriptException GetAndResetLastException() private void ThrowError() { ActiveScriptException last = GetAndResetLastException(); - if (last != null) + if (last is not null) { throw last; } @@ -539,7 +539,7 @@ private void InnerEmbedHostItem(string itemName, object value) } catch { - if (oldValue != null) + if (oldValue is not null) { _hostItems[itemName] = oldValue; } @@ -607,12 +607,12 @@ private object[] MapToHostType(object[] args) private static IExpando WrapScriptDispatch(object dispatch) { IExpando wrappedDispatch = null; - if (dispatch != null && dispatch.GetType().IsCOMObject) + if (dispatch is not null && dispatch.GetType().IsCOMObject) { wrappedDispatch = dispatch as IExpando; } - if (wrappedDispatch == null) + if (wrappedDispatch is null) { throw new InvalidOperationException( NetFrameworkStrings.Engine_ActiveScriptDispatcherNotInitialized); @@ -652,7 +652,7 @@ private JsException WrapActiveScriptException(ActiveScriptException originalExce wrapperException.Description = originalException.Description; var wrapperScriptException = wrapperException as JsScriptException; - if (wrapperScriptException != null) + if (wrapperScriptException is not null) { wrapperScriptException.Type = originalException.Type; wrapperScriptException.DocumentName = originalException.DocumentName; @@ -798,7 +798,7 @@ public override bool HasVariable(string variableName) try { object variableValue = InnerGetVariableValue(variableName); - variableExist = variableValue != null; + variableExist = variableValue is not null; } catch (ActiveScriptException e) { @@ -933,7 +933,7 @@ public override void Dispose() { if (_disposedFlag.Set()) { - if (_debuggingStarted && _debugDocuments != null) + if (_debuggingStarted && _debugDocuments is not null) { foreach (UIntPtr debugDocumentKey in _debugDocuments.Keys) { @@ -945,11 +945,11 @@ public override void Dispose() _debugDocuments = null; } - if (_processDebugManagerWrapper != null) + if (_processDebugManagerWrapper is not null) { _processDebugManagerWrapper.RemoveApplication(_debugApplicationCookie); - if (_debugApplicationWrapper != null) + if (_debugApplicationWrapper is not null) { _debugApplicationWrapper.Close(); _debugApplicationWrapper = null; @@ -958,7 +958,7 @@ public override void Dispose() _processDebugManagerWrapper = null; } - if (_documentNames != null) + if (_documentNames is not null) { _documentNames.Clear(); _documentNames = null; @@ -966,20 +966,20 @@ public override void Dispose() _dispatcher.Invoke(() => { - if (_dispatch != null) + if (_dispatch is not null) { Marshal.ReleaseComObject(_dispatch); _dispatch = null; } - if (_activeScriptWrapper != null) + if (_activeScriptWrapper is not null) { _activeScriptWrapper.Dispose(); _activeScriptWrapper = null; } }); - if (_hostItems != null) + if (_hostItems is not null) { _hostItems.Clear(); _hostItems = null; diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs index 92fef49..3cf8b1f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsErrorHelpers.cs @@ -71,12 +71,12 @@ public static string GetErrorTypeByNumber(int errorNumber, DictionaryShort name of error item public static string ShortenErrorItemName(string itemName, string prefix) { - if (itemName == null) + if (itemName is null) { throw new ArgumentNullException(nameof(itemName)); } - if (prefix == null) + if (prefix is null) { throw new ArgumentNullException(nameof(prefix)); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs index 6893c38..9239d76 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper32.cs @@ -116,7 +116,7 @@ public override object ParseScriptText(string code, string itemName, object cont public override void EnumStackFrames(out IEnumDebugStackFrames enumFrames) { - if (_debugStackFrameSniffer32 != null) + if (_debugStackFrameSniffer32 is not null) { _debugStackFrameSniffer32.EnumStackFrames(out enumFrames); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs index bd849b9..bff66b4 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapper64.cs @@ -116,7 +116,7 @@ public override object ParseScriptText(string code, string itemName, object cont public override void EnumStackFrames(out IEnumDebugStackFrames enumFrames) { - if (_debugStackFrameSniffer64 != null) + if (_debugStackFrameSniffer64 is not null) { _debugStackFrameSniffer64.EnumStackFrames(out enumFrames); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs index 0aa68be..dc9bb3f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptWrapperBase.cs @@ -69,7 +69,7 @@ protected ActiveScriptWrapperBase(string clsid, ScriptLanguageVersion languageVe if (languageVersion != ScriptLanguageVersion.None) { var activeScriptProperty = _activeScript as IActiveScriptProperty; - if (activeScriptProperty != null) + if (activeScriptProperty is not null) { object scriptLanguageVersion = (int)languageVersion; uint result = activeScriptProperty.SetProperty((uint)ScriptProperty.InvokeVersioning, @@ -222,7 +222,7 @@ public void InterruptScriptThread(uint scriptThreadId, ref EXCEPINFO exceptionIn /// The type of garbage collection public void CollectGarbage(ScriptGCType type) { - if (_activeScriptGarbageCollector != null) + if (_activeScriptGarbageCollector is not null) { _activeScriptGarbageCollector.CollectGarbage(type); } @@ -247,7 +247,7 @@ protected virtual void Dispose(bool disposing) { _activeScriptGarbageCollector = null; - if (_activeScript != null) + if (_activeScript is not null) { _activeScript.Close(); Marshal.FinalReleaseComObject(_activeScript); diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs index f23b32a..0c5143f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.ScriptSite.cs @@ -95,7 +95,7 @@ protected override CallStackItem[] GetCallStackItems() uint lineNumber = 0; uint columnNumber = 0; - if (documentContext != null) + if (documentContext is not null) { IDebugDocument document; documentContext.GetDocument(out document); diff --git a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs index e44333e..7c7137d 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/Debugging/DebugDocument.cs @@ -120,14 +120,14 @@ private void Initialize() /// public void Close() { - if (_node != null) + if (_node is not null) { _node.Detach(); _node.Close(); _node = null; } - if (_lines != null) + if (_lines is not null) { _lines.Clear(); } diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs index cb00656..62af486 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs @@ -30,7 +30,7 @@ public HostObject(object target, JsEngineMode engineMode, bool allowReflection) : base(target.GetType(), target, engineMode, allowReflection, true) { var del = _target as Delegate; - if (del != null) + if (del is not null) { _delegateParameterCount = del.Method.GetParameters().Length; } diff --git a/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs index e6e2fa5..9f23504 100644 --- a/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/ExceptionExtensions.cs @@ -15,7 +15,7 @@ internal static class ExceptionExtensions /// The exception public static void PreserveStackTrace(this Exception source) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index f6f42b1..736db04 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -15,12 +15,12 @@ internal static class StringExtensions /// true if the quoted value occurs within this string; otherwise, false public static bool ContainsQuotedValue(this string source, string value) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } - if (value == null) + if (value is null) { throw new ArgumentNullException(nameof(value)); } @@ -39,12 +39,12 @@ public static bool ContainsQuotedValue(this string source, string value) /// the current string public static string TrimStart(this string source, string trimString) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } - if (trimString == null) + if (trimString is null) { throw new ArgumentNullException(nameof(trimString)); } @@ -71,7 +71,7 @@ public static string TrimStart(this string source, string trimString) /// The string starting with a capital letter public static string CapitalizeFirstLetter(this string source) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } @@ -109,7 +109,7 @@ public static string CapitalizeFirstLetter(this string source) /// An array of lines public static string[] SplitToLines(this string source) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } @@ -131,7 +131,7 @@ public static string[] SplitToLines(this string source) /// true if the character was received successfully; otherwise, false public static bool TryGetChar(this string source, int index, out char result) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } diff --git a/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs index 4b67c11..f3b5ba3 100644 --- a/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/TypeExtensions.cs @@ -20,7 +20,7 @@ public static TypeCode GetTypeCode(this Type source) TypeCode typeCode; #if NETSTANDARD1_3 - if (source == null) + if (source is null) { typeCode = TypeCode.Empty; } diff --git a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs index 525c056..62823c1 100644 --- a/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ComHelpers.cs @@ -38,7 +38,7 @@ public static bool TryCreateComObject(string progId, string serverName, out T obj = Activator.CreateInstance(type) as T; - return obj != null; + return obj is not null; } public static bool TryGetComType(string progId, string serverName, out Type type) @@ -50,7 +50,7 @@ public static bool TryGetComType(string progId, string serverName, out Type type Type.GetTypeFromProgID(progId, serverName) ; - return type != null; + return type is not null; } public static IntPtr QueryInterface(IntPtr pUnknown) diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 613ceff..6cca9a3 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -81,7 +81,7 @@ internal static CallStackItem[] ParseCallStack(string callStack) /// String representation of the script call stack internal static string StringifyCallStackItems(CallStackItem[] callStackItems) { - if (callStackItems == null) + if (callStackItems is null) { throw new ArgumentException(nameof(callStackItems)); } @@ -127,7 +127,7 @@ internal static string StringifyCallStackItems(CallStackItem[] callStackItems) internal static string GenerateEngineLoadErrorMessage(string description, string engineModeName, bool quoteDescription = false) { - if (engineModeName == null) + if (engineModeName is null) { throw new ArgumentNullException(nameof(engineModeName)); } @@ -213,7 +213,7 @@ internal static string GenerateScriptErrorMessage(string type, string descriptio internal static string GenerateScriptErrorMessage(string type, string description, string documentName, int lineNumber, int columnNumber, string sourceFragment, string callStack) { - if (description == null) + if (description is null) { throw new ArgumentNullException(nameof(description)); } @@ -268,7 +268,7 @@ internal static string GenerateScriptErrorMessage(string type, string descriptio /// Detailed error message public static string GenerateErrorDetails(JsException jsException, bool omitMessage = false) { - if (jsException == null) + if (jsException is null) { throw new ArgumentNullException(nameof(jsException)); } @@ -278,12 +278,12 @@ public static string GenerateErrorDetails(JsException jsException, bool omitMess WriteCommonErrorDetails(detailsBuilder, jsException, omitMessage); var jsScriptException = jsException as JsScriptException; - if (jsScriptException != null) + if (jsScriptException is not null) { WriteScriptErrorDetails(detailsBuilder, jsScriptException); var jsRuntimeException = jsScriptException as JsRuntimeException; - if (jsRuntimeException != null) + if (jsRuntimeException is not null) { WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); } @@ -306,7 +306,7 @@ public static string GenerateErrorDetails(JsException jsException, bool omitMess public static string GenerateErrorDetails(JsScriptException jsScriptException, bool omitMessage = false) { - if (jsScriptException == null) + if (jsScriptException is null) { throw new ArgumentNullException(nameof(jsScriptException)); } @@ -317,7 +317,7 @@ public static string GenerateErrorDetails(JsScriptException jsScriptException, WriteScriptErrorDetails(detailsBuilder, jsScriptException); var jsRuntimeException = jsScriptException as JsRuntimeException; - if (jsRuntimeException != null) + if (jsRuntimeException is not null) { WriteRuntimeErrorDetails(detailsBuilder, jsRuntimeException); } @@ -339,7 +339,7 @@ public static string GenerateErrorDetails(JsScriptException jsScriptException, public static string GenerateErrorDetails(JsRuntimeException jsRuntimeException, bool omitMessage = false) { - if (jsRuntimeException == null) + if (jsRuntimeException is null) { throw new ArgumentNullException(nameof(jsRuntimeException)); } diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 9e1f323..9c03b9f 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -77,7 +77,7 @@ public static bool IsFullyFledgedMethod(MethodInfo method) public static void FixFieldValueType(ref object value, FieldInfo field) { - if (value == null) + if (value is null) { return; } @@ -98,7 +98,7 @@ public static void FixFieldValueType(ref object value, FieldInfo field) public static void FixPropertyValueType(ref object value, PropertyInfo property) { - if (value == null) + if (value is null) { return; } @@ -135,7 +135,7 @@ public static void FixArgumentTypes(ref object[] argValues, ParameterInfo[] para } object argValue = argValues[argIndex]; - if (argValue == null) + if (argValue is null) { continue; } @@ -223,7 +223,7 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu methodArrayPool.Return(buffer, clearArray); } - if (compatibleMethods != null) + if (compatibleMethods is not null) { MethodWithMetadata bestFitMethod = compatibleMethods .OrderByDescending(m => m.CompatibilityScore) @@ -256,7 +256,7 @@ private static bool CompareParameterTypes(object[] argValues, ParameterInfo[] pa for (int argIndex = 0; argIndex < argCount; argIndex++) { object argValue = argValues[argIndex]; - Type argType = argValue != null ? argValue.GetType() : typeof(object); + Type argType = argValue is not null ? argValue.GetType() : typeof(object); ParameterInfo parameter = parameters[argIndex]; Type parameterType = parameter.ParameterType; @@ -295,11 +295,11 @@ private MemberComparer() public override bool Equals(T x, T y) { - if (x == null && y == null) + if (x is null && y is null) { return true; } - else if (x == null || y == null) + else if (x is null || y is null) { return false; } @@ -316,7 +316,7 @@ public override bool Equals(T x, T y) public override int GetHashCode(T obj) { - return obj != null ? obj.GetHashCode() : 0; + return obj is not null ? obj.GetHashCode() : 0; } #endregion diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index 843ef9c..1127fd7 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -21,7 +21,7 @@ internal static class TypeMappingHelpers /// The mapped value public static object MapToScriptType(object value, JsEngineMode engineMode, bool allowReflection) { - if (value == null) + if (value is null) { return DBNull.Value; } @@ -61,7 +61,7 @@ public static object[] MapToScriptType(object[] args, JsEngineMode engineMode, b /// The mapped value public static object MapToHostType(object value) { - if (value == null) + if (value is null) { return Undefined.Value; } @@ -77,7 +77,7 @@ public static object MapToHostType(object value) } var hostObj = value as HostObject; - object result = hostObj != null ? hostObj.Target : value; + object result = hostObj is not null ? hostObj.Target : value; return result; } diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index 7a72e7f..f1b04f7 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -112,7 +112,7 @@ public JsException(string message, string engineMode, Exception innerException) protected JsException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _engineMode = info.GetString("EngineMode"); _category = info.GetString("Category"); @@ -131,7 +131,7 @@ protected JsException(SerializationInfo info, StreamingContext context) [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException(nameof(info)); } @@ -168,13 +168,13 @@ public override string ToString() resultBuilder.Append(errorDetails); } - if (this.InnerException != null) + if (this.InnerException is not null) { resultBuilder.Append(" ---> "); resultBuilder.Append(this.InnerException.ToString()); } - if (this.StackTrace != null) + if (this.StackTrace is not null) { resultBuilder.AppendLine(); resultBuilder.AppendLine(this.StackTrace); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 7ed6c07..63b3b97 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -224,7 +224,7 @@ private WrapperException WrapJsException(OriginalException originalException, string sourceFragment = string.Empty; var originalScriptException = originalException as OriginalScriptException; - if (originalScriptException != null) + if (originalScriptException is not null) { EdgeJsValue errorValue = originalScriptException.Error; @@ -779,7 +779,7 @@ private void Dispose(bool disposing) { if (_disposedFlag.Set()) { - if (_dispatcher != null) + if (_dispatcher is not null) { _dispatcher.Invoke(DisposeUnmanagedResources); @@ -787,7 +787,7 @@ private void Dispose(bool disposing) _dispatcher = null; } - if (_typeMapper != null) + if (_typeMapper is not null) { _typeMapper.Dispose(); _typeMapper = null; diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 4cae2b4..a66d42e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -39,7 +39,7 @@ public EdgeTypeMapper(bool allowReflection) /// The mapped value public override EdgeJsValue MapToScriptType(object value) { - if (value == null) + if (value is null) { return EdgeJsValue.Null; } @@ -134,7 +134,7 @@ public override object MapToHostType(EdgeJsValue value) protected override EdgeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { var del = obj as Delegate; - EdgeEmbeddedObject embeddedObject = del != null ? + EdgeEmbeddedObject embeddedObject = del is not null ? CreateEmbeddedFunction(del) : CreateEmbeddedObject(obj); return embeddedObject; @@ -183,7 +183,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) EdgeJsValue undefinedValue = EdgeJsValue.Undefined; Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; - EdgeJsValue errorValue = wrapperException != null ? + EdgeJsValue errorValue = wrapperException is not null ? CreateErrorFromWrapperException(wrapperException) : EdgeJsErrorHelpers.CreateError(string.Format( @@ -247,7 +247,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( constructors, processedArgs); - if (bestFitConstructor == null) + if (bestFitConstructor is null) { CreateAndSetReferenceError(string.Format( CommonStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); @@ -264,7 +264,7 @@ protected override EdgeEmbeddedType CreateEmbeddedType(Type type) { Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; - EdgeJsValue errorValue = wrapperException != null ? + EdgeJsValue errorValue = wrapperException is not null ? CreateErrorFromWrapperException(wrapperException) : EdgeJsErrorHelpers.CreateError(string.Format( @@ -322,7 +322,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) { EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); @@ -341,7 +341,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; EdgeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -374,7 +374,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) { EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); @@ -394,7 +394,7 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; EdgeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -449,13 +449,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); - if (property.GetGetMethod() != null) + if (property.GetGetMethod() is not null) { EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); @@ -474,7 +474,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; EdgeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -504,13 +504,13 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) descriptorValue.SetProperty("get", getMethodValue, true); } - if (property.GetSetMethod() != null) + if (property.GetSetMethod() is not null) { EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); @@ -530,7 +530,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; EdgeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -584,7 +584,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) { EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); @@ -595,7 +595,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( methodCandidates, processedArgs); - if (bestFitMethod == null) + if (bestFitMethod is null) { CreateAndSetReferenceError(string.Format( CommonStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); @@ -616,7 +616,7 @@ private void ProjectMethods(EdgeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; EdgeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -694,7 +694,7 @@ private static EdgeJsValue CreateErrorFromWrapperException(WrapperException exce { var originalException = (JsException)exception.InnerException; var originalScriptException = originalException as EdgeJsScriptException; - EdgeJsValue errorValue = originalScriptException != null ? + EdgeJsValue errorValue = originalScriptException is not null ? originalScriptException.Error : EdgeJsErrorHelpers.CreateError(exception.Description) diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs index 8dbad02..52ab74d 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedItem.cs @@ -110,7 +110,7 @@ public void Dispose() _hostObject = null; IList nativeFunctions = _nativeFunctions; - if (nativeFunctions != null) + if (nativeFunctions is not null) { nativeFunctions.Clear(); _nativeFunctions = null; diff --git a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs index 1bd3b1f..4131629 100644 --- a/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs +++ b/src/MsieJavaScriptEngine/JsRt/Embedding/EmbeddedObjectKey.cs @@ -53,7 +53,7 @@ public bool Equals(EmbeddedObjectKey other) bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer) { - if (other == null || !(other is EmbeddedObjectKey)) + if (other is null || !(other is EmbeddedObjectKey)) { return false; } @@ -75,7 +75,7 @@ int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) int IComparable.CompareTo(object other) { - if (other == null) + if (other is null) { return 1; } @@ -113,7 +113,7 @@ public int CompareTo(EmbeddedObjectKey other) int IStructuralComparable.CompareTo(object other, IComparer comparer) { - if (other == null) + if (other is null) { return 1; } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index c405866..21e1a54 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -257,7 +257,7 @@ private WrapperException WrapJsException(OriginalException originalException, string sourceFragment = string.Empty; var originalScriptException = originalException as OriginalScriptException; - if (originalScriptException != null) + if (originalScriptException is not null) { IeJsValue errorValue = originalScriptException.Error; @@ -833,7 +833,7 @@ private void Dispose(bool disposing) { if (_disposedFlag.Set()) { - if (_dispatcher != null) + if (_dispatcher is not null) { _dispatcher.Invoke(DisposeUnmanagedResources); @@ -841,7 +841,7 @@ private void Dispose(bool disposing) _dispatcher = null; } - if (_typeMapper != null) + if (_typeMapper is not null) { _typeMapper.Dispose(); _typeMapper = null; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index 004c7e9..a71027b 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -39,7 +39,7 @@ public IeTypeMapper(bool allowReflection) /// The mapped value public override IeJsValue MapToScriptType(object value) { - if (value == null) + if (value is null) { return IeJsValue.Null; } @@ -134,7 +134,7 @@ public override object MapToHostType(IeJsValue value) protected override IeEmbeddedObject CreateEmbeddedObjectOrFunction(object obj) { var del = obj as Delegate; - IeEmbeddedObject embeddedObject = del != null ? + IeEmbeddedObject embeddedObject = del is not null ? CreateEmbeddedFunction(del) : CreateEmbeddedObject(obj); return embeddedObject; @@ -183,7 +183,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) IeJsValue undefinedValue = IeJsValue.Undefined; Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; - IeJsValue errorValue = wrapperException != null ? + IeJsValue errorValue = wrapperException is not null ? CreateErrorFromWrapperException(wrapperException) : IeJsErrorHelpers.CreateError(string.Format( @@ -247,7 +247,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) var bestFitConstructor = (ConstructorInfo)ReflectionHelpers.GetBestFitMethod( constructors, processedArgs); - if (bestFitConstructor == null) + if (bestFitConstructor is null) { CreateAndSetReferenceError(string.Format( CommonStrings.Runtime_SuitableConstructorOfHostTypeNotFound, typeName)); @@ -264,7 +264,7 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type) { Exception exception = UnwrapException(e); var wrapperException = exception as WrapperException; - IeJsValue errorValue = wrapperException != null ? + IeJsValue errorValue = wrapperException is not null ? CreateErrorFromWrapperException(wrapperException) : IeJsErrorHelpers.CreateError(string.Format( @@ -322,7 +322,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) { IeJsValue undefinedValue = IeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); @@ -341,7 +341,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; IeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -374,7 +374,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) { IeJsValue undefinedValue = IeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); @@ -394,7 +394,7 @@ private void ProjectFields(IeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; IeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -449,13 +449,13 @@ private void ProjectProperties(IeEmbeddedItem externalItem) IeJsValue descriptorValue = IeJsValue.CreateObject(); descriptorValue.SetProperty("enumerable", IeJsValue.True, true); - if (property.GetGetMethod() != null) + if (property.GetGetMethod() is not null) { IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { IeJsValue undefinedValue = IeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); @@ -474,7 +474,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; IeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -504,13 +504,13 @@ private void ProjectProperties(IeEmbeddedItem externalItem) descriptorValue.SetProperty("get", getMethodValue, true); } - if (property.GetSetMethod() != null) + if (property.GetSetMethod() is not null) { IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { IeJsValue undefinedValue = IeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectProperty, propertyName)); @@ -530,7 +530,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; IeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -584,7 +584,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) { IeJsValue undefinedValue = IeJsValue.Undefined; - if (instance && obj == null) + if (instance && obj is null) { CreateAndSetTypeError(string.Format( CommonStrings.Runtime_InvalidThisContextForHostObjectMethod, methodName)); @@ -595,7 +595,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) var bestFitMethod = (MethodInfo)ReflectionHelpers.GetBestFitMethod( methodCandidates, processedArgs); - if (bestFitMethod == null) + if (bestFitMethod is null) { CreateAndSetReferenceError(string.Format( CommonStrings.Runtime_SuitableMethodOfHostObjectNotFound, methodName)); @@ -616,7 +616,7 @@ private void ProjectMethods(IeEmbeddedItem externalItem) var wrapperException = exception as WrapperException; IeJsValue errorValue; - if (wrapperException != null) + if (wrapperException is not null) { errorValue = CreateErrorFromWrapperException(wrapperException); } @@ -693,7 +693,7 @@ private static IeJsValue CreateErrorFromWrapperException(WrapperException except { var originalException = exception.InnerException as JsException; var originalScriptException = originalException as IeJsScriptException; - IeJsValue errorValue = originalScriptException != null ? + IeJsValue errorValue = originalScriptException is not null ? originalScriptException.Error : IeJsErrorHelpers.CreateError(exception.Description) diff --git a/src/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs index f548c14..94978e5 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsException.cs @@ -57,7 +57,7 @@ public JsException(JsErrorCode errorCode, string message) protected JsException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _errorCode = (JsErrorCode)info.GetUInt32("ErrorCode"); } @@ -74,7 +74,7 @@ protected JsException(SerializationInfo info, StreamingContext context) [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException(nameof(info)); } diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index de3fd5a..8fb11b3 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -176,7 +176,7 @@ private void EmbeddedObjectFinalizeCallback(IntPtr ptr) object obj = objHandle.Target; var lazyEmbeddedObjects = _lazyEmbeddedObjects; - if (obj != null && lazyEmbeddedObjects != null) + if (obj is not null && lazyEmbeddedObjects is not null) { var embeddedObjectKey = new EmbeddedObjectKey(obj); Lazy> lazyEmbeddedObject; @@ -204,7 +204,7 @@ private void EmbeddedTypeFinalizeCallback(IntPtr ptr) string embeddedTypeKey = type.AssemblyQualifiedName; var lazyEmbeddedTypes = _lazyEmbeddedTypes; - if (!string.IsNullOrEmpty(embeddedTypeKey) && lazyEmbeddedTypes != null) + if (!string.IsNullOrEmpty(embeddedTypeKey) && lazyEmbeddedTypes is not null) { Lazy> lazyEmbeddedType; @@ -266,7 +266,7 @@ protected Dictionary> GetAvailableMethodGroups(MethodIn protected object[] GetHostItemMemberArguments(TValue[] args, int maxArgCount = -1) { - if (args == null) + if (args is null) { throw new ArgumentNullException(nameof(args)); } @@ -302,10 +302,10 @@ protected static Exception UnwrapException(Exception exception) Exception originalException = exception; var targetInvocationException = exception as TargetInvocationException; - if (targetInvocationException != null) + if (targetInvocationException is not null) { Exception innerException = targetInvocationException.InnerException; - if (innerException != null) + if (innerException is not null) { originalException = innerException; } @@ -324,7 +324,7 @@ public virtual void Dispose() if (_disposedFlag.Set()) { var lazyEmbeddedObjects = _lazyEmbeddedObjects; - if (lazyEmbeddedObjects != null) + if (lazyEmbeddedObjects is not null) { if (lazyEmbeddedObjects.Count > 0) { @@ -347,7 +347,7 @@ public virtual void Dispose() _embeddedObjectFinalizeCallback = null; var lazyEmbeddedTypes = _lazyEmbeddedTypes; - if (lazyEmbeddedTypes != null) + if (lazyEmbeddedTypes is not null) { if (lazyEmbeddedTypes.Count > 0) { diff --git a/src/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs index 20e9c19..771e4f7 100644 --- a/src/MsieJavaScriptEngine/JsRuntimeException.cs +++ b/src/MsieJavaScriptEngine/JsRuntimeException.cs @@ -87,7 +87,7 @@ public JsRuntimeException(string message, string engineMode, Exception innerExce protected JsRuntimeException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _callStack = info.GetString("CallStack"); } @@ -104,7 +104,7 @@ protected JsRuntimeException(SerializationInfo info, StreamingContext context) [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException(nameof(info)); } diff --git a/src/MsieJavaScriptEngine/JsScriptException.cs b/src/MsieJavaScriptEngine/JsScriptException.cs index 44c7776..be17583 100644 --- a/src/MsieJavaScriptEngine/JsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsScriptException.cs @@ -133,7 +133,7 @@ public JsScriptException(string message, string engineMode, Exception innerExcep protected JsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _type = info.GetString("Type"); _documentName = info.GetString("DocumentName"); @@ -154,7 +154,7 @@ protected JsScriptException(SerializationInfo info, StreamingContext context) [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException(nameof(info)); } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index b90f8ed..d2b15b1 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -25,7 +25,8 @@ snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; -2. Added support for .NET Standard 2.1. +2. Added support for .NET Standard 2.1; +3. Performed a migration to the modern C# null/not-null checks. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index e807c48..a5f5853 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -253,7 +253,7 @@ public PrecompiledScript Precompile(string code, string documentName) { VerifyNotDisposed(); - if (code == null) + if (code is null) { throw new ArgumentNullException( nameof(code), @@ -300,7 +300,7 @@ public PrecompiledScript PrecompileFile(string path, Encoding encoding = null) { VerifyNotDisposed(); - if (path == null) + if (path is null) { throw new ArgumentNullException( nameof(path), @@ -355,7 +355,7 @@ public PrecompiledScript PrecompileResource(string resourceName, Type type) { VerifyNotDisposed(); - if (resourceName == null) + if (resourceName is null) { throw new ArgumentNullException( nameof(resourceName), @@ -363,7 +363,7 @@ public PrecompiledScript PrecompileResource(string resourceName, Type type) ); } - if (type == null) + if (type is null) { throw new ArgumentNullException( nameof(type), @@ -393,7 +393,7 @@ public PrecompiledScript PrecompileResource(string resourceName, Type type) Assembly assembly = type.GetTypeInfo().Assembly; #endif string nameSpace = type.Namespace; - string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; + string resourceFullName = nameSpace is not null ? nameSpace + "." + resourceName : resourceName; string code = Utils.GetResourceAsString(resourceFullName, assembly); if (string.IsNullOrWhiteSpace(code)) @@ -425,7 +425,7 @@ public PrecompiledScript PrecompileResource(string resourceName, Assembly assemb { VerifyNotDisposed(); - if (resourceName == null) + if (resourceName is null) { throw new ArgumentNullException( nameof(resourceName), @@ -433,7 +433,7 @@ public PrecompiledScript PrecompileResource(string resourceName, Assembly assemb ); } - if (assembly == null) + if (assembly is null) { throw new ArgumentNullException( nameof(assembly), @@ -504,7 +504,7 @@ public object Evaluate(string expression, string documentName) { VerifyNotDisposed(); - if (expression == null) + if (expression is null) { throw new ArgumentNullException( nameof(expression), @@ -570,7 +570,7 @@ public T Evaluate(string expression, string documentName) { VerifyNotDisposed(); - if (expression == null) + if (expression is null) { throw new ArgumentNullException( nameof(expression), @@ -642,7 +642,7 @@ public void Execute(string code, string documentName) { VerifyNotDisposed(); - if (code == null) + if (code is null) { throw new ArgumentNullException( nameof(code), @@ -687,7 +687,7 @@ public void Execute(PrecompiledScript precompiledScript) { VerifyNotDisposed(); - if (precompiledScript == null) + if (precompiledScript is null) { throw new ArgumentNullException( nameof(precompiledScript), @@ -725,7 +725,7 @@ public void ExecuteFile(string path, Encoding encoding = null) { VerifyNotDisposed(); - if (path == null) + if (path is null) { throw new ArgumentNullException( nameof(path), @@ -781,7 +781,7 @@ public void ExecuteResource(string resourceName, Type type) { VerifyNotDisposed(); - if (resourceName == null) + if (resourceName is null) { throw new ArgumentNullException( nameof(resourceName), @@ -789,7 +789,7 @@ public void ExecuteResource(string resourceName, Type type) ); } - if (type == null) + if (type is null) { throw new ArgumentNullException( nameof(type), @@ -819,7 +819,7 @@ public void ExecuteResource(string resourceName, Type type) Assembly assembly = type.GetTypeInfo().Assembly; #endif string nameSpace = type.Namespace; - string resourceFullName = nameSpace != null ? nameSpace + "." + resourceName : resourceName; + string resourceFullName = nameSpace is not null ? nameSpace + "." + resourceName : resourceName; string code = Utils.GetResourceAsString(resourceFullName, assembly); if (string.IsNullOrWhiteSpace(code)) @@ -852,7 +852,7 @@ public void ExecuteResource(string resourceName, Assembly assembly) { VerifyNotDisposed(); - if (resourceName == null) + if (resourceName is null) { throw new ArgumentNullException( nameof(resourceName), @@ -860,7 +860,7 @@ public void ExecuteResource(string resourceName, Assembly assembly) ); } - if (assembly == null) + if (assembly is null) { throw new ArgumentNullException( nameof(assembly), @@ -913,7 +913,7 @@ public object CallFunction(string functionName, params object[] args) { VerifyNotDisposed(); - if (functionName == null) + if (functionName is null) { throw new ArgumentNullException( nameof(functionName), @@ -944,7 +944,7 @@ public object CallFunction(string functionName, params object[] args) { object argument = args[argumentIndex]; - if (argument != null) + if (argument is not null) { Type argType = argument.GetType(); @@ -982,7 +982,7 @@ public T CallFunction(string functionName, params object[] args) { VerifyNotDisposed(); - if (functionName == null) + if (functionName is null) { throw new ArgumentNullException( nameof(functionName), @@ -1013,7 +1013,7 @@ public T CallFunction(string functionName, params object[] args) { object argument = args[argumentIndex]; - if (argument != null) + if (argument is not null) { Type argType = argument.GetType(); @@ -1057,7 +1057,7 @@ public bool HasVariable(string variableName) { VerifyNotDisposed(); - if (variableName == null) + if (variableName is null) { throw new ArgumentNullException( nameof(variableName), @@ -1098,7 +1098,7 @@ public object GetVariableValue(string variableName) { VerifyNotDisposed(); - if (variableName == null) + if (variableName is null) { throw new ArgumentNullException( nameof(variableName), @@ -1140,7 +1140,7 @@ public T GetVariableValue(string variableName) { VerifyNotDisposed(); - if (variableName == null) + if (variableName is null) { throw new ArgumentNullException( nameof(variableName), @@ -1192,7 +1192,7 @@ public void SetVariableValue(string variableName, object value) { VerifyNotDisposed(); - if (variableName == null) + if (variableName is null) { throw new ArgumentNullException( nameof(variableName), @@ -1216,7 +1216,7 @@ public void SetVariableValue(string variableName, object value) ); } - if (value != null) + if (value is not null) { Type variableType = value.GetType(); @@ -1246,7 +1246,7 @@ public void RemoveVariable(string variableName) { VerifyNotDisposed(); - if (variableName == null) + if (variableName is null) { throw new ArgumentNullException( nameof(variableName), @@ -1289,7 +1289,7 @@ public void EmbedHostObject(string itemName, object value) { VerifyNotDisposed(); - if (itemName == null) + if (itemName is null) { throw new ArgumentNullException( nameof(itemName), @@ -1297,7 +1297,7 @@ public void EmbedHostObject(string itemName, object value) ); } - if (value == null) + if (value is null) { throw new ArgumentNullException( nameof(value), @@ -1352,7 +1352,7 @@ public void EmbedHostType(string itemName, Type type) { VerifyNotDisposed(); - if (itemName == null) + if (itemName is null) { throw new ArgumentNullException( nameof(itemName), @@ -1360,7 +1360,7 @@ public void EmbedHostType(string itemName, Type type) ); } - if (type == null) + if (type is null) { throw new ArgumentNullException( nameof(type), @@ -1424,7 +1424,7 @@ public void Dispose() { if (_disposedFlag.Set()) { - if (_jsEngine != null) + if (_jsEngine is not null) { _jsEngine.Dispose(); _jsEngine = null; diff --git a/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs index 0839899..16d267c 100644 --- a/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs +++ b/src/MsieJavaScriptEngine/Polyfills/System/Reflection/TypeInfoExtensions.cs @@ -8,12 +8,12 @@ internal static class TypeInfoExtensions { public static bool IsInstanceOfType(this TypeInfo source, object o) { - if (source == null) + if (source is null) { throw new ArgumentNullException(nameof(source)); } - if (o == null) + if (o is null) { return false; } diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index d3ba763..7f744ad 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -92,7 +92,7 @@ private void StartThread() if (_taskQueue.Count > 0) { task = _taskQueue.Dequeue(); - if (task == null) + if (task is null) { _taskQueue.Clear(); return; @@ -100,7 +100,7 @@ private void StartThread() } } - if (task != null) + if (task is not null) { task.Run(); } @@ -135,7 +135,7 @@ private void ExecuteTask(ScriptTask task) task.Wait(); Exception exception = task.Exception; - if (exception != null) + if (exception is not null) { #if NET45 || NETSTANDARD ExceptionDispatchInfo.Capture(exception).Throw(); @@ -161,7 +161,7 @@ public T Invoke(Func func) { VerifyNotDisposed(); - if (func == null) + if (func is null) { throw new ArgumentNullException(nameof(func)); } @@ -187,7 +187,7 @@ public void Invoke(Action action) { VerifyNotDisposed(); - if (action == null) + if (action is null) { throw new ArgumentNullException(nameof(action)); } @@ -215,13 +215,13 @@ public void Dispose() { EnqueueTask(null); - if (_thread != null) + if (_thread is not null) { _thread.Join(); _thread = null; } - if (_waitHandle != null) + if (_waitHandle is not null) { _waitHandle.Dispose(); _waitHandle = null; @@ -296,7 +296,7 @@ public void Wait() /// public virtual void Dispose() { - if (_waitHandle != null) + if (_waitHandle is not null) { _waitHandle.Dispose(); _waitHandle = null; diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 38bdc4a..9eb2eea 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -118,7 +118,7 @@ internal static bool IsPrimitiveType(TypeCode typeCode) private static bool ConvertObjectToType(object obj, Type type, bool throwOnError, out object convertedObject) { - if (obj == null) + if (obj is null) { if (IsNonNullableValueType(type)) { @@ -135,7 +135,7 @@ private static bool ConvertObjectToType(object obj, Type type, bool throwOnError return true; } - if (type != null && obj.GetType() != type) + if (type is not null && obj.GetType() != type) { return InnerConvertObjectToType(obj, type, throwOnError, out convertedObject); } @@ -213,7 +213,7 @@ private static bool InnerConvertObjectToType(object obj, Type type, bool throwOn private static bool IsNonNullableValueType(Type type) { - if (type == null) + if (type is null) { return false; } diff --git a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs index f126451..f8a2f6a 100644 --- a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs +++ b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs @@ -33,7 +33,7 @@ internal sealed class UniqueDocumentNameManager /// Default document name public UniqueDocumentNameManager(string defaultName) { - if (defaultName == null) + if (defaultName is null) { throw new ArgumentNullException( nameof(defaultName), diff --git a/src/MsieJavaScriptEngine/Utilities/Utils.cs b/src/MsieJavaScriptEngine/Utilities/Utils.cs index 0c6838a..09ddd99 100644 --- a/src/MsieJavaScriptEngine/Utilities/Utils.cs +++ b/src/MsieJavaScriptEngine/Utilities/Utils.cs @@ -34,7 +34,7 @@ public static bool Is64BitProcess() /// Content of the embedded resource as string public static string GetResourceAsString(string resourceName, Assembly assembly) { - if (resourceName == null) + if (resourceName is null) { throw new ArgumentNullException( nameof(resourceName), @@ -42,7 +42,7 @@ public static string GetResourceAsString(string resourceName, Assembly assembly) ); } - if (assembly == null) + if (assembly is null) { throw new ArgumentNullException( nameof(assembly), @@ -60,7 +60,7 @@ public static string GetResourceAsString(string resourceName, Assembly assembly) using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { - if (stream == null) + if (stream is null) { throw new NullReferenceException( string.Format(CommonStrings.Common_ResourceIsNull, resourceName) diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index da1d4c5..20f45b7 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -22,7 +22,8 @@ RELEASE NOTES ============= 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; - 2. Added support for .NET Standard 2.1. + 2. Added support for .NET Standard 2.1; + 3. Performed a migration to the modern C# null/not-null checks. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs index a2796b9..18e2255 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/FileManager.cs @@ -13,7 +13,7 @@ public string ReadFile(string path) public string ReadFile(string path, Encoding encoding) { - if (path == null) + if (path is null) { throw new ArgumentNullException("path"); } diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs index 85f1f40..371e6ec 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/LoginFailedException.cs @@ -32,7 +32,7 @@ public LoginFailedException(string message, Exception innerException) protected LoginFailedException(SerializationInfo info, StreamingContext context) : base(info, context) { - if (info != null) + if (info is not null) { _userName = info.GetString("UserName"); } @@ -41,7 +41,7 @@ protected LoginFailedException(SerializationInfo info, StreamingContext context) public override void GetObjectData(SerializationInfo info, StreamingContext context) { - if (info == null) + if (info is null) { throw new ArgumentNullException(nameof(info)); } From 3d847fd102d31a4e2059d0095d093a682d674cfb Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 3 Feb 2026 18:34:17 +0300 Subject: [PATCH 232/238] Added support for .NET 10 --- src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs | 2 +- src/MsieJavaScriptEngine/JsCompilationException.cs | 3 +++ src/MsieJavaScriptEngine/JsEngineException.cs | 3 +++ src/MsieJavaScriptEngine/JsEngineLoadException.cs | 3 +++ src/MsieJavaScriptEngine/JsException.cs | 9 +++++++++ src/MsieJavaScriptEngine/JsFatalException.cs | 3 +++ src/MsieJavaScriptEngine/JsInterruptedException.cs | 3 +++ .../JsRt/Edge/EdgeJsScriptException.cs | 3 +++ src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs | 3 +++ src/MsieJavaScriptEngine/JsRt/JsEngineException.cs | 3 +++ src/MsieJavaScriptEngine/JsRt/JsException.cs | 9 +++++++++ src/MsieJavaScriptEngine/JsRt/JsFatalException.cs | 3 +++ src/MsieJavaScriptEngine/JsRt/JsUsageException.cs | 3 +++ src/MsieJavaScriptEngine/JsRuntimeException.cs | 9 +++++++++ src/MsieJavaScriptEngine/JsScriptException.cs | 9 +++++++++ src/MsieJavaScriptEngine/JsUsageException.cs | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 6 +++--- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 4 ++-- src/MsieJavaScriptEngine/Utilities/TypeConverter.cs | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- 20 files changed, 77 insertions(+), 8 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 9c03b9f..86ee4a8 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -1,5 +1,5 @@ using System; -#if NET45_OR_GREATER || NETSTANDARD +#if NET45_OR_GREATER || NETSTANDARD || NET10_0_OR_GREATER using System.Buffers; #endif using System.Collections.Generic; diff --git a/src/MsieJavaScriptEngine/JsCompilationException.cs b/src/MsieJavaScriptEngine/JsCompilationException.cs index fa47b06..b8465d2 100644 --- a/src/MsieJavaScriptEngine/JsCompilationException.cs +++ b/src/MsieJavaScriptEngine/JsCompilationException.cs @@ -69,6 +69,9 @@ public JsCompilationException(string message, string engineMode, Exception inner /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsCompilationException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsEngineException.cs b/src/MsieJavaScriptEngine/JsEngineException.cs index ee99952..f82bc47 100644 --- a/src/MsieJavaScriptEngine/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsEngineException.cs @@ -68,6 +68,9 @@ public JsEngineException(string message, string engineMode, Exception innerExcep /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif protected JsEngineException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsEngineLoadException.cs b/src/MsieJavaScriptEngine/JsEngineLoadException.cs index f3501c9..a6b7084 100644 --- a/src/MsieJavaScriptEngine/JsEngineLoadException.cs +++ b/src/MsieJavaScriptEngine/JsEngineLoadException.cs @@ -68,6 +68,9 @@ public JsEngineLoadException(string message, string engineMode, Exception innerE /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsEngineLoadException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsException.cs b/src/MsieJavaScriptEngine/JsException.cs index f1b04f7..e97d5f2 100644 --- a/src/MsieJavaScriptEngine/JsException.cs +++ b/src/MsieJavaScriptEngine/JsException.cs @@ -2,8 +2,10 @@ using System.Text; #if !NETSTANDARD1_3 using System.Runtime.Serialization; +#if !NET10_0_OR_GREATER using System.Security.Permissions; #endif +#endif using AdvancedStringBuilder; @@ -109,6 +111,9 @@ public JsException(string message, string engineMode, Exception innerException) /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif protected JsException(SerializationInfo info, StreamingContext context) : base(info, context) { @@ -128,7 +133,11 @@ protected JsException(SerializationInfo info, StreamingContext context) /// /// The to populate with data /// The destination (see ) for this serialization +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#else [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info is null) diff --git a/src/MsieJavaScriptEngine/JsFatalException.cs b/src/MsieJavaScriptEngine/JsFatalException.cs index 7bc55bf..43f2400 100644 --- a/src/MsieJavaScriptEngine/JsFatalException.cs +++ b/src/MsieJavaScriptEngine/JsFatalException.cs @@ -68,6 +68,9 @@ public JsFatalException(string message, string engineMode, Exception innerExcept /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsFatalException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsInterruptedException.cs b/src/MsieJavaScriptEngine/JsInterruptedException.cs index 944d45a..ec40bad 100644 --- a/src/MsieJavaScriptEngine/JsInterruptedException.cs +++ b/src/MsieJavaScriptEngine/JsInterruptedException.cs @@ -68,6 +68,9 @@ public JsInterruptedException(string message, string engineMode, Exception inner /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsInterruptedException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs index 4fa0dfe..373c6c6 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScriptException.cs @@ -66,6 +66,9 @@ internal EdgeJsScriptException(JsErrorCode errorCode, EdgeJsValue error, string /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private EdgeJsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs index aaeed01..ec9cf60 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeJsScriptException.cs @@ -66,6 +66,9 @@ internal IeJsScriptException(JsErrorCode errorCode, IeJsValue error, string mess /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private IeJsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs index f538351..4167b86 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsEngineException.cs @@ -37,6 +37,9 @@ public JsEngineException(JsErrorCode errorCode, string message) /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsEngineException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsException.cs b/src/MsieJavaScriptEngine/JsRt/JsException.cs index 94978e5..c2da3e4 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsException.cs @@ -1,8 +1,10 @@ using System; #if !NETSTANDARD1_3 using System.Runtime.Serialization; +#if !NET10_0_OR_GREATER using System.Security.Permissions; #endif +#endif namespace MsieJavaScriptEngine.JsRt { @@ -54,6 +56,9 @@ public JsException(JsErrorCode errorCode, string message) /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif protected JsException(SerializationInfo info, StreamingContext context) : base(info, context) { @@ -71,7 +76,11 @@ protected JsException(SerializationInfo info, StreamingContext context) /// /// The to populate with data /// The destination (see ) for this serialization +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#else [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info is null) diff --git a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs index f65776b..6898a4c 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsFatalException.cs @@ -37,6 +37,9 @@ public JsFatalException(JsErrorCode errorCode, string message) /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsFatalException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs index 8264af1..55ba243 100644 --- a/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs +++ b/src/MsieJavaScriptEngine/JsRt/JsUsageException.cs @@ -37,6 +37,9 @@ public JsUsageException(JsErrorCode errorCode, string message) /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsUsageException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/JsRuntimeException.cs b/src/MsieJavaScriptEngine/JsRuntimeException.cs index 771e4f7..7a30993 100644 --- a/src/MsieJavaScriptEngine/JsRuntimeException.cs +++ b/src/MsieJavaScriptEngine/JsRuntimeException.cs @@ -1,8 +1,10 @@ using System; #if !NETSTANDARD1_3 using System.Runtime.Serialization; +#if !NET10_0_OR_GREATER using System.Security.Permissions; #endif +#endif using MsieJavaScriptEngine.Constants; @@ -84,6 +86,9 @@ public JsRuntimeException(string message, string engineMode, Exception innerExce /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif protected JsRuntimeException(SerializationInfo info, StreamingContext context) : base(info, context) { @@ -101,7 +106,11 @@ protected JsRuntimeException(SerializationInfo info, StreamingContext context) /// /// The to populate with data /// The destination (see ) for this serialization +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#else [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info is null) diff --git a/src/MsieJavaScriptEngine/JsScriptException.cs b/src/MsieJavaScriptEngine/JsScriptException.cs index be17583..87f83d0 100644 --- a/src/MsieJavaScriptEngine/JsScriptException.cs +++ b/src/MsieJavaScriptEngine/JsScriptException.cs @@ -1,8 +1,10 @@ using System; #if !NETSTANDARD1_3 using System.Runtime.Serialization; +#if !NET10_0_OR_GREATER using System.Security.Permissions; #endif +#endif namespace MsieJavaScriptEngine { @@ -130,6 +132,9 @@ public JsScriptException(string message, string engineMode, Exception innerExcep /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif protected JsScriptException(SerializationInfo info, StreamingContext context) : base(info, context) { @@ -151,7 +156,11 @@ protected JsScriptException(SerializationInfo info, StreamingContext context) /// /// The to populate with data /// The destination (see ) for this serialization +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#else [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif public override void GetObjectData(SerializationInfo info, StreamingContext context) { if (info is null) diff --git a/src/MsieJavaScriptEngine/JsUsageException.cs b/src/MsieJavaScriptEngine/JsUsageException.cs index 9296c36..a3049e8 100644 --- a/src/MsieJavaScriptEngine/JsUsageException.cs +++ b/src/MsieJavaScriptEngine/JsUsageException.cs @@ -68,6 +68,9 @@ public JsUsageException(string message, string engineMode, Exception innerExcept /// /// The object that holds the serialized data /// The contextual information about the source or destination +#if NET10_0_OR_GREATER + [Obsolete(DiagnosticId = "SYSLIB0051")] +#endif private JsUsageException(SerializationInfo info, StreamingContext context) : base(info, context) { } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index d2b15b1..9a16aae 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -3,11 +3,11 @@ MSIE JavaScript Engine for .NET 3.2.5 - net40-client;net45;netstandard1.3;netstandard2.0;netstandard2.1 + net40-client;net45;netstandard1.3;netstandard2.0;netstandard2.1;net10.0 1.6.0 Library true - $(NoWarn);CS1591;NETSDK1215;NU1605 + $(NoWarn);CS1591;NETSDK1215;NU1605;NU1903 true true $(Product) @@ -25,7 +25,7 @@ snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; -2. Added support for .NET Standard 2.1; +2. Added support for .NET Standard 2.1 and .NET 10; 3. Performed a migration to the modern C# null/not-null checks. en-US ../../nuget diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 7f744ad..85ed922 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; using System.Runtime.CompilerServices; -#if NET45 || NETSTANDARD +#if NET45_OR_GREATER || NETSTANDARD || NET10_0_OR_GREATER using System.Runtime.ExceptionServices; #endif using System.Threading; @@ -137,7 +137,7 @@ private void ExecuteTask(ScriptTask task) Exception exception = task.Exception; if (exception is not null) { -#if NET45 || NETSTANDARD +#if NET45_OR_GREATER || NETSTANDARD || NET10_0_OR_GREATER ExceptionDispatchInfo.Capture(exception).Throw(); #elif NET40 exception.PreserveStackTrace(); diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 9eb2eea..9ecfe10 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using System.Globalization; using System.Linq; -#if NET45 || NETSTANDARD +#if NET45_OR_GREATER || NETSTANDARD || NET10_0_OR_GREATER using System.Reflection; #endif using OriginalTypeConverter = System.ComponentModel.TypeConverter; diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 20f45b7..26d95f9 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -22,7 +22,7 @@ RELEASE NOTES ============= 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; - 2. Added support for .NET Standard 2.1; + 2. Added support for .NET Standard 2.1 and .NET 10; 3. Performed a migration to the modern C# null/not-null checks. ============ From 88db4ac51086ad588ca33c6a3b6865eca690a710 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 4 Feb 2026 20:23:28 +0300 Subject: [PATCH 233/238] In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 4 ++-- .../ActiveScript/ChakraActiveScriptJsEngine.cs | 2 +- .../ActiveScript/ClassicActiveScriptJsEngine.cs | 2 +- src/MsieJavaScriptEngine/GlobalUsings.cs | 5 +++++ src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 4 ++-- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 3 ++- src/MsieJavaScriptEngine/MsieJsEngine.cs | 2 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 2 +- .../Utilities/UniqueDocumentNameManager.cs | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 +++- 12 files changed, 21 insertions(+), 13 deletions(-) create mode 100644 src/MsieJavaScriptEngine/GlobalUsings.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 30c6af2..53bf411 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -107,7 +107,7 @@ internal abstract partial class ActiveScriptJsEngineBase : InnerJsEngineBase /// /// Synchronizer of script dispatcher initialization /// - private static readonly object _dispatcherSynchronizer = new object(); + private static readonly Lock _dispatcherSynchronizer = new Lock(); /// @@ -210,7 +210,7 @@ private static void InitScriptDispatcher(int maxStackSize) /// Flag indicating whether this JS engine is supported /// Support synchronizer /// Result of check (true - supports; false - does not support) - protected static bool IsSupported(string clsid, ref bool? isSupported, ref object supportSynchronizer) + protected static bool IsSupported(string clsid, ref bool? isSupported, ref Lock supportSynchronizer) { if (isSupported.HasValue) { diff --git a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs index 21f1034..1240edb 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ChakraActiveScriptJsEngine.cs @@ -18,7 +18,7 @@ internal sealed partial class ChakraActiveScriptJsEngine : ActiveScriptJsEngineB /// /// Support synchronizer /// - private static object _supportSynchronizer = new object(); + private static Lock _supportSynchronizer = new Lock(); /// /// Mapping of error numbers and types diff --git a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs index cfe4aec..d9309fe 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ClassicActiveScriptJsEngine.cs @@ -20,7 +20,7 @@ internal sealed partial class ClassicActiveScriptJsEngine : ActiveScriptJsEngine /// /// Support synchronizer /// - private static object _supportSynchronizer = new object(); + private static Lock _supportSynchronizer = new Lock(); /// /// Mapping of error numbers and types diff --git a/src/MsieJavaScriptEngine/GlobalUsings.cs b/src/MsieJavaScriptEngine/GlobalUsings.cs new file mode 100644 index 0000000..70bfca9 --- /dev/null +++ b/src/MsieJavaScriptEngine/GlobalUsings.cs @@ -0,0 +1,5 @@ +#if NET10_0_OR_GREATER +global using Lock = System.Threading.Lock; +#else +global using Lock = System.Object; +#endif \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 63b3b97..2da4c5e 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -51,7 +51,7 @@ internal sealed class ChakraEdgeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Support synchronizer /// - private static readonly object _supportSynchronizer = new object(); + private static readonly Lock _supportSynchronizer = new Lock(); /// diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 21e1a54..732ba72 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -59,7 +59,7 @@ internal sealed class ChakraIeJsRtJsEngine : ChakraJsRtJsEngineBase /// /// Support synchronizer /// - private static readonly object _supportSynchronizer = new object(); + private static readonly Lock _supportSynchronizer = new Lock(); /// diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index 8fb11b3..f75e256 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -43,7 +43,7 @@ internal abstract class TypeMapper : IDisposable /// /// Synchronizer of embedded object storage's initialization /// - private readonly object _embeddedObjectStorageInitializationSynchronizer = new object(); + private readonly Lock _embeddedObjectStorageInitializationSynchronizer = new Lock(); /// /// Flag indicating whether the embedded object storage is initialized @@ -63,7 +63,7 @@ internal abstract class TypeMapper : IDisposable /// /// Synchronizer of embedded type storage's initialization /// - private readonly object _embeddedTypeStorageInitializationSynchronizer = new object(); + private readonly Lock _embeddedTypeStorageInitializationSynchronizer = new Lock(); /// /// Flag indicating whether the embedded type storage is initialized diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 9a16aae..25bfee0 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -26,7 +26,8 @@ JavaScript;ECMAScript;MSIE;IE;Edge;Chakra 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; 2. Added support for .NET Standard 2.1 and .NET 10; -3. Performed a migration to the modern C# null/not-null checks. +3. Performed a migration to the modern C# null/not-null checks; +4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/MsieJsEngine.cs b/src/MsieJavaScriptEngine/MsieJsEngine.cs index a5f5853..1a62abf 100644 --- a/src/MsieJavaScriptEngine/MsieJsEngine.cs +++ b/src/MsieJavaScriptEngine/MsieJsEngine.cs @@ -33,7 +33,7 @@ public sealed class MsieJsEngine : IDisposable /// /// Synchronizer of JS engines creation /// - private static readonly object _creationSynchronizer = new object(); + private static readonly Lock _creationSynchronizer = new Lock(); /// /// Unique document name manager diff --git a/src/MsieJavaScriptEngine/ScriptDispatcher.cs b/src/MsieJavaScriptEngine/ScriptDispatcher.cs index 85ed922..1c58892 100644 --- a/src/MsieJavaScriptEngine/ScriptDispatcher.cs +++ b/src/MsieJavaScriptEngine/ScriptDispatcher.cs @@ -36,7 +36,7 @@ internal sealed class ScriptDispatcher : IDisposable /// /// Synchronizer of script task queue /// - private readonly object _taskQueueSynchronizer = new object(); + private readonly Lock _taskQueueSynchronizer = new Lock(); /// /// Flag that object is destroyed diff --git a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs index f8a2f6a..15b3c43 100644 --- a/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs +++ b/src/MsieJavaScriptEngine/Utilities/UniqueDocumentNameManager.cs @@ -24,7 +24,7 @@ internal sealed class UniqueDocumentNameManager /// /// Synchronizer of unique name storage /// - private readonly object _storageSynchronizer = new object(); + private readonly Lock _storageSynchronizer = new Lock(); /// diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 26d95f9..22709a9 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -23,7 +23,9 @@ ============= 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; 2. Added support for .NET Standard 2.1 and .NET 10; - 3. Performed a migration to the modern C# null/not-null checks. + 3. Performed a migration to the modern C# null/not-null checks; + 4. In the `lock` statements for .NET 10 target now uses a instances of the + `System.Threading.Lock` class. ============ PROJECT SITE From 3aad4788de07ebac33759c7165482e9624ba0fd6 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 9 Feb 2026 14:03:46 +0300 Subject: [PATCH 234/238] Reduced a memory allocation by using collection expressions --- ...ActiveScriptJsEngineBase.ScriptSiteBase.cs | 2 +- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../ActiveScript/HostItemBase.cs | 95 +++++++++++++++---- .../ActiveScript/HostObject.cs | 2 +- .../Extensions/StringExtensions.cs | 29 +++++- .../Helpers/JsErrorHelpers.cs | 6 +- .../Helpers/ReflectionHelpers.cs | 3 +- .../Helpers/TextHelpers.cs | 3 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 2 +- .../JsRt/Edge/EdgeTypeMapper.cs | 7 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 2 +- .../JsRt/Ie/IeTypeMapper.cs | 7 +- src/MsieJavaScriptEngine/JsRt/TypeMapper.cs | 6 +- .../MsieJavaScriptEngine.csproj | 3 +- .../Utilities/EnvironmentShortcuts.cs | 15 +++ src/MsieJavaScriptEngine/readme.txt | 3 +- 16 files changed, 143 insertions(+), 44 deletions(-) create mode 100644 src/MsieJavaScriptEngine/Utilities/EnvironmentShortcuts.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs index aa6bda9..7e6749f 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.ScriptSiteBase.cs @@ -187,7 +187,7 @@ private string GetDocumentName(uint sourceContext) /// An array of instances protected virtual CallStackItem[] GetCallStackItems() { - return new CallStackItem[0]; + return []; } #region IActiveScriptSite implementation diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 53bf411..3489b5b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -479,7 +479,7 @@ private object InnerGetVariableValue(string variableName) try { variableValue = _dispatch.InvokeMember(variableName, BindingFlags.GetProperty, - null, _dispatch, new object[0], null, + null, _dispatch, [], null, CultureInfo.InvariantCulture, null); } catch diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs index 7d0b945..f48d75b 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs @@ -1,7 +1,14 @@ #if NETFRAMEWORK using System; +#if NET45_OR_GREATER +using System.Buffers; +#endif using System.Globalization; using System.Reflection; +#if NET40 + +using PolyfillsForOldDotNet.System.Buffers; +#endif using MsieJavaScriptEngine.Helpers; @@ -93,20 +100,45 @@ protected HostItemBase(Type type, object target, JsEngineMode engineMode, bool a private static PropertyInfo[] GetAvailableProperties(PropertyInfo[] properties) { int propertyCount = properties.Length; - var availableProperties = new PropertyInfo[propertyCount]; - int availablePropertyIndex = 0; + PropertyInfo[] availableProperties = null; + int availablePropertyCount = 0; + + var propertyArrayPool = ArrayPool.Shared; + PropertyInfo[] buffer = propertyArrayPool.Rent(propertyCount); - for (int propertyIndex = 0; propertyIndex < propertyCount; propertyIndex++) + try { - PropertyInfo property = properties[propertyIndex]; - if (ReflectionHelpers.IsAllowedProperty(property)) + foreach (PropertyInfo property in properties) { - availableProperties[availablePropertyIndex] = property; - availablePropertyIndex++; + if (ReflectionHelpers.IsAllowedProperty(property)) + { + availablePropertyCount++; + + int availablePropertyIndex = availablePropertyCount - 1; + buffer[availablePropertyIndex] = property; + } } - } - Array.Resize(ref availableProperties, availablePropertyIndex); + if (availablePropertyCount < propertyCount) + { + if (availablePropertyCount == 0) + { + return []; + } + + availableProperties = new PropertyInfo[availablePropertyCount]; + Array.Copy(buffer, availableProperties, availablePropertyCount); + } + else + { + availableProperties = properties; + } + } + finally + { + bool clearArray = availablePropertyCount > 0; + propertyArrayPool.Return(buffer, clearArray); + } return availableProperties; } @@ -114,21 +146,46 @@ private static PropertyInfo[] GetAvailableProperties(PropertyInfo[] properties) private static MethodInfo[] GetAvailableMethods(MethodInfo[] methods, bool allowReflection) { int methodCount = methods.Length; - var availableMethods = new MethodInfo[methodCount]; - int availableMethodIndex = 0; + MethodInfo[] availableMethods = null; + int availableMethodCount = 0; + + var methodArrayPool = ArrayPool.Shared; + MethodInfo[] buffer = methodArrayPool.Rent(methodCount); - for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) + try { - MethodInfo method = methods[methodIndex]; - if (ReflectionHelpers.IsFullyFledgedMethod(method) - && (allowReflection || ReflectionHelpers.IsAllowedMethod(method))) + foreach (MethodInfo method in methods) { - availableMethods[availableMethodIndex] = method; - availableMethodIndex++; + if (ReflectionHelpers.IsFullyFledgedMethod(method) + && (allowReflection || ReflectionHelpers.IsAllowedMethod(method))) + { + availableMethodCount++; + + int availableMethodIndex = availableMethodCount - 1; + buffer[availableMethodIndex] = method; + } } - } - Array.Resize(ref availableMethods, availableMethodIndex); + if (availableMethodCount < methodCount) + { + if (availableMethodCount == 0) + { + return []; + } + + availableMethods = new MethodInfo[availableMethodCount]; + Array.Copy(buffer, availableMethods, availableMethodCount); + } + else + { + availableMethods = methods; + } + } + finally + { + bool clearArray = availableMethodCount > 0; + methodArrayPool.Return(buffer, clearArray); + } return availableMethods; } diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs index 62af486..ea4dce8 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostObject.cs @@ -76,7 +76,7 @@ protected override object InnerInvokeMember(string name, BindingFlags invokeAttr } else { - processedArgs = new object[0]; + processedArgs = []; } result = del.DynamicInvoke(processedArgs); diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index 736db04..fde2bf8 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -1,5 +1,7 @@ using System; +using MsieJavaScriptEngine.Utilities; + namespace MsieJavaScriptEngine.Extensions { /// @@ -7,6 +9,12 @@ namespace MsieJavaScriptEngine.Extensions /// internal static class StringExtensions { + /// + /// Array of strings used to find the newline + /// + private static readonly string[] _newLineStrings = ["\r\n", "\r", "\n"]; + + /// /// Returns a value indicating whether the specified quoted string occurs within this string /// @@ -62,6 +70,25 @@ public static string TrimStart(this string source, string trimString) return result; } + + /// + /// Removes all leading newline characters from the current object + /// + /// String value + /// The string that remains after all newline characters are removed from the start of + /// the current string. If no characters can be trimmed from the current instance, the method returns + /// the current instance unchanged. + public static string TrimStartNewLines(this string source) + { + if (source is null) + { + throw new ArgumentNullException(nameof(source)); + } + + string result = source.TrimStart(EnvironmentShortcuts.NewLineChars); + + return result; + } #if NETFRAMEWORK /// @@ -114,7 +141,7 @@ public static string[] SplitToLines(this string source) throw new ArgumentNullException(nameof(source)); } - string[] result = source.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None); + string[] result = source.Split(_newLineStrings, StringSplitOptions.None); return result; } diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 6cca9a3..72b7477 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -38,12 +38,12 @@ internal static CallStackItem[] ParseCallStack(string callStack) { if (string.IsNullOrWhiteSpace(callStack)) { - return new CallStackItem[0]; + return []; } - var callStackItems = new List(); string[] lines = callStack.SplitToLines(); int lineCount = lines.Length; + var callStackItems = new List(lineCount); for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) { @@ -66,7 +66,7 @@ internal static CallStackItem[] ParseCallStack(string callStack) else { Debug.WriteLine(string.Format(CommonStrings.Runtime_InvalidCallStackLineFormat, line)); - return new CallStackItem[0]; + return []; } } diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index 86ee4a8..a53bbd9 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -187,9 +187,8 @@ public static MethodBase GetBestFitMethod(MethodBase[] methods, object[] argValu try { - for (int methodIndex = 0; methodIndex < methodCount; methodIndex++) + foreach (MethodBase method in methods) { - MethodBase method = methods[methodIndex]; ParameterInfo[] parameters = method.GetParameters(); ushort compatibilityScore; diff --git a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs index 19b15a7..482478c 100644 --- a/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TextHelpers.cs @@ -4,6 +4,7 @@ using AdvancedStringBuilder; using MsieJavaScriptEngine.Extensions; +using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.Helpers { @@ -15,7 +16,7 @@ internal static class TextHelpers /// /// Array of characters used to find the next line break /// - private static readonly char[] _nextLineBreakChars = new char[] { '\r', '\n' }; + private static readonly char[] _nextLineBreakChars = EnvironmentShortcuts.NewLineChars; /// diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index 2da4c5e..c3def15 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -283,7 +283,7 @@ private WrapperException WrapJsException(OriginalException originalException, string rawCallStack = messageWithTypeAndCallStack .TrimStart(messageWithType) .TrimStart("Error") - .TrimStart(new char[] { '\n', '\r' }) + .TrimStartNewLines() ; CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index a66d42e..96382ab 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -206,8 +206,7 @@ private EdgeEmbeddedObject CreateEmbeddedFunction(Delegate del) EdgeJsValue functionValue = EdgeJsValue.CreateFunction(nativeFunction); SetNonEnumerableProperty(functionValue, ExternalObjectPropertyName, objValue); - var embeddedObject = new EdgeEmbeddedObject(del, functionValue, - new List { nativeFunction }); + var embeddedObject = new EdgeEmbeddedObject(del, functionValue, [nativeFunction]); return embeddedObject; } @@ -466,7 +465,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) try { - result = property.GetValue(obj, new object[0]); + result = property.GetValue(obj, []); } catch (Exception e) { @@ -522,7 +521,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) try { - property.SetValue(obj, value, new object[0]); + property.SetValue(obj, value, []); } catch (Exception e) { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 732ba72..12b8009 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -315,7 +315,7 @@ private WrapperException WrapJsException(OriginalException originalException, string messageWithType = errorValue.ConvertToString().ToString(); string rawCallStack = messageWithTypeAndCallStack .TrimStart(messageWithType) - .TrimStart(new char[] { '\n', '\r' }) + .TrimStartNewLines() ; CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index a71027b..bc72c9a 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -206,8 +206,7 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del) IeJsValue functionValue = IeJsValue.CreateFunction(nativeFunction); SetNonEnumerableProperty(functionValue, ExternalObjectPropertyName, objValue); - var embeddedObject = new IeEmbeddedObject(del, functionValue, - new List { nativeFunction }); + var embeddedObject = new IeEmbeddedObject(del, functionValue, [nativeFunction]); return embeddedObject; } @@ -466,7 +465,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) try { - result = property.GetValue(obj, new object[0]); + result = property.GetValue(obj, []); } catch (Exception e) { @@ -522,7 +521,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) try { - property.SetValue(obj, value, new object[0]); + property.SetValue(obj, value, []); } catch (Exception e) { diff --git a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs index f75e256..9c2b530 100644 --- a/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/TypeMapper.cs @@ -234,7 +234,7 @@ protected Dictionary> GetAvailableMethodGroups(MethodIn int methodCount = methods.Length; if (methodCount == 0) { - return new Dictionary>(); + return []; } var availableMethodGroups = new Dictionary>(methodCount); @@ -256,7 +256,7 @@ protected Dictionary> GetAvailableMethodGroups(MethodIn } else { - methodGroup = new List { method }; + methodGroup = [method]; availableMethodGroups.Add(methodName, methodGroup); } } @@ -291,7 +291,7 @@ protected object[] GetHostItemMemberArguments(TValue[] args, int maxArgCount = - } else { - processedArgs = new object[0]; + processedArgs = []; } return processedArgs; diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 25bfee0..c61aa48 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -27,7 +27,8 @@ 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; 2. Added support for .NET Standard 2.1 and .NET 10; 3. Performed a migration to the modern C# null/not-null checks; -4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class. +4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class; +5. Reduced a memory allocation by using collection expressions. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Utilities/EnvironmentShortcuts.cs b/src/MsieJavaScriptEngine/Utilities/EnvironmentShortcuts.cs new file mode 100644 index 0000000..d637ce2 --- /dev/null +++ b/src/MsieJavaScriptEngine/Utilities/EnvironmentShortcuts.cs @@ -0,0 +1,15 @@ +using System; + +namespace MsieJavaScriptEngine.Utilities +{ + /// + /// Shortcuts for accessing to values that depend on the current environment and platform + /// + internal static class EnvironmentShortcuts + { + /// + /// Gets a array of the newline characters + /// + internal static readonly char[] NewLineChars = Environment.NewLine == "\r\n" ? ['\r', '\n'] : ['\n', '\r']; + } +} \ No newline at end of file diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 22709a9..1730427 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -25,7 +25,8 @@ 2. Added support for .NET Standard 2.1 and .NET 10; 3. Performed a migration to the modern C# null/not-null checks; 4. In the `lock` statements for .NET 10 target now uses a instances of the - `System.Threading.Lock` class. + `System.Threading.Lock` class; + 5. Reduced a memory allocation by using collection expressions. ============ PROJECT SITE From 9f725907cb6591fd1f3e2b164f13fa34e25a773b Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 10 Feb 2026 20:55:57 +0300 Subject: [PATCH 235/238] The value of a read-only field in an embedded object or type can no longer be changed --- .../ActiveScript/HostItemBase.cs | 54 ++++++------ .../JsRt/Edge/EdgeTypeMapper.cs | 83 ++++++++++--------- .../JsRt/Ie/IeTypeMapper.cs | 83 ++++++++++--------- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/readme.txt | 4 +- .../Interop/ObjectsEmbedding/SomeClassBase.cs | 8 +- .../Interop/Age.cs | 23 +++++ .../Interop/RuntimeConstants.cs | 8 ++ .../InteropTestsBase.cs | 57 +++++++++++++ 9 files changed, 209 insertions(+), 114 deletions(-) create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/Age.cs create mode 100644 test/MsieJavaScriptEngine.Test.Common/Interop/RuntimeConstants.cs diff --git a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs index f48d75b..1df3cf7 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/HostItemBase.cs @@ -190,22 +190,17 @@ private static MethodInfo[] GetAvailableMethods(MethodInfo[] methods, bool allow return availableMethods; } - private bool IsField(string name) + private FieldInfo GetField(string name) { - bool isField = false; - FieldInfo[] fields = _fields; - int fieldCount = fields.Length; - - for (int fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) + foreach (FieldInfo field in _fields) { - if (fields[fieldIndex].Name.Equals(name, StringComparison.Ordinal)) + if (field.Name.Equals(name, StringComparison.Ordinal)) { - isField = true; - break; + return field; } } - return isField; + return null; } protected abstract object InnerInvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, @@ -215,25 +210,34 @@ protected object InvokeStandardMember(string name, BindingFlags invokeAttr, Bind object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) { BindingFlags processedInvokeAttr = invokeAttr; - if ((processedInvokeAttr.HasFlag(BindingFlags.GetProperty) + if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty) || processedInvokeAttr.HasFlag(BindingFlags.SetProperty) || processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - && IsField(name)) { - if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) - { - processedInvokeAttr &= ~BindingFlags.GetProperty; - processedInvokeAttr |= BindingFlags.GetField; - } - else if (processedInvokeAttr.HasFlag(BindingFlags.SetProperty)) + FieldInfo field = GetField(name); + if (field is not null) { - processedInvokeAttr &= ~BindingFlags.SetProperty; - processedInvokeAttr |= BindingFlags.SetField; - } - else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) - { - processedInvokeAttr &= ~BindingFlags.PutDispProperty; - processedInvokeAttr |= BindingFlags.SetField; + if (processedInvokeAttr.HasFlag(BindingFlags.GetProperty)) + { + processedInvokeAttr &= ~BindingFlags.GetProperty; + processedInvokeAttr |= BindingFlags.GetField; + } + else if (processedInvokeAttr.HasFlag(BindingFlags.SetProperty)) + { + processedInvokeAttr &= ~BindingFlags.SetProperty; + processedInvokeAttr |= BindingFlags.SetField; + } + else if (processedInvokeAttr.HasFlag(BindingFlags.PutDispProperty)) + { + if (field.IsInitOnly) + { + // Prevents a setting of value to the read-only field + return null; + } + + processedInvokeAttr &= ~BindingFlags.PutDispProperty; + processedInvokeAttr |= BindingFlags.SetField; + } } } diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs index 96382ab..43fc4ac 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/EdgeTypeMapper.cs @@ -369,56 +369,59 @@ private void ProjectFields(EdgeEmbeddedItem externalItem) EdgeJsValue getMethodValue = EdgeJsValue.CreateFunction(nativeGetFunction); descriptorValue.SetProperty("get", getMethodValue, true); - EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + if (!field.IsInitOnly) { - EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - - if (instance && obj is null) + EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { - CreateAndSetTypeError(string.Format( - CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return undefinedValue; - } + EdgeJsValue undefinedValue = EdgeJsValue.Undefined; - object value = MapToHostType(args[1]); - ReflectionHelpers.FixFieldValueType(ref value, field); + if (instance && obj is null) + { + CreateAndSetTypeError(string.Format( + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return undefinedValue; + } - try - { - field.SetValue(obj, value); - } - catch (Exception e) - { - Exception exception = UnwrapException(e); - var wrapperException = exception as WrapperException; - EdgeJsValue errorValue; + object value = MapToHostType(args[1]); + ReflectionHelpers.FixFieldValueType(ref value, field); - if (wrapperException is not null) + try { - errorValue = CreateErrorFromWrapperException(wrapperException); + field.SetValue(obj, value); } - else + catch (Exception e) { - string errorMessage = instance ? - string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, - exception.Message) - : - string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, - exception.Message) - ; - errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + EdgeJsValue errorValue; + + if (wrapperException is not null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + exception.Message) + : + string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = EdgeJsErrorHelpers.CreateError(errorMessage); + } + EdgeJsContext.SetException(errorValue); + + return undefinedValue; } - EdgeJsContext.SetException(errorValue); return undefinedValue; - } - - return undefinedValue; - }; - nativeFunctions.Add(nativeSetFunction); + }; + nativeFunctions.Add(nativeSetFunction); - EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeSetFunction); - descriptorValue.SetProperty("set", setMethodValue, true); + EdgeJsValue setMethodValue = EdgeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + } typeValue.DefineProperty(fieldName, descriptorValue); } @@ -448,7 +451,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) EdgeJsValue descriptorValue = EdgeJsValue.CreateObject(); descriptorValue.SetProperty("enumerable", EdgeJsValue.True, true); - if (property.GetGetMethod() is not null) + if (property.CanRead) { EdgeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { @@ -503,7 +506,7 @@ private void ProjectProperties(EdgeEmbeddedItem externalItem) descriptorValue.SetProperty("get", getMethodValue, true); } - if (property.GetSetMethod() is not null) + if (property.CanWrite) { EdgeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs index bc72c9a..3bc9ce7 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/IeTypeMapper.cs @@ -369,56 +369,59 @@ private void ProjectFields(IeEmbeddedItem externalItem) IeJsValue getMethodValue = IeJsValue.CreateFunction(nativeGetFunction); descriptorValue.SetProperty("get", getMethodValue, true); - IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => + if (!field.IsInitOnly) { - IeJsValue undefinedValue = IeJsValue.Undefined; - - if (instance && obj is null) + IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { - CreateAndSetTypeError(string.Format( - CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); - return undefinedValue; - } + IeJsValue undefinedValue = IeJsValue.Undefined; - object value = MapToHostType(args[1]); - ReflectionHelpers.FixFieldValueType(ref value, field); + if (instance && obj is null) + { + CreateAndSetTypeError(string.Format( + CommonStrings.Runtime_InvalidThisContextForHostObjectField, fieldName)); + return undefinedValue; + } - try - { - field.SetValue(obj, value); - } - catch (Exception e) - { - Exception exception = UnwrapException(e); - var wrapperException = exception as WrapperException; - IeJsValue errorValue; + object value = MapToHostType(args[1]); + ReflectionHelpers.FixFieldValueType(ref value, field); - if (wrapperException is not null) + try { - errorValue = CreateErrorFromWrapperException(wrapperException); + field.SetValue(obj, value); } - else + catch (Exception e) { - string errorMessage = instance ? - string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, - exception.Message) - : - string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, - exception.Message) - ; - errorValue = IeJsErrorHelpers.CreateError(errorMessage); + Exception exception = UnwrapException(e); + var wrapperException = exception as WrapperException; + IeJsValue errorValue; + + if (wrapperException is not null) + { + errorValue = CreateErrorFromWrapperException(wrapperException); + } + else + { + string errorMessage = instance ? + string.Format(CommonStrings.Runtime_HostObjectFieldSettingFailed, fieldName, + exception.Message) + : + string.Format(CommonStrings.Runtime_HostTypeFieldSettingFailed, fieldName, typeName, + exception.Message) + ; + errorValue = IeJsErrorHelpers.CreateError(errorMessage); + } + IeJsContext.SetException(errorValue); + + return undefinedValue; } - IeJsContext.SetException(errorValue); return undefinedValue; - } - - return undefinedValue; - }; - nativeFunctions.Add(nativeSetFunction); + }; + nativeFunctions.Add(nativeSetFunction); - IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeSetFunction); - descriptorValue.SetProperty("set", setMethodValue, true); + IeJsValue setMethodValue = IeJsValue.CreateFunction(nativeSetFunction); + descriptorValue.SetProperty("set", setMethodValue, true); + } typeValue.DefineProperty(fieldName, descriptorValue); } @@ -448,7 +451,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) IeJsValue descriptorValue = IeJsValue.CreateObject(); descriptorValue.SetProperty("enumerable", IeJsValue.True, true); - if (property.GetGetMethod() is not null) + if (property.CanRead) { IeJsNativeFunction nativeGetFunction = (callee, isConstructCall, args, argCount, callbackData) => { @@ -503,7 +506,7 @@ private void ProjectProperties(IeEmbeddedItem externalItem) descriptorValue.SetProperty("get", getMethodValue, true); } - if (property.GetSetMethod() is not null) + if (property.CanWrite) { IeJsNativeFunction nativeSetFunction = (callee, isConstructCall, args, argCount, callbackData) => { diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index c61aa48..99131ed 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -28,7 +28,8 @@ 2. Added support for .NET Standard 2.1 and .NET 10; 3. Performed a migration to the modern C# null/not-null checks; 4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class; -5. Reduced a memory allocation by using collection expressions. +5. Reduced a memory allocation by using collection expressions; +6. The value of a read-only field in an embedded object or type can no longer be changed. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 1730427..b083c25 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -26,7 +26,9 @@ 3. Performed a migration to the modern C# null/not-null checks; 4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class; - 5. Reduced a memory allocation by using collection expressions. + 5. Reduced a memory allocation by using collection expressions; + 6. The value of a read-only field in an embedded object or type can no longer be + changed. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs index 6f78eb3..4a97f7d 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/Interop/ObjectsEmbedding/SomeClassBase.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding +namespace MsieJavaScriptEngine.Benchmarks.Interop.ObjectsEmbedding { public abstract class SomeClassBase { diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Age.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Age.cs new file mode 100644 index 0000000..e556902 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Age.cs @@ -0,0 +1,23 @@ +using System; + +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public struct Age + { + public readonly int Year; + + + public Age(int year) + { + Year = year; + } + + + public override string ToString() + { + int age = DateTime.Now.Year - Year; + + return age.ToString(); + } + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/RuntimeConstants.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/RuntimeConstants.cs new file mode 100644 index 0000000..e980209 --- /dev/null +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/RuntimeConstants.cs @@ -0,0 +1,8 @@ +namespace MsieJavaScriptEngine.Test.Common.Interop +{ + public static class RuntimeConstants + { + public static readonly int MinValue = 0; + public static readonly int MaxValue = 999; + } +} \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 8cbb90a..5deda68 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -57,6 +57,31 @@ public virtual void EmbeddingOfInstanceOfCustomValueTypeWithFields() Assert.AreEqual(targetOutput3, output3); } + [Test] + public virtual void EmbeddingOfInstanceOfCustomValueTypeWithReadonlyField() + { + // Arrange + var age = new Age(1979); + const string updateCode = "age.Year = 1982;"; + + const string input = "age.Year"; + const int targetOutput = 1979; + + // Act + int output; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostObject("age", age); + jsEngine.Execute(updateCode); + + output = jsEngine.Evaluate(input); + } + + // Assert + Assert.AreEqual(targetOutput, output); + } + [Test] public virtual void EmbeddingOfInstanceOfCustomReferenceTypeWithFields() { @@ -1241,6 +1266,38 @@ public virtual void EmbeddingOfCustomReferenceTypeWithField() Assert.AreEqual(targetOutput, output); } + [Test] + public virtual void EmbeddingOfCustomReferenceTypeWithReadonlyFields() + { + // Arrange + Type runtimeConstantsType = typeof(RuntimeConstants); + const string updateCode = @"RuntimeConstants.MinValue = 1; +RuntimeConstants.MaxValue = 100;"; + + const string input1 = "RuntimeConstants.MinValue"; + const int targetOutput1 = 0; + + const string input2 = "RuntimeConstants.MaxValue"; + const int targetOutput2 = 999; + + // Act + int output1; + int output2; + + using (var jsEngine = CreateJsEngine()) + { + jsEngine.EmbedHostType("RuntimeConstants", runtimeConstantsType); + jsEngine.Execute(updateCode); + + output1 = jsEngine.Evaluate(input1); + output2 = jsEngine.Evaluate(input2); + } + + // Assert + Assert.AreEqual(targetOutput1, output1); + Assert.AreEqual(targetOutput2, output2); + } + #endregion #region Types with properties From 7c18d7c883e4b2aa3de0437c1bfdf535d860b5fc Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Tue, 17 Feb 2026 17:08:57 +0300 Subject: [PATCH 236/238] Version 3.3.0 --- CHANGELOG.md | 8 ++++++++ Directory.Packages.props | 8 ++++++++ LICENSE.txt | 2 +- build/common.props | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 6 +++--- src/MsieJavaScriptEngine/readme.txt | 4 ++-- .../MsieJavaScriptEngine.Benchmarks.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.Auto.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.Classic.csproj | 5 +++-- .../MsieJavaScriptEngine.Test.Common.csproj | 9 +++++---- 13 files changed, 46 insertions(+), 23 deletions(-) create mode 100644 Directory.Packages.props diff --git a/CHANGELOG.md b/CHANGELOG.md index 27dd2aa..3c97012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ Change log ========== +## v3.3.0 - February 17, 2026 + * Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method + * Added support for .NET Standard 2.1 and .NET 10 + * Performed a migration to the modern C# null/not-null checks + * In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class + * Reduced a memory allocation by using collection expressions + * The value of a read-only field in an embedded object or type can no longer be changed + ## v3.2.5 - March 1, 2024 * Added a `README.md` file to NuGet package diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 0000000..7743622 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/LICENSE.txt b/LICENSE.txt index 6e8f77b..97d57b4 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ - Copyright (c) 2012-2024 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2026 Andrey Taritsyn - http://www.taritsyn.ru Apache License Version 2.0, January 2004 diff --git a/build/common.props b/build/common.props index e683307..758f6f8 100644 --- a/build/common.props +++ b/build/common.props @@ -1,6 +1,6 @@ - Copyright © 2012-2024 Andrey Taritsyn + Copyright © 2012-2026 Andrey Taritsyn false false 14.0 diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 99131ed..ca1e319 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.2.5 + 3.3.0 net40-client;net45;netstandard1.3;netstandard2.0;netstandard2.1;net10.0 1.6.0 Library @@ -40,12 +40,12 @@ - + - + diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index b083c25..b443c72 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,11 +1,11 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.2.5 + README file for MSIE JavaScript Engine for .NET v3.3.0 -------------------------------------------------------------------------------- - Copyright (c) 2012-2024 Andrey Taritsyn - http://www.taritsyn.ru + Copyright (c) 2012-2026 Andrey Taritsyn - http://www.taritsyn.ru =========== diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index a6a272c..45cdf6c 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,19 +2,20 @@ MSIE JavaScript Engine: Benchmarks - 3.2.5 + 3.3.0 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Exe true true false + true false - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 976682c..73a3e06 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.2.5 + 3.3.0 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true false + true true false @@ -14,7 +15,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 26cd17f..e87a2ac 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.2.5 + 3.3.0 net462 Library true false + true true false @@ -14,7 +15,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index d986717..595a8a1 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.2.5 + 3.3.0 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true false + true true false @@ -14,7 +15,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index e921469..b90af47 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.2.5 + 3.3.0 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true false + true true false @@ -14,7 +15,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 9ccbded..9b503b6 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.2.5 + 3.3.0 net462 Library true false + true true false @@ -14,7 +15,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 3412603..1875c45 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,11 +2,12 @@ MSIE JavaScript Engine: Common Tests - 3.2.5 + 3.3.0 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true false + true true false @@ -15,9 +16,9 @@ - - - + + + From 2c564a839cb14b5fb4e6dc3dfcb020e4517efeab Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 23 Feb 2026 18:00:56 +0300 Subject: [PATCH 237/238] Was made refactoring --- .../ActiveScript/ActiveScriptJsEngineBase.cs | 2 +- .../Extensions/StringExtensions.cs | 28 ++------ .../Helpers/JsErrorHelpers.cs | 67 ++++++++++++++----- .../Helpers/ReflectionHelpers.cs | 8 +-- .../Helpers/ValidationHelpers.cs | 4 +- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 9 +-- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 8 +-- .../MsieJavaScriptEngine.csproj | 7 +- .../Utilities/TypeConverter.cs | 4 +- src/MsieJavaScriptEngine/readme.txt | 9 +-- .../Interop/Date.cs | 4 +- .../InteropTestsBase.cs | 2 +- .../PrecompilationTestsBase.cs | 16 ++--- 13 files changed, 85 insertions(+), 83 deletions(-) diff --git a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs index 3489b5b..fbb4e44 100644 --- a/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/ActiveScript/ActiveScriptJsEngineBase.cs @@ -498,7 +498,7 @@ private object InnerGetVariableValue(string variableName) /// Value of variable protected void InnerSetVariableValue(string variableName, object value) { - object[] args = { value }; + object[] args = [value]; try { diff --git a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs index fde2bf8..ad006d1 100644 --- a/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs +++ b/src/MsieJavaScriptEngine/Extensions/StringExtensions.cs @@ -1,7 +1,5 @@ using System; -using MsieJavaScriptEngine.Utilities; - namespace MsieJavaScriptEngine.Extensions { /// @@ -70,25 +68,6 @@ public static string TrimStart(this string source, string trimString) return result; } - - /// - /// Removes all leading newline characters from the current object - /// - /// String value - /// The string that remains after all newline characters are removed from the start of - /// the current string. If no characters can be trimmed from the current instance, the method returns - /// the current instance unchanged. - public static string TrimStartNewLines(this string source) - { - if (source is null) - { - throw new ArgumentNullException(nameof(source)); - } - - string result = source.TrimStart(EnvironmentShortcuts.NewLineChars); - - return result; - } #if NETFRAMEWORK /// @@ -133,15 +112,18 @@ public static string CapitalizeFirstLetter(this string source) /// Splits a string into lines /// /// Instance of + /// to omit empty array + /// elements from the array returned; or to include empty + /// array elements in the array returned /// An array of lines - public static string[] SplitToLines(this string source) + public static string[] SplitToLines(this string source, StringSplitOptions options) { if (source is null) { throw new ArgumentNullException(nameof(source)); } - string[] result = source.Split(_newLineStrings, StringSplitOptions.None); + string[] result = source.Split(_newLineStrings, options); return result; } diff --git a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs index 72b7477..27fbf26 100644 --- a/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/JsErrorHelpers.cs @@ -9,6 +9,7 @@ using MsieJavaScriptEngine.Extensions; using MsieJavaScriptEngine.Resources; +using MsieJavaScriptEngine.Utilities; namespace MsieJavaScriptEngine.Helpers { @@ -28,6 +29,33 @@ public static class JsErrorHelpers @"\((?" + CommonRegExps.DocumentNamePattern + @"):" + @"(?\d+):(?\d+)\)$"); + + /// + /// Gets a string representation of the script call stack + /// + /// Error message with the script call stack + /// Error message without the script call stack + /// String representation of the script call stack + internal static string GetCallStackFromMessage(string message, string messageWithoutCallStack) + { + if (string.IsNullOrWhiteSpace(message)) + { + return string.Empty; + } + + if (string.IsNullOrWhiteSpace(messageWithoutCallStack)) + { + return message; + } + + string callStack = message + .TrimStart(messageWithoutCallStack) + .TrimStart(EnvironmentShortcuts.NewLineChars) + ; + + return callStack; + } + /// /// Parses a string representation of the script call stack to produce an array of /// instances @@ -41,26 +69,15 @@ internal static CallStackItem[] ParseCallStack(string callStack) return []; } - string[] lines = callStack.SplitToLines(); + string[] lines = callStack.SplitToLines(StringSplitOptions.RemoveEmptyEntries); int lineCount = lines.Length; var callStackItems = new List(lineCount); - for (int lineIndex = 0; lineIndex < lineCount; lineIndex++) + foreach (string line in lines) { - string line = lines[lineIndex]; - Match lineMatch = _callStackLineRegex.Match(line); - - if (lineMatch.Success) + CallStackItem callStackItem = MapCallStackItem(line); + if (callStackItem is not null) { - GroupCollection lineGroups = lineMatch.Groups; - - var callStackItem = new CallStackItem - { - FunctionName = lineGroups["functionName"].Value, - DocumentName = lineGroups["documentName"].Value, - LineNumber = int.Parse(lineGroups["lineNumber"].Value), - ColumnNumber = int.Parse(lineGroups["columnNumber"].Value) - }; callStackItems.Add(callStackItem); } else @@ -73,6 +90,26 @@ internal static CallStackItem[] ParseCallStack(string callStack) return callStackItems.ToArray(); } + private static CallStackItem MapCallStackItem(string callStackLine) + { + CallStackItem item = null; + Match lineMatch = _callStackLineRegex.Match(callStackLine); + + if (lineMatch.Success) + { + GroupCollection lineGroups = lineMatch.Groups; + item = new CallStackItem + { + FunctionName = lineGroups["functionName"].Value, + DocumentName = lineGroups["documentName"].Value, + LineNumber = int.Parse(lineGroups["lineNumber"].Value), + ColumnNumber = int.Parse(lineGroups["columnNumber"].Value) + }; + } + + return item; + } + /// /// Produces a string representation of the script call stack from array of /// instances diff --git a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs index a53bbd9..c4cb41a 100644 --- a/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ReflectionHelpers.cs @@ -20,16 +20,16 @@ namespace MsieJavaScriptEngine.Helpers internal static class ReflectionHelpers { private static readonly PropertyInfo[] _disallowedProperties = - { + [ typeof(Delegate).GetProperty("Method"), typeof(Exception).GetProperty("TargetSite") - }; + ]; private static readonly MethodInfo[] _disallowedMethods = - { + [ typeof(object).GetMethod("GetType"), typeof(Exception).GetMethod("GetType") - }; + ]; public static BindingFlags GetDefaultBindingFlags(bool instance) diff --git a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs index 7098a15..eacf30f 100644 --- a/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/ValidationHelpers.cs @@ -15,9 +15,9 @@ public static class ValidationHelpers /// List of supported types /// private static readonly Type[] _supportedTypes = - { + [ typeof(Undefined), typeof(Boolean), typeof(Int32), typeof(Double), typeof(String) - }; + ]; /// /// Regular expression for working with JS names diff --git a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs index c3def15..4f0b1c2 100644 --- a/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Edge/ChakraEdgeJsRtJsEngine.cs @@ -280,13 +280,10 @@ private WrapperException WrapJsException(OriginalException originalException, string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? stackPropertyValue.ToString() : string.Empty; string messageWithType = errorValue.ConvertToString().ToString(); - string rawCallStack = messageWithTypeAndCallStack - .TrimStart(messageWithType) - .TrimStart("Error") - .TrimStartNewLines() - ; - + string rawCallStack = JsErrorHelpers.GetCallStackFromMessage( + messageWithTypeAndCallStack, messageWithType); CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + if (callStackItems.Length > 0) { CallStackItem firstCallStackItem = callStackItems[0]; diff --git a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs index 12b8009..29c337f 100644 --- a/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs +++ b/src/MsieJavaScriptEngine/JsRt/Ie/ChakraIeJsRtJsEngine.cs @@ -313,12 +313,10 @@ private WrapperException WrapJsException(OriginalException originalException, string messageWithTypeAndCallStack = stackPropertyValue.ValueType == JsValueType.String ? stackPropertyValue.ToString() : string.Empty; string messageWithType = errorValue.ConvertToString().ToString(); - string rawCallStack = messageWithTypeAndCallStack - .TrimStart(messageWithType) - .TrimStartNewLines() - ; - + string rawCallStack = JsErrorHelpers.GetCallStackFromMessage( + messageWithTypeAndCallStack, messageWithType); CallStackItem[] callStackItems = JsErrorHelpers.ParseCallStack(rawCallStack); + if (callStackItems.Length > 0) { FixCallStackItems(callStackItems); diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index ca1e319..21c4a42 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -24,12 +24,7 @@ true snupkg JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; -2. Added support for .NET Standard 2.1 and .NET 10; -3. Performed a migration to the modern C# null/not-null checks; -4. In the `lock` statements for .NET 10 target now uses a instances of the `System.Threading.Lock` class; -5. Reduced a memory allocation by using collection expressions; -6. The value of a read-only field in an embedded object or type can no longer be changed. + Was made refactoring. en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs index 9ecfe10..115a8fd 100644 --- a/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs +++ b/src/MsieJavaScriptEngine/Utilities/TypeConverter.cs @@ -24,13 +24,13 @@ public static class TypeConverter /// List of primitive type codes /// private static readonly TypeCode[] _primitiveTypeCodes = - { + [ TypeCode.Boolean, TypeCode.SByte, TypeCode.Byte, TypeCode.Int16, TypeCode.UInt16, TypeCode.Int32, TypeCode.UInt32, TypeCode.Int64, TypeCode.UInt64, TypeCode.Single, TypeCode.Double, TypeCode.Decimal, TypeCode.Char, TypeCode.String - }; + ]; /// /// Converts the specified value to the specified type diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index b443c72..1e50e30 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,14 +21,7 @@ ============= RELEASE NOTES ============= - 1. Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method; - 2. Added support for .NET Standard 2.1 and .NET 10; - 3. Performed a migration to the modern C# null/not-null checks; - 4. In the `lock` statements for .NET 10 target now uses a instances of the - `System.Threading.Lock` class; - 5. Reduced a memory allocation by using collection expressions; - 6. The value of a read-only field in an embedded object or type can no longer be - changed. + Was made refactoring. ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs index 82302fa..cb92094 100644 --- a/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs +++ b/test/MsieJavaScriptEngine.Test.Common/Interop/Date.cs @@ -4,8 +4,8 @@ namespace MsieJavaScriptEngine.Test.Common.Interop { public struct Date { - private static readonly int[] _cumulativeDays = { 0, 31, 59, 90, 120, 151, 181, - 212, 243, 273, 304, 334 }; + private static readonly int[] _cumulativeDays = [0, 31, 59, 90, 120, 151, 181, + 212, 243, 273, 304, 334]; public int Year; public int Month; diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 5deda68..883ac04 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -1331,7 +1331,7 @@ public virtual void EmbeddingOfBuiltinReferenceTypeWithProperty() Type environmentType = typeof(Environment); const string input = "Environment.NewLine"; - string[] targetOutput = { "\r", "\r\n", "\n", "\n\r" }; + string[] targetOutput = ["\r", "\r\n", "\n", "\n\r"]; // Act string output; diff --git a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs index 772e218..c6f5186 100644 --- a/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/PrecompilationTestsBase.cs @@ -41,8 +41,8 @@ function declinationOfSeconds(number) { const string functionName = "declinationOfSeconds"; const int itemCount = 4; - int[] inputSeconds = new int[itemCount] { 0, 1, 42, 600 }; - string[] targetOutputStrings = new string[itemCount] { "секунд", "секунда", "секунды", "секунд" }; + int[] inputSeconds = [0, 1, 42, 600]; + string[] targetOutputStrings = ["секунд", "секунда", "секунды", "секунд"]; string[] outputStrings = new string[itemCount]; // Act @@ -91,8 +91,8 @@ public virtual void ExecutionOfPrecompiledFile() const string functionName = "declinationOfMinutes"; const int itemCount = 4; - int[] inputMinutes = new int[itemCount] { 0, 1, 22, 88 }; - string[] targetOutputStrings = new string[itemCount] { "минут", "минута", "минуты", "минут" }; + int[] inputMinutes = [0, 1, 22, 88]; + string[] targetOutputStrings = ["минут", "минута", "минуты", "минут"]; string[] outputStrings = new string[itemCount]; // Act @@ -141,8 +141,8 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndType() const string functionName = "declinationOfHours"; const int itemCount = 4; - int[] inputHours = new int[itemCount] { 0, 1, 24, 48 }; - string[] targetOutputStrings = new string[itemCount] { "часов", "час", "часа", "часов" }; + int[] inputHours = [0, 1, 24, 48]; + string[] targetOutputStrings = ["часов", "час", "часа", "часов"]; string[] outputStrings = new string[itemCount]; // Act @@ -191,8 +191,8 @@ public virtual void ExecutionOfPrecompiledResourceByNameAndAssembly() const string functionName = "declinationOfDays"; const int itemCount = 4; - int[] inputDays = new int[itemCount] { 0, 1, 3, 80 }; - string[] targetOutputStrings = new string[itemCount] { "дней", "день", "дня", "дней" }; + int[] inputDays = [0, 1, 3, 80]; + string[] targetOutputStrings = ["дней", "день", "дня", "дней"]; string[] outputStrings = new string[itemCount]; // Act From 4e89c4a94ec934240ed9401c88799d4f15b01e9a Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Mon, 23 Feb 2026 18:15:40 +0300 Subject: [PATCH 238/238] Version 3.3.1 --- CHANGELOG.md | 3 +++ Licenses/uglify-js-license.txt | 2 +- src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/package.json | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 12 files changed, 14 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c97012..cabeb69 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.3.1 - February 23, 2026 + * Was made refactoring + ## v3.3.0 - February 17, 2026 * Optimized a memory usage in the `ReflectionHelpers.GetBestFitMethod` method * Added support for .NET Standard 2.1 and .NET 10 diff --git a/Licenses/uglify-js-license.txt b/Licenses/uglify-js-license.txt index 87a0854..d206cc7 100644 --- a/Licenses/uglify-js-license.txt +++ b/Licenses/uglify-js-license.txt @@ -1,6 +1,6 @@ UglifyJS is released under the BSD license: -Copyright 2012-2019 (c) Mihai Bazon +Copyright 2012-2024 (c) Mihai Bazon Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 21c4a42..056da0a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.3.0 + 3.3.1 net40-client;net45;netstandard1.3;netstandard2.0;netstandard2.1;net10.0 1.6.0 Library diff --git a/src/MsieJavaScriptEngine/package.json b/src/MsieJavaScriptEngine/package.json index 2d65043..81299ea 100644 --- a/src/MsieJavaScriptEngine/package.json +++ b/src/MsieJavaScriptEngine/package.json @@ -1,6 +1,6 @@ { "name": "MsieJavaScriptEngine", - "version": "3.2.5", + "version": "3.3.1", "devDependencies": { "uglify-js": "3.16.1" }, diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 1e50e30..8bc9a4d 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.3.0 + README file for MSIE JavaScript Engine for .NET v3.3.1 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 45cdf6c..8bdafcd 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.3.0 + 3.3.1 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 73a3e06..78a1dc8 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.3.0 + 3.3.1 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index e87a2ac..2eef93d 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.3.0 + 3.3.1 net462 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 595a8a1..9863359 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.3.0 + 3.3.1 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index b90af47..5e08321 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.3.0 + 3.3.1 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 9b503b6..585b50e 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.3.0 + 3.3.1 net462 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 1875c45..56c9455 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.3.0 + 3.3.1 net462;netcoreapp3.1;net5.0;net6.0;net7.0;net8.0;net9.0;net10.0 Library true

    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�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 - - - $(MSBuildProjectDirectory)\..\ - - - false - - - false - - - true - - - false - - - - - - - - - - - $([System.IO.Path]::Combine($(SolutionDir), ".nuget")) - - - - - $(SolutionDir).nuget - - - - $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName.Replace(' ', '_')).config - $(MSBuildProjectDirectory)\packages.$(MSBuildProjectName).config - - - - $(MSBuildProjectDirectory)\packages.config - $(PackagesProjectConfig) - - - - - $(NuGetToolsPath)\NuGet.exe - @(PackageSource) - - "$(NuGetExePath)" - mono --runtime=v4.0.30319 $(NuGetExePath) - - $(TargetDir.Trim('\\')) - - -RequireConsent - -NonInteractive - - "$(SolutionDir) " - "$(SolutionDir)" - - - $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(NonInteractiveSwitch) $(RequireConsentSwitch) -solutionDir $(PaddedSolutionDir) - $(NuGetCommand) pack "$(ProjectPath)" -Properties "Configuration=$(Configuration);Platform=$(Platform)" $(NonInteractiveSwitch) -OutputDirectory "$(PackageOutputDir)" -symbols - - - - RestorePackages; - $(BuildDependsOn); - - - - - $(BuildDependsOn); - BuildPackage; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/MsieJavaScriptEngine.sln b/MsieJavaScriptEngine.sln index 5ede8f0..b0d2432 100644 --- a/MsieJavaScriptEngine.sln +++ b/MsieJavaScriptEngine.sln @@ -16,9 +16,32 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SharedFiles", "SharedFiles" test\SharedFiles\square.js = test\SharedFiles\square.js EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "recursiveEvaluation", "recursiveEvaluation", "{BEEE3756-112D-4D3B-AE72-8F973ABC9522}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "noError", "noError", "{A2F0B579-9EA7-4DB3-AC75-746D84A067C1}" + ProjectSection(SolutionItems) = preProject + test\SharedFiles\recursiveEvaluation\noError\index.js = test\SharedFiles\recursiveEvaluation\noError\index.js + test\SharedFiles\recursiveEvaluation\noError\math.js = test\SharedFiles\recursiveEvaluation\noError\math.js + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "runtimeError", "runtimeError", "{DE2AB601-AA34-4451-8729-EAE16B737673}" + ProjectSection(SolutionItems) = preProject + test\SharedFiles\recursiveEvaluation\runtimeError\index.js = test\SharedFiles\recursiveEvaluation\runtimeError\index.js + test\SharedFiles\recursiveEvaluation\runtimeError\math.js = test\SharedFiles\recursiveEvaluation\runtimeError\math.js + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "recursiveExecution", "recursiveExecution", "{6A8412E2-4DF8-4248-BB54-DC823BB11906}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "noError", "noError", "{06BFE84E-3448-4A01-94F1-4F496D8B3AAB}" + ProjectSection(SolutionItems) = preProject + test\SharedFiles\recursiveExecution\noError\firstFile.js = test\SharedFiles\recursiveExecution\noError\firstFile.js + test\SharedFiles\recursiveExecution\noError\mainFile.js = test\SharedFiles\recursiveExecution\noError\mainFile.js + test\SharedFiles\recursiveExecution\noError\secondFile.js = test\SharedFiles\recursiveExecution\noError\secondFile.js + EndProjectSection +EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine", "src\MsieJavaScriptEngine\MsieJavaScriptEngine.csproj", "{3C9CD486-50AD-476E-9515-3F85EBAFCC38}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MsieJavaScriptEngine.Benchmarks", "test\MsieJavaScriptEngine.Benchmarks\MsieJavaScriptEngine.Benchmarks.csproj", "{A304B8BE-B946-453B-B2B5-D21305A299F8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Benchmarks", "test\MsieJavaScriptEngine.Benchmarks\MsieJavaScriptEngine.Benchmarks.csproj", "{A304B8BE-B946-453B-B2B5-D21305A299F8}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Common", "test\MsieJavaScriptEngine.Test.Common\MsieJavaScriptEngine.Test.Common.csproj", "{6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}" EndProject @@ -32,6 +55,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.C EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MsieJavaScriptEngine.Test.Classic", "test\MsieJavaScriptEngine.Test.Classic\MsieJavaScriptEngine.Test.Classic.csproj", "{72233C70-DF61-449F-8D53-D456284CDA5D}" EndProject + Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -42,6 +66,10 @@ Global {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Release|Any CPU.ActiveCfg = Release|Any CPU {3C9CD486-50AD-476E-9515-3F85EBAFCC38}.Release|Any CPU.Build.0 = Release|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.Build.0 = Release|Any CPU {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Debug|Any CPU.Build.0 = Debug|Any CPU {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -66,10 +94,6 @@ Global {72233C70-DF61-449F-8D53-D456284CDA5D}.Debug|Any CPU.Build.0 = Debug|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.ActiveCfg = Release|Any CPU {72233C70-DF61-449F-8D53-D456284CDA5D}.Release|Any CPU.Build.0 = Release|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A304B8BE-B946-453B-B2B5-D21305A299F8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -77,13 +101,18 @@ Global GlobalSection(NestedProjects) = preSolution {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {3C9CD486-50AD-476E-9515-3F85EBAFCC38} = {262F5A48-E8AC-41F1-9FC6-4DA3785CCD93} + {A304B8BE-B946-453B-B2B5-D21305A299F8} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {6E4AF7B9-3257-4D35-8F5C-CBA1A7158CAB} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {3DD423C5-DC32-42D4-9924-B5D8C2F23195} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {56218CBF-F251-4A3A-A50F-7C3FCC9258F6} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {5864D57D-2EB8-4684-9908-26111127E75B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {EF54F02A-7ECD-4D3E-9163-33BCA969FD1B} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} {72233C70-DF61-449F-8D53-D456284CDA5D} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} - {A304B8BE-B946-453B-B2B5-D21305A299F8} = {1F9B41F3-53ED-4254-98B7-F4309EA0D53E} + {BEEE3756-112D-4D3B-AE72-8F973ABC9522} = {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} + {A2F0B579-9EA7-4DB3-AC75-746D84A067C1} = {BEEE3756-112D-4D3B-AE72-8F973ABC9522} + {DE2AB601-AA34-4451-8729-EAE16B737673} = {BEEE3756-112D-4D3B-AE72-8F973ABC9522} + {6A8412E2-4DF8-4248-BB54-DC823BB11906} = {E3F8640B-91D8-4BBE-B807-D69D1DE0D818} + {06BFE84E-3448-4A01-94F1-4F496D8B3AAB} = {6A8412E2-4DF8-4248-BB54-DC823BB11906} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {5035D2B6-B7C8-4A7F-8764-07B60AD66E96} diff --git a/run-dotnet-tests.cmd b/run-dotnet-tests.cmd deleted file mode 100644 index 38521bc..0000000 --- a/run-dotnet-tests.cmd +++ /dev/null @@ -1,55 +0,0 @@ -@echo off -setlocal - -set common_test_project_name=MsieJavaScriptEngine.Test.Common -set auto_test_project_name=MsieJavaScriptEngine.Test.Auto -set chakra_edge_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraEdgeJsRt -set chakra_ie_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraIeJsRt -set chakra_activescript_test_project_name=MsieJavaScriptEngine.Test.ChakraActiveScript -set classic_test_project_name=MsieJavaScriptEngine.Test.Classic - -set common-args=--configuration Release --no-build --verbosity minimal -set test_dir_path=test -set common_test_project_file_path=%test_dir_path%\%common_test_project_name%\%common_test_project_name%.csproj -set auto_test_project_file_path=%test_dir_path%\%auto_test_project_name%\%auto_test_project_name%.csproj -set chakra_edge_jsrt_test_project_file_path=%test_dir_path%\%chakra_edge_jsrt_test_project_name%\%chakra_edge_jsrt_test_project_name%.csproj -set chakra_ie_jsrt_test_project_file_path=%test_dir_path%\%chakra_ie_jsrt_test_project_name%\%chakra_ie_jsrt_test_project_name%.csproj -set chakra_activescript_test_project_file_path=%test_dir_path%\%chakra_activescript_test_project_name%\%chakra_activescript_test_project_name%.csproj -set classic_test_project_file_path=%test_dir_path%\%classic_test_project_name%\%classic_test_project_name%.csproj - -@echo Run unit tests for DotNet version... -@echo. - -dotnet test --framework net451 %common-args% "%common_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp1.0 %common-args% "%common_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp2.0 %common-args% "%common_test_project_file_path%" -@echo. - -dotnet test --framework net451 %common-args% "%auto_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp1.0 %common-args% "%auto_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp2.0 %common-args% "%auto_test_project_file_path%" -@echo. - -dotnet test --framework net451 %common-args% "%chakra_edge_jsrt_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp1.0 %common-args% "%chakra_edge_jsrt_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp2.0 %common-args% "%chakra_edge_jsrt_test_project_file_path%" -@echo. - -dotnet test --framework net451 %common-args% "%chakra_ie_jsrt_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp1.0 %common-args% "%chakra_ie_jsrt_test_project_file_path%" -@echo. -dotnet test --framework netcoreapp2.0 %common-args% "%chakra_ie_jsrt_test_project_file_path%" -@echo. - -dotnet test --framework net451 %common-args% "%chakra_activescript_test_project_file_path%" -@echo. - -dotnet test --framework net451 %common-args% "%classic_test_project_file_path%" -@echo. \ No newline at end of file diff --git a/run-net4-tests.cmd b/run-net4-tests.cmd deleted file mode 100644 index c770d3c..0000000 --- a/run-net4-tests.cmd +++ /dev/null @@ -1,14 +0,0 @@ -@echo off -setlocal - -set local_nuget_package_manager=.nuget\NuGet.exe -set package_dir=packages -set nunit_console_path=%package_dir%\NUnit.ConsoleRunner\tools\nunit3-console.exe - -if not exist %package_dir%\NUnit.Console ( - %local_nuget_package_manager% install NUnit.Console -Version 3.7.0 -O %package_dir% -ExcludeVersion -NoCache -) - -@echo Run unit tests for .NET 4.0 version... -@echo. -%nunit_console_path% test\MsieJavaScriptEngine.Test.Net4.nunit --process=Multiple --domain=Single --work=test\ --noheader --trace=Off \ No newline at end of file diff --git a/run-tests.cmd b/run-tests.cmd new file mode 100644 index 0000000..d9818c7 --- /dev/null +++ b/run-tests.cmd @@ -0,0 +1,39 @@ +@echo off +setlocal + +set common_test_project_name=MsieJavaScriptEngine.Test.Common +set auto_test_project_name=MsieJavaScriptEngine.Test.Auto +set chakra_edge_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraEdgeJsRt +set chakra_ie_jsrt_test_project_name=MsieJavaScriptEngine.Test.ChakraIeJsRt +set chakra_activescript_test_project_name=MsieJavaScriptEngine.Test.ChakraActiveScript +set classic_test_project_name=MsieJavaScriptEngine.Test.Classic + +set common-args=%* +set test_dir_path=test +set common_test_project_file_path=%test_dir_path%\%common_test_project_name%\%common_test_project_name%.csproj +set auto_test_project_file_path=%test_dir_path%\%auto_test_project_name%\%auto_test_project_name%.csproj +set chakra_edge_jsrt_test_project_file_path=%test_dir_path%\%chakra_edge_jsrt_test_project_name%\%chakra_edge_jsrt_test_project_name%.csproj +set chakra_ie_jsrt_test_project_file_path=%test_dir_path%\%chakra_ie_jsrt_test_project_name%\%chakra_ie_jsrt_test_project_name%.csproj +set chakra_activescript_test_project_file_path=%test_dir_path%\%chakra_activescript_test_project_name%\%chakra_activescript_test_project_name%.csproj +set classic_test_project_file_path=%test_dir_path%\%classic_test_project_name%\%classic_test_project_name%.csproj + +@echo Run unit tests... +@echo. + +dotnet test %common-args% "%common_test_project_file_path%" +@echo. + +dotnet test %common-args% "%auto_test_project_file_path%" +@echo. + +dotnet test %common-args% "%chakra_edge_jsrt_test_project_file_path%" +@echo. + +dotnet test %common-args% "%chakra_ie_jsrt_test_project_file_path%" +@echo. + +dotnet test %common-args% "%chakra_activescript_test_project_file_path%" +@echo. + +dotnet test %common-args% "%classic_test_project_file_path%" +@echo. \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs index 875ad93..b0a91df 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/HostObjectsEmbeddingBenchmark.cs @@ -89,7 +89,7 @@ private static void EmbedAndUseHostObjects(Func createJsEngine) Assert.Equal(targetOutput, output); Assert.Equal(targetLogOutput, logOutput); } -#if NET46 +#if NET461 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs index e53b338..a53ba9a 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/HostTypesEmbeddingBenchmark.cs @@ -69,7 +69,7 @@ private static void EmbedAndUseHostTypes(Func createJsEngine) // Assert Assert.Equal(targetOutput, output); } -#if NET46 +#if NET461 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs index 5d18a1b..75f135f 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs +++ b/test/MsieJavaScriptEngine.Benchmarks/JsExecutionBenchmark.cs @@ -182,7 +182,7 @@ private static void TransliterateStrings(Func createJsEngine, bool Assert.Equal(_targetOutputStrings[itemIndex], outputStrings[itemIndex]); } } -#if NET46 +#if NET461 [Benchmark] public void Classic() diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index 6caf041..be5091a 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -3,7 +3,7 @@ MSIE JavaScript Engine: Benchmarks 3.0.2 - net46;netcoreapp2.0 + net461;netcoreapp2.0 Exe true false @@ -12,7 +12,7 @@ - + diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index 346ac29..de67f13 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.14 + 1.0.15 Library true true @@ -14,15 +14,9 @@ - - - - - - + - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 547da6f..758b1a7 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -13,15 +13,9 @@ - - - - - - + - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 98d2939..58ac2ca 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.14 + 1.0.15 Library true true @@ -14,15 +14,9 @@ - - - - - - + - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index f79efe9..42d9add 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.14 + 1.0.15 Library true true @@ -14,15 +14,9 @@ - - - - - - + - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index 31b1d5d..bd52b2f 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -13,15 +13,9 @@ - - - - - - + - - + \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs index febdb21..2f5ef07 100644 --- a/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/FileSystemTestsBase.cs @@ -29,12 +29,7 @@ protected FileSystemTestsBase() _baseDirectoryPath = Path.Combine(appEnv.ApplicationBasePath, "../../../../"); #elif NET40 string baseDirectoryPath = AppDomain.CurrentDomain.BaseDirectory; - if (_binDirRegex.IsMatch(baseDirectoryPath)) - { - baseDirectoryPath = Path.Combine(baseDirectoryPath, "../../../"); - } - - _baseDirectoryPath = baseDirectoryPath; + _baseDirectoryPath = Path.Combine(baseDirectoryPath, "../../../../"); #else #error No implementation for this target #endif diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 54eaeb4..141645b 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Common Tests 3.0.2 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.14 + 1.0.15 Library true true @@ -15,7 +15,9 @@ + + @@ -24,11 +26,6 @@ - - - - - @@ -41,8 +38,4 @@ - - - - \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Net4.nunit b/test/MsieJavaScriptEngine.Test.Net4.nunit deleted file mode 100644 index 795f9c4..0000000 --- a/test/MsieJavaScriptEngine.Test.Net4.nunit +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file From a51f990d8b56354f607ca07dc170058bee527a00 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 28 Apr 2019 20:59:42 +0300 Subject: [PATCH 177/238] In version for .NET Framework was fixed a error that occurred during the recursive execution and evaluation of JS files --- .../Helpers/TypeMappingHelpers.cs | 3 +- .../MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 4 +- .../InteropTests.cs | 61 ++++++++++++++++++- .../InteropTests.cs | 8 +-- .../InteropTests.cs | 8 +-- .../InteropTests.cs | 61 ++++++++++++++++++- .../InteropTestsBase.cs | 2 - 8 files changed, 131 insertions(+), 18 deletions(-) diff --git a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs index 9d788fd..f5baeca 100644 --- a/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs +++ b/src/MsieJavaScriptEngine/Helpers/TypeMappingHelpers.cs @@ -29,7 +29,8 @@ public static object MapToScriptType(object value, JsEngineMode engineMode) return null; } - if (TypeConverter.IsPrimitiveType(value.GetType())) + Type type = value.GetType(); + if (TypeConverter.IsPrimitiveType(type) || type.FullName == "System.__ComObject") { return value; } diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index de53041..425668a 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -21,7 +21,7 @@ https://github.com/Taritsyn/MsieJavaScriptEngine git JavaScript;ECMAScript;MSIE;IE;Edge;Chakra - In version for .NET Core was fixed a error that occurred during the recursive execution and evaluation of JS files. + Fixed a error that occurred during the recursive execution and evaluation of JS files (while without correct handling of host exceptions). en-US ../../nuget true diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index 3243aba..ea3ca57 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -21,8 +21,8 @@ ============= RELEASE NOTES ============= - In version for .NET Core was fixed a error that occurred during the recursive - execution and evaluation of JS files. + Fixed a error that occurred during the recursive execution and evaluation of JS + files (while without correct handling of host exceptions). ============ PROJECT SITE diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs index 04efaa8..27b4b4c 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/InteropTests.cs @@ -1,4 +1,7 @@ -using NUnit.Framework; +using System; +using System.IO; + +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -8,5 +11,61 @@ namespace MsieJavaScriptEngine.Test.ChakraActiveScript public class InteropTests : InteropTestsBase { protected override JsEngineMode EngineMode => JsEngineMode.ChakraActiveScript; + + + #region Embedding of objects + + #region Recursive calls + + #region Mapping of errors + + [Test] + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); + const string input = "require('index').calculateResult();"; + + // Act + JsRuntimeException exception = null; + + using (var jsEngine = CreateJsEngine()) + { + try + { + Func loadModule = path => { + string absolutePath = Path.Combine(directoryPath, $"{path}.js"); + string code = File.ReadAllText(absolutePath); + object result = jsEngine.Evaluate(code, absolutePath); + + return result; + }; + + jsEngine.EmbedHostObject("require", loadModule); + double output = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'argumens' is undefined", exception.Description); + Assert.AreEqual("ReferenceError", exception.Type); + Assert.AreEqual("math.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); + } + + #endregion + + #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs index d34fea3..f320f37 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/InteropTests.cs @@ -1,8 +1,6 @@ -#if NETCOREAPP -using System; +using System; using System.IO; -#endif using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -13,10 +11,10 @@ namespace MsieJavaScriptEngine.Test.ChakraEdgeJsRt public class InteropTests : InteropTestsBase { protected override JsEngineMode EngineMode => JsEngineMode.ChakraEdgeJsRt; -#if NETCOREAPP #region Embedding of objects +#if NETCOREAPP #region Delegates @@ -42,6 +40,7 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() } #endregion +#endif #region Recursive calls @@ -100,6 +99,5 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() #endregion #endregion -#endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs index 0f23fd3..62577e3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/InteropTests.cs @@ -1,8 +1,6 @@ -#if NETCOREAPP -using System; +using System; using System.IO; -#endif using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -13,10 +11,10 @@ namespace MsieJavaScriptEngine.Test.ChakraIeJsRt public class InteropTests : InteropTestsBase { protected override JsEngineMode EngineMode => JsEngineMode.ChakraIeJsRt; -#if NETCOREAPP #region Embedding of objects +#if NETCOREAPP #region Delegates @@ -42,6 +40,7 @@ public void EmbeddedInstanceOfDelegateHasFunctionPrototype() } #endregion +#endif #region Recursive calls @@ -100,6 +99,5 @@ public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() #endregion #endregion -#endif } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs index c94d813..23997cc 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs +++ b/test/MsieJavaScriptEngine.Test.Classic/InteropTests.cs @@ -1,4 +1,7 @@ -using NUnit.Framework; +using System; +using System.IO; + +using NUnit.Framework; using MsieJavaScriptEngine.Test.Common; @@ -8,5 +11,61 @@ namespace MsieJavaScriptEngine.Test.Classic public class InteropTests : InteropTestsBase { protected override JsEngineMode EngineMode => JsEngineMode.Classic; + + + #region Embedding of objects + + #region Recursive calls + + #region Mapping of errors + + [Test] + public void MappingRuntimeErrorDuringRecursiveEvaluationOfFilesIsCorrect() + { + // Arrange + string directoryPath = GetAbsolutePath("SharedFiles/recursiveEvaluation/runtimeError"); + const string input = "require('index').calculateResult();"; + + // Act + JsRuntimeException exception = null; + + using (var jsEngine = CreateJsEngine()) + { + try + { + Func loadModule = path => { + string absolutePath = Path.Combine(directoryPath, $"{path}.js"); + string code = File.ReadAllText(absolutePath); + object result = jsEngine.Evaluate(code, absolutePath); + + return result; + }; + + jsEngine.EmbedHostObject("require", loadModule); + double output = jsEngine.Evaluate(input); + } + catch (JsRuntimeException e) + { + exception = e; + } + } + + // Assert + Assert.NotNull(exception); + Assert.AreEqual("Runtime error", exception.Category); + Assert.AreEqual("'argumens' is undefined", exception.Description); + Assert.AreEqual("TypeError", exception.Type); + Assert.AreEqual("math.js", exception.DocumentName); + Assert.AreEqual(10, exception.LineNumber); + Assert.AreEqual(4, exception.ColumnNumber); + Assert.IsEmpty(exception.SourceFragment); + Assert.IsEmpty(exception.CallStack); + } + + #endregion + + #endregion + + #endregion } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs index 5ca3e9a..4dc1a6e 100644 --- a/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs +++ b/test/MsieJavaScriptEngine.Test.Common/InteropTestsBase.cs @@ -638,7 +638,6 @@ public virtual void InteractionOfEmbeddedCustomValueTypeAndDelegateInstancesIsCo } #endregion -#if NETCOREAPP #region Recursive calls @@ -698,7 +697,6 @@ public virtual void RecursiveExecutionOfFilesIsCorrect() } #endregion -#endif #region Removal From 2430ed0ca5a4d6fdc53b126281425e076961d582 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Sun, 28 Apr 2019 21:31:39 +0300 Subject: [PATCH 178/238] Version 3.0.3 --- CHANGELOG.md | 3 +++ src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj | 2 +- src/MsieJavaScriptEngine/readme.txt | 2 +- .../MsieJavaScriptEngine.Benchmarks.csproj | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraActiveScript.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Classic.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 10 files changed, 12 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67587c0..338ce81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,9 @@ Change log ========== +## v3.0.3 - April 28, 2019 + * Fixed a error that occurred during the recursive execution and evaluation of JS files (while without correct handling of host exception) + ## v3.0.2 - March 13, 2019 * In version for .NET Core improved a embedding of delegates and types diff --git a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj index 425668a..383c8b9 100644 --- a/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj +++ b/src/MsieJavaScriptEngine/MsieJavaScriptEngine.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine for .NET - 3.0.2 + 3.0.3 net40-client;net45;netstandard1.3;netstandard2.0 1.6.0 7.3 diff --git a/src/MsieJavaScriptEngine/readme.txt b/src/MsieJavaScriptEngine/readme.txt index ea3ca57..98ff841 100644 --- a/src/MsieJavaScriptEngine/readme.txt +++ b/src/MsieJavaScriptEngine/readme.txt @@ -1,7 +1,7 @@  -------------------------------------------------------------------------------- - README file for MSIE JavaScript Engine for .NET v3.0.2 + README file for MSIE JavaScript Engine for .NET v3.0.3 -------------------------------------------------------------------------------- diff --git a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj index be5091a..70c4a27 100644 --- a/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj +++ b/test/MsieJavaScriptEngine.Benchmarks/MsieJavaScriptEngine.Benchmarks.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Benchmarks - 3.0.2 + 3.0.3 net461;netcoreapp2.0 Exe true diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index de67f13..a59736a 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Auto Mode - 3.0.2 + 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.15 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj index 758b1a7..6152d0f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraActiveScript/MsieJavaScriptEngine.Test.ChakraActiveScript.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra ActiveScript Mode - 3.0.2 + 3.0.3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 58ac2ca..240c5bb 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode - 3.0.2 + 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.15 Library diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 42d9add..3e69a5f 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode - 3.0.2 + 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.15 Library diff --git a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj index bd52b2f..c67660e 100644 --- a/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj +++ b/test/MsieJavaScriptEngine.Test.Classic/MsieJavaScriptEngine.Test.Classic.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Tests for Classic Mode - 3.0.2 + 3.0.3 net40;net451 Library true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 141645b..57d4dfb 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -2,7 +2,7 @@ MSIE JavaScript Engine: Common Tests - 3.0.2 + 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 1.0.15 Library From 7888f4f948e17f12ee5a58656636b63091e582fc Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 2 Oct 2019 18:39:52 +0300 Subject: [PATCH 179/238] Updated a version of .NET Core Runtime --- global.json | 2 +- .../MsieJavaScriptEngine.Test.Auto.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj | 2 +- .../MsieJavaScriptEngine.Test.Common.csproj | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/global.json b/global.json index b1b46fc..1d4db8d 100644 --- a/global.json +++ b/global.json @@ -1,5 +1,5 @@ { "sdk": { - "version": "2.2.106" + "version": "2.2.109" } } \ No newline at end of file diff --git a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj index a59736a..320e7e1 100644 --- a/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj +++ b/test/MsieJavaScriptEngine.Test.Auto/MsieJavaScriptEngine.Test.Auto.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Auto Mode 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.15 + 1.0.16 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj index 240c5bb..c4a8b84 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraEdgeJsRt/MsieJavaScriptEngine.Test.ChakraEdgeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra Edge JsRT Mode 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.15 + 1.0.16 Library true true diff --git a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj index 3e69a5f..86d08b3 100644 --- a/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj +++ b/test/MsieJavaScriptEngine.Test.ChakraIeJsRt/MsieJavaScriptEngine.Test.ChakraIeJsRt.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Tests for Chakra IE JsRT Mode 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.15 + 1.0.16 Library true true diff --git a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj index 57d4dfb..b6da9df 100644 --- a/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj +++ b/test/MsieJavaScriptEngine.Test.Common/MsieJavaScriptEngine.Test.Common.csproj @@ -4,7 +4,7 @@ MSIE JavaScript Engine: Common Tests 3.0.3 net40;net451;netcoreapp1.0;netcoreapp2.0 - 1.0.15 + 1.0.16 Library true true From 9e075f364d4736098a156d6e5eda625eb81fcb75 Mon Sep 17 00:00:00 2001 From: Taritsyn Date: Wed, 9 Oct 2019 18:55:46 +0300 Subject: [PATCH 180/238] 1. Slightly improved performance; 2. In JsRT modes the `CollectGarbage` method is called synchronously again. --- .../JsRt/ChakraJsRtJsEngineBase.cs | 21 -- .../JsRt/Edge/ChakraEdgeJsRtJsEngine.cs | 335 +++++++--------- .../JsRt/Edge/EdgeJsErrorHelpers.cs | 80 ++-- .../JsRt/Edge/EdgeJsScope.cs | 50 --- .../JsRt/Edge/EdgeTypeMapper.cs | 20 +- .../JsRt/Ie/ChakraIeJsRtJsEngine.cs | 357 ++++++++---------- .../JsRt/Ie/IeJsErrorHelpers.cs | 80 ++-- src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs | 50 --- .../JsRt/Ie/IeTypeMapper.cs | 20 +- .../MsieJavaScriptEngine.csproj | 3 +- src/MsieJavaScriptEngine/MsieJsEngine.cs | 5 +- src/MsieJavaScriptEngine/ScriptDispatcher.cs | 257 +++++++++---- src/MsieJavaScriptEngine/readme.txt | 4 +- .../InteropTests.cs | 2 +- .../InteropTests.cs | 2 +- 15 files changed, 585 insertions(+), 701 deletions(-) delete mode 100644 src/MsieJavaScriptEngine/JsRt/Edge/EdgeJsScope.cs delete mode 100644 src/MsieJavaScriptEngine/JsRt/Ie/IeJsScope.cs diff --git a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs index 9f67537..3c467d9 100644 --- a/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs +++ b/src/MsieJavaScriptEngine/JsRt/ChakraJsRtJsEngineBase.cs @@ -1,7 +1,5 @@ using System; -using MsieJavaScriptEngine.Utilities; - namespace MsieJavaScriptEngine.JsRt { ///