diff --git a/jerry-core/jerry-api.h b/jerry-core/jerry-api.h index a3ca9f3993..86b197b2fc 100644 --- a/jerry-core/jerry-api.h +++ b/jerry-core/jerry-api.h @@ -155,10 +155,8 @@ extern EXTERN_C bool jerry_api_get_object_native_handle (jerry_api_object_t *object_p, uintptr_t* out_handle_p); extern EXTERN_C -void jerry_api_set_object_native_handle (jerry_api_object_t *object_p, uintptr_t handle); - -extern EXTERN_C -bool jerry_api_set_object_free_callback (jerry_api_object_t *object_p, +void jerry_api_set_object_native_handle (jerry_api_object_t *object_p, + uintptr_t handle, jerry_object_free_callback_t freecb_p); extern EXTERN_C diff --git a/jerry-core/jerry.cpp b/jerry-core/jerry.cpp index bec7db7f0e..ba6bc0f12a 100644 --- a/jerry-core/jerry.cpp +++ b/jerry-core/jerry.cpp @@ -749,46 +749,43 @@ jerry_api_get_object_native_handle (jerry_api_object_t *object_p, /**< object to } /* jerry_api_get_object_native_handle */ /** - * Set native handle for the specified object + * Set native handle and, optionally, free callback for the specified object + * + * Note: + * If native handle was already set for the object, its value is updated. + * + * Note: + * If free callback is specified, it is set to be called upon specified JS-object is freed (by GC). + * + * Otherwise, if NULL is specified for free callback pointer, free callback is not created + * and, if a free callback was added earlier for the object, it is removed. */ void jerry_api_set_object_native_handle (jerry_api_object_t *object_p, /**< object to set handle in */ - uintptr_t handle) /**< handle value */ + uintptr_t handle, /**< handle value */ + jerry_object_free_callback_t freecb_p) /**< object free callback or NULL */ { jerry_assert_api_available (); ecma_create_external_pointer_property (object_p, ECMA_INTERNAL_PROPERTY_NATIVE_HANDLE, handle); -} /* jerry_api_set_object_native_handle */ - -/** - * Set object free callback for the specified object - * - * @return true - if callback was set successfully, - * false - otherwise (there is no native handle, associated with the object). - */ -bool -jerry_api_set_object_free_callback (jerry_api_object_t *object_p, /**< object to set callback for */ - jerry_object_free_callback_t freecb_p) /**< object free callback */ -{ - jerry_assert_api_available (); - - uintptr_t handle_value; - bool is_native_handle_associated = jerry_api_get_object_native_handle (object_p, - &handle_value); - - if (!is_native_handle_associated) + if (freecb_p != NULL) { - return false; + ecma_create_external_pointer_property (object_p, + ECMA_INTERNAL_PROPERTY_FREE_CALLBACK, + (uintptr_t) freecb_p); } - - ecma_create_external_pointer_property (object_p, - ECMA_INTERNAL_PROPERTY_FREE_CALLBACK, - (uintptr_t) freecb_p); - - return true; -} /* jerry_api_set_object_free_callback */ + else + { + ecma_property_t *prop_p = ecma_find_internal_property (object_p, + ECMA_INTERNAL_PROPERTY_FREE_CALLBACK); + if (prop_p != NULL) + { + ecma_delete_property (object_p, prop_p); + } + } +} /* jerry_api_set_object_native_handle */ /** * Invoke function specified by a function object diff --git a/tests/unit/test_api.cpp b/tests/unit/test_api.cpp index 663261993c..667429b8af 100644 --- a/tests/unit/test_api.cpp +++ b/tests/unit/test_api.cpp @@ -144,10 +144,9 @@ handler_construct (const jerry_api_object_t *function_obj_p, jerry_api_set_object_field_value (this_p->v_object, "value_field", &args_p [0]); - jerry_api_set_object_native_handle (this_p->v_object, (uintptr_t) 0x0012345678abcdefull); - - bool is_set = jerry_api_set_object_free_callback (this_p->v_object, handler_construct_freecb); - assert (is_set); + jerry_api_set_object_native_handle (this_p->v_object, + (uintptr_t) 0x0012345678abcdefull, + handler_construct_freecb); return true; } /* handler_construct */ @@ -349,5 +348,7 @@ main (void) jerry_cleanup (); + assert(test_api_is_free_callback_was_called); + return 0; }