From 7df5fa298b6449386dc0beace2f87f789118b476 Mon Sep 17 00:00:00 2001 From: ClearScript Date: Wed, 12 Mar 2014 23:57:53 -0400 Subject: [PATCH] Added null and decimal marshaling options to WindowsScriptEngine. --- ClearScript/Windows/WindowsScriptEngine.cs | 10 ++++++ .../Windows/WindowsScriptEngineFlags.cs | 12 ++++++- ClearScriptTest/JScriptEngineTest.cs | 35 +++++++++++++++++++ ClearScriptTest/VBScriptEngineTest.cs | 31 ++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) diff --git a/ClearScript/Windows/WindowsScriptEngine.cs b/ClearScript/Windows/WindowsScriptEngine.cs index 98aeb3e0..bfdfa299 100644 --- a/ClearScript/Windows/WindowsScriptEngine.cs +++ b/ClearScript/Windows/WindowsScriptEngine.cs @@ -426,6 +426,11 @@ namespace Microsoft.ClearScript.Windows { if (obj == null) { + if (engineFlags.HasFlag(WindowsScriptEngineFlags.MarshalNullAsDispatch)) + { + return new DispatchWrapper(null); + } + return DBNull.Value; } @@ -439,6 +444,11 @@ namespace Microsoft.ClearScript.Windows return null; } + if (engineFlags.HasFlag(WindowsScriptEngineFlags.MarshalDecimalAsCurrency) && (obj is decimal)) + { + return new CurrencyWrapper(obj); + } + var hostItem = obj as HostItem; if (hostItem != null) { diff --git a/ClearScript/Windows/WindowsScriptEngineFlags.cs b/ClearScript/Windows/WindowsScriptEngineFlags.cs index 96c42692..44c52fb6 100644 --- a/ClearScript/Windows/WindowsScriptEngineFlags.cs +++ b/ClearScript/Windows/WindowsScriptEngineFlags.cs @@ -92,6 +92,16 @@ namespace Microsoft.ClearScript.Windows /// /// Specifies that script language features that enhance standards compliance are to be enabled. This option only affects . /// - EnableStandardsMode = 0x00000008 + EnableStandardsMode = 0x00000008, + + /// + /// Specifies that null is to be marshaled as a variant of type VT_DISPATCH. + /// + MarshalNullAsDispatch = 0x00000010, + + /// + /// Specifies that values are to be marshaled as variants of type VT_CY. + /// + MarshalDecimalAsCurrency = 0x00000020 } } diff --git a/ClearScriptTest/JScriptEngineTest.cs b/ClearScriptTest/JScriptEngineTest.cs index 3135b62e..7cc934ef 100644 --- a/ClearScriptTest/JScriptEngineTest.cs +++ b/ClearScriptTest/JScriptEngineTest.cs @@ -967,9 +967,44 @@ namespace Microsoft.ClearScript.Test [TestMethod, TestCategory("JScriptEngine")] public void JScriptEngine_StandardsMode() { + // ReSharper disable AccessToDisposedClosure + + TestUtil.AssertException(() => engine.Evaluate("JSON")); + engine.Dispose(); engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.EnableStandardsMode); + Assert.AreEqual("{\"foo\":123,\"bar\":456.789}", engine.Evaluate("JSON.stringify({ foo: 123, bar: 456.789 })")); + + // ReSharper restore AccessToDisposedClosure + } + + [TestMethod, TestCategory("JScriptEngine")] + public void JScriptEngine_MarshalNullAsDispatch() + { + engine.Script.func = new Func(() => null); + Assert.IsTrue((bool)engine.Evaluate("func() === null")); + + engine.Dispose(); + engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalNullAsDispatch); + + engine.Script.func = new Func(() => null); + Assert.IsTrue((bool)engine.Evaluate("func() === null")); + } + + [TestMethod, TestCategory("JScriptEngine")] + public void JScriptEngine_MarshalDecimalAsCurrency() + { + engine.Script.func = new Func(() => 123.456M); + Assert.AreEqual("number", engine.Evaluate("typeof(func())")); + Assert.AreEqual(123.456 + 5, engine.Evaluate("func() + 5")); + + engine.Dispose(); + engine = new JScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalDecimalAsCurrency); + + engine.Script.func = new Func(() => 123.456M); + Assert.AreEqual("number", engine.Evaluate("typeof(func())")); + Assert.AreEqual(123.456 + 5, engine.Evaluate("func() + 5")); } // ReSharper restore InconsistentNaming diff --git a/ClearScriptTest/VBScriptEngineTest.cs b/ClearScriptTest/VBScriptEngineTest.cs index 58a442dd..6a0dba5e 100644 --- a/ClearScriptTest/VBScriptEngineTest.cs +++ b/ClearScriptTest/VBScriptEngineTest.cs @@ -912,6 +912,37 @@ namespace Microsoft.ClearScript.Test VBScriptEngine_Execute(); } + [TestMethod, TestCategory("VBScriptEngine")] + public void VBScriptEngine_MarshalNullAsDispatch() + { + engine.Script.func = new Func(() => null); + Assert.IsTrue((bool)engine.Evaluate("IsNull(func())")); + + engine.Dispose(); + engine = new VBScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalNullAsDispatch); + + engine.Script.func = new Func(() => null); + Assert.IsTrue((bool)engine.Evaluate("func() is nothing")); + } + + [TestMethod, TestCategory("VBScriptEngine")] + public void VBScriptEngine_MarshalDecimalAsCurrency() + { + // ReSharper disable AccessToDisposedClosure + + engine.Script.func = new Func(() => 123.456M); + TestUtil.AssertException(() => engine.Evaluate("TypeName(func())")); + + engine.Dispose(); + engine = new VBScriptEngine(WindowsScriptEngineFlags.EnableDebugging | WindowsScriptEngineFlags.MarshalDecimalAsCurrency); + + engine.Script.func = new Func(() => 123.456M); + Assert.AreEqual("Currency", engine.Evaluate("TypeName(func())")); + Assert.AreEqual(123.456M + 5, engine.Evaluate("func() + 5")); + + // ReSharper restore AccessToDisposedClosure + } + // ReSharper restore InconsistentNaming #endregion