public void JsParseDoesParse() { var script = "(()=>{return 6*7;})()"; string sourceUrl = "[eval code]"; using (var runtimeHandle = Engine.JsCreateRuntime(JavaScriptRuntimeAttributes.None, null)) { using (var contextHandle = Engine.JsCreateContext(runtimeHandle)) { Engine.JsSetCurrentContext(contextHandle); IntPtr ptrScript = Marshal.StringToHGlobalAnsi(script); try { var scriptHandle = Engine.JsCreateExternalArrayBuffer(ptrScript, (uint)script.Length, null, IntPtr.Zero); var sourceContext = JavaScriptSourceContext.None; var sourceUrlHandle = Engine.JsCreateString(sourceUrl, (ulong)sourceUrl.Length); var resultHandle = Engine.JsParse(scriptHandle, sourceContext, sourceUrlHandle, JavaScriptParseScriptAttributes.None); Assert.True(resultHandle != JavaScriptValueSafeHandle.Invalid); var handleType = Engine.JsGetValueType(resultHandle); Assert.True(handleType == JsValueType.Function); resultHandle.Dispose(); sourceUrlHandle.Dispose(); scriptHandle.Dispose(); } finally { Marshal.FreeHGlobal(ptrScript); } } } }
public JsArrayBuffer CreateArrayBuffer(string data) { if (data == null) { data = String.Empty; } JavaScriptValueSafeHandle externalArrayHandle; IntPtr ptrData = Marshal.StringToHGlobalUni(data); try { GCHandle freeCallbackHandle = default(GCHandle); JavaScriptObjectFinalizeCallback freeCallback = (ptr) => { Marshal.ZeroFreeGlobalAllocUnicode(ptrData); if (freeCallbackHandle.IsAllocated) { freeCallbackHandle.Free(); } }; freeCallbackHandle = GCHandle.Alloc(freeCallback); externalArrayHandle = m_engine.JsCreateExternalArrayBuffer(ptrData, (uint)data.Length, freeCallback, IntPtr.Zero); } catch (Exception) { //If anything goes wrong, free the unmanaged memory. //This is not a finally as if success, the memory will be freed automagially. Marshal.ZeroFreeGlobalAllocUnicode(ptrData); throw; } var result = m_valuePool.GetOrAdd(externalArrayHandle, () => { return(new JsManagedExternalArrayBuffer(m_engine, Context, externalArrayHandle, ptrData)); }); var resultArrayBuffer = result as JsArrayBuffer; if (resultArrayBuffer == null) { throw new InvalidOperationException($"Expected the result object to be a JsArrayBuffer, however the value was {result.GetType()}"); } return((JsArrayBuffer)result); }
public ScriptSource(IJavaScriptEngine engine, string script, string sourceUrl = "[eval source]") { if (engine == null) { throw new ArgumentNullException(nameof(engine)); } m_script = script ?? throw new ArgumentNullException(nameof(script)); m_ptrScript = Marshal.StringToHGlobalAnsi(script); m_scriptHandle = engine.JsCreateExternalArrayBuffer(m_ptrScript, (uint)script.Length, null, IntPtr.Zero); m_sourceUrlHandle = engine.JsCreateString(sourceUrl, (ulong)sourceUrl.Length); m_sourceContext = JavaScriptSourceContext.GetNextSourceContext(); m_fnScript = engine.JsParse(m_scriptHandle, m_sourceContext, m_sourceUrlHandle, JavaScriptParseScriptAttributes.None); }
/// <summary> /// Executes a script, automatically storing the script value within an ExternalArrayBuffer. /// </summary> /// <remarks> /// This extension method exists for simplicity. /// </remarks> /// <param name="jsrt"></param> /// <param name="script"></param> /// <param name="sourceContext"></param> /// <param name="sourceUrl"></param> /// <param name="parseAttributes"></param> /// <param name="result"></param> /// <returns>A JavaScriptValueSafeHandle containing the result.</returns> public static JavaScriptValueSafeHandle JsRunScript(this IJavaScriptEngine jsrt, string script, JavaScriptSourceContext sourceContext = default(JavaScriptSourceContext), string sourceUrl = null, JavaScriptParseScriptAttributes parseAttributes = JavaScriptParseScriptAttributes.None) { var ptrScript = Marshal.StringToHGlobalAnsi(script); JavaScriptObjectFinalizeCallback callback = (IntPtr ptr) => { //Release pinned string. Marshal.FreeHGlobal(ptrScript); }; var scriptHandle = jsrt.JsCreateExternalArrayBuffer(ptrScript, (uint)script.Length, callback, IntPtr.Zero); if (sourceContext == default(JavaScriptSourceContext)) { sourceContext = JavaScriptSourceContext.None; } JavaScriptValueSafeHandle sourceUrlHandle; if (string.IsNullOrWhiteSpace(sourceUrl)) { sourceUrl = "[eval code]"; } sourceUrlHandle = jsrt.JsCreateString(EvalSourceUrl, (ulong)EvalSourceUrl.Length); if (parseAttributes == default(JavaScriptParseScriptAttributes)) { parseAttributes = JavaScriptParseScriptAttributes.None; } try { return(jsrt.JsRun(scriptHandle, sourceContext, sourceUrlHandle, parseAttributes)); } finally { //Release variables created during this operation. sourceUrlHandle.Dispose(); scriptHandle.Dispose(); } }