From c1810a5a27419220496ca13e9de7d77eec1621ed Mon Sep 17 00:00:00 2001 From: Kyle Farnung Date: Thu, 16 Feb 2017 13:42:31 -0800 Subject: [PATCH] Added JsCreatePromise and JsCreateThenPromise to JsRT --- lib/Jsrt/ChakraCommon.h | 13 ++++++++ lib/Jsrt/Jsrt.cpp | 58 ++++++++++++++++++++++++++++++++++ lib/Jsrt/JsrtCommonExports.inc | 2 ++ 3 files changed, 73 insertions(+) diff --git a/lib/Jsrt/ChakraCommon.h b/lib/Jsrt/ChakraCommon.h index 6d9a9f852de..589483e734d 100644 --- a/lib/Jsrt/ChakraCommon.h +++ b/lib/Jsrt/ChakraCommon.h @@ -2378,6 +2378,19 @@ typedef unsigned short uint16_t; _In_ JsPromiseContinuationCallback promiseContinuationCallback, _In_opt_ void *callbackState); + CHAKRA_API + JsCreatePromise( + _Out_ JsValueRef *promise, + _Out_ JsValueRef *resolve, + _Out_ JsValueRef *reject); + + CHAKRA_API + JsCreateThenPromise( + _In_ JsValueRef sourcePromise, + _In_ JsValueRef fulfillmentHandler, + _In_ JsValueRef rejectionHandler, + _Out_ JsValueRef *thenPromise); + #ifdef _WIN32 #include "ChakraCommonWindows.h" #endif // _WIN32 diff --git a/lib/Jsrt/Jsrt.cpp b/lib/Jsrt/Jsrt.cpp index 0e9a8fa3bb0..b6e47ed09f9 100644 --- a/lib/Jsrt/Jsrt.cpp +++ b/lib/Jsrt/Jsrt.cpp @@ -13,6 +13,7 @@ #include "Common/ByteSwap.h" #include "Library/DataView.h" #include "Library/JavascriptSymbol.h" +#include "Library/JavascriptPromise.h" #include "Base/ThreadContextTlsEntry.h" #include "Codex/Utf8Helper.h" @@ -4508,4 +4509,61 @@ CHAKRA_API JsRunSerialized( sourceContext, // use the same user provided sourceContext as scriptLoadSourceContext buffer, bufferVal, sourceContext, url, false, result); } + +CHAKRA_API JsCreatePromise(_Out_ JsValueRef *promise, _Out_ JsValueRef *resolve, _Out_ JsValueRef *reject) +{ + return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PARAM_NOT_NULL(promise); + PARAM_NOT_NULL(resolve); + PARAM_NOT_NULL(reject); + *promise = nullptr; + *resolve = nullptr; + *reject = nullptr; + + Js::JavascriptPromiseResolveOrRejectFunction *jsResolve; + Js::JavascriptPromiseResolveOrRejectFunction *jsReject; + Js::JavascriptPromise *jsPromise = scriptContext->GetLibrary()->CreatePromise(); + Js::JavascriptPromise::InitializePromise(jsPromise, &jsResolve, &jsReject, scriptContext); + + *promise = (JsValueRef)jsPromise; + *resolve = (JsValueRef)jsResolve; + *reject = (JsValueRef)jsReject; + + return JsNoError; + }); +} + +CHAKRA_API JsCreateThenPromise(_In_ JsValueRef sourcePromise, _In_ JsValueRef fulfillmentHandler, _In_ JsValueRef rejectionHandler, _Out_ JsValueRef *thenPromise) +{ + return ContextAPIWrapper([&](Js::ScriptContext *scriptContext, TTDRecorder& _actionEntryPopper) -> JsErrorCode { + PARAM_NOT_NULL(sourcePromise); + PARAM_NOT_NULL(fulfillmentHandler); + PARAM_NOT_NULL(rejectionHandler); + PARAM_NOT_NULL(thenPromise); + *thenPromise = nullptr; + + if (!Js::JavascriptPromise::Is(sourcePromise)) + { + return JsErrorInvalidArgument; + } + + if (!Js::JavascriptFunction::Is(fulfillmentHandler)) + { + return JsErrorInvalidArgument; + } + + if (!Js::JavascriptFunction::Is(rejectionHandler)) + { + return JsErrorInvalidArgument; + } + + Js::JavascriptPromise* jsPromise = Js::JavascriptPromise::FromVar(sourcePromise); + Js::RecyclableObject* jsFulfillment = Js::RecyclableObject::FromVar(fulfillmentHandler); + Js::RecyclableObject* jsRejection = Js::RecyclableObject::FromVar(rejectionHandler); + + *thenPromise = Js::JavascriptPromise::CreateThenPromise(jsPromise, jsFulfillment, jsRejection, scriptContext); + + return JsNoError; + }); +} #endif // CHAKRACOREBUILD_ diff --git a/lib/Jsrt/JsrtCommonExports.inc b/lib/Jsrt/JsrtCommonExports.inc index 2ad33cd4d6f..afa2275c5d9 100644 --- a/lib/Jsrt/JsrtCommonExports.inc +++ b/lib/Jsrt/JsrtCommonExports.inc @@ -103,6 +103,8 @@ JsGetRuntime JsIdle JsSetPromiseContinuationCallback + JsCreatePromise + JsCreateThenPromise #ifndef NTBUILD JsCreateString JsCreateStringUtf16