public string runScript(string script) { IntPtr returnValue; try { JavaScriptValue result; JavaScriptValue promiseResult; if (Native.JsRunScript(script, currentSourceContext++, "", out result) != JavaScriptErrorCode.NoError) { // Get error message and clear exception JavaScriptValue exception; if (Native.JsGetAndClearException(out exception) != JavaScriptErrorCode.NoError) { return("failed to get and clear exception"); } JavaScriptPropertyId messageName; if (Native.JsGetPropertyIdFromName("message", out messageName) != JavaScriptErrorCode.NoError) { return("failed to get error message id"); } JavaScriptValue messageValue; if (Native.JsGetProperty(exception, messageName, out messageValue) != JavaScriptErrorCode.NoError) { return("failed to get error message"); } IntPtr message; UIntPtr length; if (Native.JsStringToPointer(messageValue, out message, out length) != JavaScriptErrorCode.NoError) { return("failed to convert error message"); } return(Marshal.PtrToStringUni(message)); } // Execute promise tasks stored in promiseCallback while (promiseCallback.toIntPtr() != IntPtr.Zero) { JavaScriptValue task = promiseCallback; promiseCallback = new JavaScriptValue(IntPtr.Zero); Native.JsCallFunction(task, null, 0, out promiseResult); } // Convert the return value. JavaScriptValue stringResult; UIntPtr stringLength; if (Native.JsConvertValueToString(result, out stringResult) != JavaScriptErrorCode.NoError) { return("failed to convert value to string."); } if (Native.JsStringToPointer(stringResult, out returnValue, out stringLength) != JavaScriptErrorCode.NoError) { return("failed to convert return value."); } } catch (Exception e) { return("chakrahost: fatal error: internal error: " + e.Message); } return(Marshal.PtrToStringUni(returnValue)); }