Fix object free callback.
- remove jerry_set_object_free_callback() - change jerry_api_set_object_native_handle() with object_free_callback - related issue: https://github.com/Samsung/jerryscript/issues/17 JerryScript-DCO-1.0-Signed-off-by: SaeHie Park saehie.park@samsung.com
This commit is contained in:
@@ -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);
|
bool jerry_api_get_object_native_handle (jerry_api_object_t *object_p, uintptr_t* out_handle_p);
|
||||||
|
|
||||||
extern EXTERN_C
|
extern EXTERN_C
|
||||||
void jerry_api_set_object_native_handle (jerry_api_object_t *object_p, uintptr_t handle);
|
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,
|
|
||||||
jerry_object_free_callback_t freecb_p);
|
jerry_object_free_callback_t freecb_p);
|
||||||
|
|
||||||
extern EXTERN_C
|
extern EXTERN_C
|
||||||
|
|||||||
+26
-29
@@ -749,46 +749,43 @@ jerry_api_get_object_native_handle (jerry_api_object_t *object_p, /**< object to
|
|||||||
} /* jerry_api_get_object_native_handle */
|
} /* 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
|
void
|
||||||
jerry_api_set_object_native_handle (jerry_api_object_t *object_p, /**< object to set handle in */
|
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 ();
|
jerry_assert_api_available ();
|
||||||
|
|
||||||
ecma_create_external_pointer_property (object_p,
|
ecma_create_external_pointer_property (object_p,
|
||||||
ECMA_INTERNAL_PROPERTY_NATIVE_HANDLE,
|
ECMA_INTERNAL_PROPERTY_NATIVE_HANDLE,
|
||||||
handle);
|
handle);
|
||||||
} /* jerry_api_set_object_native_handle */
|
if (freecb_p != NULL)
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
{
|
||||||
return false;
|
ecma_create_external_pointer_property (object_p,
|
||||||
|
ECMA_INTERNAL_PROPERTY_FREE_CALLBACK,
|
||||||
|
(uintptr_t) freecb_p);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
ecma_create_external_pointer_property (object_p,
|
{
|
||||||
ECMA_INTERNAL_PROPERTY_FREE_CALLBACK,
|
ecma_property_t *prop_p = ecma_find_internal_property (object_p,
|
||||||
(uintptr_t) freecb_p);
|
ECMA_INTERNAL_PROPERTY_FREE_CALLBACK);
|
||||||
|
if (prop_p != NULL)
|
||||||
return true;
|
{
|
||||||
} /* jerry_api_set_object_free_callback */
|
ecma_delete_property (object_p, prop_p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} /* jerry_api_set_object_native_handle */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoke function specified by a function object
|
* Invoke function specified by a function object
|
||||||
|
|||||||
@@ -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_field_value (this_p->v_object, "value_field", &args_p [0]);
|
||||||
|
|
||||||
jerry_api_set_object_native_handle (this_p->v_object, (uintptr_t) 0x0012345678abcdefull);
|
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);
|
handler_construct_freecb);
|
||||||
assert (is_set);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* handler_construct */
|
} /* handler_construct */
|
||||||
@@ -349,5 +348,7 @@ main (void)
|
|||||||
|
|
||||||
jerry_cleanup ();
|
jerry_cleanup ();
|
||||||
|
|
||||||
|
assert(test_api_is_free_callback_was_called);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user