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:
SaeHie Park
2015-05-10 17:55:26 +09:00
parent b8e43286cc
commit da86a52fe9
3 changed files with 33 additions and 37 deletions
+2 -4
View File
@@ -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
+26 -29
View File
@@ -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
+5 -4
View File
@@ -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;
}