@@ -889,7 +889,7 @@ napi_status napi_get_reference_value(napi_env env, napi_ref ref, napi_value *res
889889 CHECK_ARG (result )
890890
891891 if (!ref - > referenceCount && JS_IsUndefined (ref - > value )) {
892- CreateScopedResult (env , JS_UNDEFINED , result );
892+ return CreateScopedResult (env , JS_UNDEFINED , result );
893893 }
894894
895895 JSValue value ;
@@ -1270,7 +1270,9 @@ napi_create_external(napi_env env, void *data, napi_finalize finalize_cb, void *
12701270
12711271 JS_SetOpaque (object , externalInfo );
12721272
1273- napi_status status = CreateScopedResult (env , object , result );
1273+ // On failure CreateScopedResult frees `object`, which runs the external
1274+ // finalizer and frees `externalInfo`; do not touch it afterwards.
1275+ CHECK_NAPI (CreateScopedResult (env , object , result ));
12741276
12751277 externalInfo -> finalizeCallback = finalize_cb ;
12761278
@@ -1784,7 +1786,7 @@ napi_status napi_get_typedarray_info(napi_env env,
17841786 }
17851787
17861788 if (arraybuffer ) {
1787- CreateScopedResult (env , jsArrayBuffer , arraybuffer );
1789+ CHECK_NAPI ( CreateScopedResult (env , jsArrayBuffer , arraybuffer ) );
17881790 } else {
17891791 JS_FreeValue (env -> context , jsArrayBuffer );
17901792 }
@@ -1830,7 +1832,7 @@ napi_status napi_get_dataview_info(napi_env env,
18301832 }
18311833
18321834 if (arraybuffer ) {
1833- CreateScopedResult (env , jsArrayBuffer , arraybuffer );
1835+ CHECK_NAPI ( CreateScopedResult (env , jsArrayBuffer , arraybuffer ) );
18341836 } else {
18351837 JS_FreeValue (env -> context , jsArrayBuffer );
18361838 }
@@ -2981,7 +2983,7 @@ napi_status napi_delete_element(napi_env env, napi_value object, uint32_t index,
29812983 return napi_clear_last_error (env );
29822984}
29832985
2984- static inline void
2986+ static inline napi_status
29852987napi_set_property_descriptor (napi_env env , napi_value object , napi_property_descriptor descriptor ) {
29862988 JSAtom key ;
29872989
@@ -3016,15 +3018,25 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30163018 } else if (descriptor .method ) {
30173019 flags |= JS_PROP_HAS_VALUE ;
30183020 napi_value function = NULL ;
3019- napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH , descriptor .method , descriptor .data , & function );
3021+ napi_status status = napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH ,
3022+ descriptor .method , descriptor .data , & function );
3023+ if (status != napi_ok ) {
3024+ JS_FreeAtom (env -> context , key );
3025+ return napi_set_last_error (env , status , NULL , 0 , NULL );
3026+ }
30203027 if (function ) {
30213028 value = * ((JSValue * ) function );
30223029 }
30233030 } else if (descriptor .getter || descriptor .setter ) {
30243031 if (descriptor .getter ) {
30253032 napi_value getter = NULL ;
30263033 flags |= JS_PROP_HAS_GET ;
3027- napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH , descriptor .getter , descriptor .data , & getter );
3034+ napi_status status = napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH ,
3035+ descriptor .getter , descriptor .data , & getter );
3036+ if (status != napi_ok ) {
3037+ JS_FreeAtom (env -> context , key );
3038+ return napi_set_last_error (env , status , NULL , 0 , NULL );
3039+ }
30283040 if (getter ) {
30293041 getterValue = * ((JSValue * ) getter );
30303042 }
@@ -3033,7 +3045,12 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30333045 if (descriptor .setter ) {
30343046 napi_value setter = NULL ;
30353047 flags |= JS_PROP_HAS_SET ;
3036- napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH , descriptor .setter , descriptor .data , & setter );
3048+ napi_status status = napi_create_function (env , descriptor .utf8name , NAPI_AUTO_LENGTH ,
3049+ descriptor .setter , descriptor .data , & setter );
3050+ if (status != napi_ok ) {
3051+ JS_FreeAtom (env -> context , key );
3052+ return napi_set_last_error (env , status , NULL , 0 , NULL );
3053+ }
30373054 if (setter ) {
30383055 setterValue = * ((JSValue * ) setter );
30393056 }
@@ -3042,6 +3059,8 @@ napi_set_property_descriptor(napi_env env, napi_value object, napi_property_desc
30423059
30433060 JS_DefineProperty (env -> context , jsObject , key , value , getterValue , setterValue , flags );
30443061 JS_FreeAtom (env -> context , key );
3062+
3063+ return napi_clear_last_error (env );
30453064}
30463065
30473066napi_status napi_define_properties (napi_env env , napi_value object , size_t property_count ,
@@ -3057,7 +3076,7 @@ napi_status napi_define_properties(napi_env env, napi_value object, size_t prope
30573076 }
30583077
30593078 for (size_t i = 0 ; i < property_count ; i ++ ) {
3060- napi_set_property_descriptor (env , object , properties [i ]);
3079+ CHECK_NAPI ( napi_set_property_descriptor (env , object , properties [i ]) );
30613080 }
30623081
30633082 return napi_clear_last_error (env );
@@ -3455,10 +3474,17 @@ napi_status napi_define_class(napi_env env,
34553474 JS_SetConstructor (env -> context , cls , prototype );
34563475
34573476 for (size_t i = 0 ; i < property_count ; i ++ ) {
3477+ napi_status status ;
34583478 if (properties [i ].attributes & napi_static ) {
3459- napi_set_property_descriptor (env , (napi_value ) & cls , properties [i ]);
3479+ status = napi_set_property_descriptor (env , (napi_value ) & cls , properties [i ]);
34603480 } else {
3461- napi_set_property_descriptor (env , (napi_value ) & prototype , properties [i ]);
3481+ status = napi_set_property_descriptor (env , (napi_value ) & prototype , properties [i ]);
3482+ }
3483+ if (status != napi_ok ) {
3484+ JS_FreeValue (env -> context , external );
3485+ JS_FreeValue (env -> context , prototype );
3486+ JS_FreeValue (env -> context , cls );
3487+ return napi_set_last_error (env , status , NULL , 0 , NULL );
34623488 }
34633489 }
34643490
@@ -3507,7 +3533,7 @@ napi_wrap(napi_env env, napi_value jsObject, void *nativeObject, napi_finalize f
35073533
35083534 if (result ) {
35093535 napi_ref ref ;
3510- napi_create_reference (env , jsObject , 0 , & ref );
3536+ CHECK_NAPI ( napi_create_reference (env , jsObject , 0 , & ref ) );
35113537 * result = ref ;
35123538 }
35133539
@@ -3636,7 +3662,7 @@ napi_add_finalizer(napi_env env, napi_value jsObject, void *nativeObject, napi_f
36363662
36373663 if (result ) {
36383664 napi_ref ref ;
3639- napi_create_reference (env , jsObject , 0 , & ref );
3665+ CHECK_NAPI ( napi_create_reference (env , jsObject , 0 , & ref ) );
36403666 * result = ref ;
36413667 }
36423668
@@ -4376,7 +4402,7 @@ napi_status qjs_execute_script(napi_env env,
43764402 }
43774403
43784404 if (result ) {
4379- CreateScopedResult (env , eval_result , result );
4405+ CHECK_NAPI ( CreateScopedResult (env , eval_result , result ) );
43804406 } else {
43814407 JS_FreeValue (env -> context , eval_result );
43824408 }
0 commit comments