Skip to content

Commit eebbed1

Browse files
galpeterdbatyai
authored andcommitted
Introduce new Promise API methods (#3186)
The new API methods make it possible to get a Promise object's result and it's state. JerryScript-DCO-1.0-Signed-off-by: Peter Gal pgal.u-szeged@partner.samsung.com
1 parent 351b881 commit eebbed1

File tree

6 files changed

+440
-3
lines changed

6 files changed

+440
-3
lines changed

docs/02.API-REFERENCE.md

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -595,6 +595,22 @@ typedef jerry_value_t (*jerry_vm_exec_stop_callback_t) (void *user_p);
595595

596596
- [jerry_set_vm_exec_stop_callback](#jerry_set_vm_exec_stop_callback)
597597

598+
## jerry_promise_state_t
599+
600+
Enum which describes the state of a Promise.
601+
602+
Possible values:
603+
604+
- JERRY_PROMISE_STATE_NONE - Invalid/Unknown state (possibly called on a non-promise object).
605+
- JERRY_PROMISE_STATE_PENDING - Promise is in "Pending" state.
606+
- JERRY_PROMISE_STATE_FULFILLED - Promise is in "Fulfilled" state.
607+
- JERRY_PROMISE_STATE_REJECTED - Promise is in "Rejected" state.
608+
609+
*New in version [NEXT VERSION]*.
610+
611+
**See also**
612+
613+
- [jerry_get_promise_result](#jerry_get_promise_result)
598614

599615
## jerry_typedarray_type_t
600616

@@ -3231,6 +3247,144 @@ jerry_value_to_string (const jerry_value_t value);
32313247

32323248
These APIs all depend on the ES2015-subset profile (or on some build options).
32333249

3250+
## jerry_get_promise_result
3251+
3252+
**Summary**
3253+
3254+
The function returns the result of a Promise object.
3255+
3256+
*Notes*:
3257+
- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3258+
is no longer needed.
3259+
- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
3260+
in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
3261+
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3262+
- The ES2015-subset profile enables this by default.
3263+
3264+
3265+
**Prototype**
3266+
3267+
```c
3268+
jerry_value_t
3269+
jerry_get_promise_result (const jerry_value_t promise);
3270+
```
3271+
3272+
- `promise` - the input Promise object.
3273+
- return
3274+
- The result of the Promise.
3275+
- If the Promise is not resolved yet the result is the 'undefined' value.
3276+
- A TypeError is returned if the input argument was not a Promise object or
3277+
the Promise support was not built into the library.
3278+
3279+
*New in version [NEXT VERSION]*.
3280+
3281+
**Example**
3282+
3283+
[doctest]: # (test="compile")
3284+
3285+
```c
3286+
#include <jerryscript.h>
3287+
3288+
static void
3289+
example (void)
3290+
{
3291+
// acquire/create a promise object.
3292+
jerry_value_t promise = jerry_create_promise ();
3293+
{
3294+
// prepare the argumnent for the resolve or reject.
3295+
jerry_value_t argument = jerry_create_number (33);
3296+
3297+
jerry_value_t is_ok = jerry_resolve_or_reject_promise (promise,
3298+
argument,
3299+
true);
3300+
// 'is_ok' should be checked if it is an error or not.
3301+
// skipped in this example
3302+
jerry_release_value (is_ok);
3303+
jerry_release_value (argument);
3304+
}
3305+
3306+
jerry_value_t promise_result = jerry_get_promise_result (promise);
3307+
// 'promise_result' is now the number 33.
3308+
3309+
jerry_release_value (promise_result);
3310+
jerry_release_value (promise);
3311+
}
3312+
```
3313+
3314+
**See also**
3315+
3316+
- [jerry_create_promise](#jerry_create_promise)
3317+
- [jerry_promise_state_t](#jerry_promise_state_t)
3318+
3319+
## jerry_get_promise_state
3320+
3321+
**Summary**
3322+
3323+
*Notes*:
3324+
- Returned value must be freed with [jerry_release_value](#jerry_release_value) when it
3325+
is no longer needed.
3326+
- This API depends on a build option (`JERRY_ES2015_BUILTIN_PROMISE`) and can be checked
3327+
in runtime with the `JERRY_FEATURE_PROMISE` feature enum value,
3328+
see: [jerry_is_feature_enabled](#jerry_is_feature_enabled).
3329+
- The ES2015-subset profile enables this by default.
3330+
3331+
3332+
**Prototype**
3333+
3334+
```c
3335+
jerry_promise_state_t
3336+
jerry_get_promise_state (const jerry_value_t promise);
3337+
```
3338+
3339+
- `promise` - the input promise object.
3340+
- return
3341+
- [jerry_promise_state_t](#jerry_promise_state_t)
3342+
- `JERRY_PROMISE_STATE_NONE` is returned if the input argument was not a promise object or
3343+
the Promise support was not built into the library.
3344+
3345+
*New in version [NEXT VERSION]*.
3346+
3347+
**Example**
3348+
3349+
[doctest]: # (test="compile")
3350+
3351+
```c
3352+
#include <jerryscript.h>
3353+
3354+
static void
3355+
example (void)
3356+
{
3357+
// acquire/create a promise object.
3358+
jerry_value_t promise = jerry_create_promise ();
3359+
3360+
jerry_promise_state_t start_state = jerry_get_promise_state (promise);
3361+
// a Promise have a default state of JERRY_PROMISE_STATE_PENDING
3362+
3363+
{
3364+
// prepare the argumnent for the resolve or reject.
3365+
jerry_value_t argument = jerry_create_number (33);
3366+
3367+
jerry_value_t is_ok = jerry_resolve_or_reject_promise (promise,
3368+
argument,
3369+
true);
3370+
// 'is_ok' should be checked if it is an error or not.
3371+
// skipped in this example
3372+
jerry_release_value (is_ok);
3373+
jerry_release_value (argument);
3374+
}
3375+
3376+
jerry_promise_state_t current_state = jerry_get_promise_state (promise);
3377+
// at this point the Promise should be in the JERRY_PROMISE_STATE_FULFILLED state.
3378+
3379+
jerry_release_value (promise);
3380+
}
3381+
```
3382+
3383+
**See also**
3384+
3385+
- [jerry_create_promise](#jerry_create_promise)
3386+
- [jerry_promise_state_t](#jerry_promise_state_t)
3387+
32343388
## jerry_resolve_or_reject_promise
32353389

32363390
**Summary**

jerry-core/api/jerry.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ JERRY_STATIC_ASSERT ((int) RE_FLAG_GLOBAL == (int) JERRY_REGEXP_FLAG_GLOBAL
7171
re_flags_t_must_be_equal_to_jerry_regexp_flags_t);
7272
#endif /* ENABLED (JERRY_BUILTIN_REGEXP) */
7373

74+
#if ENABLED (JERRY_ES2015_BUILTIN_PROMISE)
75+
/* The internal ECMA_PROMISE_STATE_* values are "one byte away" from the API values */
76+
JERRY_STATIC_ASSERT (((ECMA_PROMISE_STATE_PENDING + 1) == JERRY_PROMISE_STATE_PENDING)
77+
&& ((ECMA_PROMISE_STATE_FULFILLED + 1) == JERRY_PROMISE_STATE_FULFILLED)
78+
&& ((ECMA_PROMISE_STATE_REJECTED + 1) == JERRY_PROMISE_STATE_REJECTED),
79+
promise_internal_state_matches_external);
80+
#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
81+
7482
#if !ENABLED (JERRY_PARSER) && !ENABLED (JERRY_SNAPSHOT_EXEC)
7583
#error "JERRY_SNAPSHOT_EXEC must be enabled if JERRY_PARSER is disabled!"
7684
#endif /* !ENABLED (JERRY_PARSER) && !ENABLED (JERRY_SNAPSHOT_EXEC) */
@@ -3084,6 +3092,60 @@ jerry_resolve_or_reject_promise (jerry_value_t promise, /**< the promise value *
30843092
#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
30853093
} /* jerry_resolve_or_reject_promise */
30863094

3095+
/**
3096+
* Get the result of a promise.
3097+
*
3098+
* @return - Promise result
3099+
* - Type error if the promise support was not enabled or the input was not a promise object
3100+
*/
3101+
jerry_value_t
3102+
jerry_get_promise_result (const jerry_value_t promise) /**< promise object to get the result from */
3103+
{
3104+
jerry_assert_api_available ();
3105+
3106+
#if ENABLED (JERRY_ES2015_BUILTIN_PROMISE)
3107+
if (!jerry_value_is_promise (promise))
3108+
{
3109+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG (wrong_args_msg_p)));
3110+
}
3111+
3112+
return ecma_promise_get_result (ecma_get_object_from_value (promise));
3113+
#else /* !ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
3114+
JERRY_UNUSED (promise);
3115+
return jerry_throw (ecma_raise_type_error (ECMA_ERR_MSG ("Promise not supported.")));
3116+
#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
3117+
} /* jerry_get_promise_result */
3118+
3119+
/**
3120+
* Get the state of a promise object.
3121+
*
3122+
* @return - the state of the promise (one of the jerry_promise_state_t enum values)
3123+
* - JERRY_PROMISE_STATE_NONE is only returned if the input is not a promise object
3124+
* or the promise support was not enabled.
3125+
*/
3126+
jerry_promise_state_t
3127+
jerry_get_promise_state (const jerry_value_t promise) /**< promise object to get the state from */
3128+
{
3129+
jerry_assert_api_available ();
3130+
3131+
#if ENABLED (JERRY_ES2015_BUILTIN_PROMISE)
3132+
if (!jerry_value_is_promise (promise))
3133+
{
3134+
return JERRY_PROMISE_STATE_NONE;
3135+
}
3136+
3137+
uint8_t state = ecma_promise_get_state (ecma_get_object_from_value (promise));
3138+
3139+
JERRY_ASSERT (state < ECMA_PROMISE_STATE__COUNT);
3140+
3141+
/* Static assert above guarantees the mapping from internal type to external type. */
3142+
return (jerry_promise_state_t) (state + 1);
3143+
#else /* !ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
3144+
JERRY_UNUSED (promise);
3145+
return JERRY_PROMISE_STATE_NONE;
3146+
#endif /* ENABLED (JERRY_ES2015_BUILTIN_PROMISE) */
3147+
} /* jerry_get_promise_state */
3148+
30873149
/**
30883150
* Call the SymbolDescriptiveString ecma builtin operation on the symbol value.
30893151
*

jerry-core/ecma/operations/ecma-promise-object.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ ecma_is_promise (ecma_object_t *obj_p) /**< points to object */
5353
* @return ecma value of the promise result.
5454
* Returned value must be freed with ecma_free_value
5555
*/
56-
static inline ecma_value_t
56+
ecma_value_t
5757
ecma_promise_get_result (ecma_object_t *obj_p) /**< points to promise object */
5858
{
5959
JERRY_ASSERT (ecma_is_promise (obj_p));
@@ -84,7 +84,7 @@ ecma_promise_set_result (ecma_object_t *obj_p, /**< points to promise object */
8484
*
8585
* @return the state's enum value
8686
*/
87-
static inline uint8_t JERRY_ATTR_ALWAYS_INLINE
87+
uint8_t
8888
ecma_promise_get_state (ecma_object_t *obj_p) /**< points to promise object */
8989
{
9090
JERRY_ASSERT (ecma_is_promise (obj_p));

jerry-core/ecma/operations/ecma-promise-object.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ typedef struct
7171
bool ecma_is_promise (ecma_object_t *obj_p);
7272
ecma_value_t
7373
ecma_op_create_promise_object (ecma_value_t executor, ecma_promise_executor_type_t type);
74+
uint8_t ecma_promise_get_state (ecma_object_t *promise_p);
75+
ecma_value_t ecma_promise_get_result (ecma_object_t *promise_p);
7476
ecma_value_t ecma_promise_new_capability (void);
7577
ecma_value_t
7678
ecma_promise_then (ecma_value_t promise,

jerry-core/include/jerryscript-core.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,10 +555,24 @@ bool jerry_foreach_object_property (const jerry_value_t obj_val, jerry_object_pr
555555
void *user_data_p);
556556

557557
/**
558-
* Promise resolve/reject functions.
558+
* Promise functions.
559559
*/
560560
jerry_value_t jerry_resolve_or_reject_promise (jerry_value_t promise, jerry_value_t argument, bool is_resolve);
561561

562+
/**
563+
* Enum values representing various Promise states.
564+
*/
565+
typedef enum
566+
{
567+
JERRY_PROMISE_STATE_NONE = 0u, /**< Invalid/Unknown state (possibly called on a non-promise object). */
568+
JERRY_PROMISE_STATE_PENDING, /**< Promise is in "Pending" state. */
569+
JERRY_PROMISE_STATE_FULFILLED, /**< Promise is in "Fulfilled" state. */
570+
JERRY_PROMISE_STATE_REJECTED, /**< Promise is in "Rejected" state. */
571+
} jerry_promise_state_t;
572+
573+
jerry_value_t jerry_get_promise_result (const jerry_value_t promise);
574+
jerry_promise_state_t jerry_get_promise_state (const jerry_value_t promise);
575+
562576
/**
563577
* Symbol functions.
564578
*/

0 commit comments

Comments
 (0)