Add info to external pointer free callback. (#4642)

Furthermore reduce memory consumption when only
one external pointer is assigned to an object.

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2021-04-13 09:51:39 +02:00
committed by GitHub
parent b3ec217b50
commit 053389de80
28 changed files with 304 additions and 123 deletions
+58 -11
View File
@@ -696,11 +696,11 @@ typedef jerry_value_t (*jerry_external_handler_t) (const jerry_call_info_t *call
- [jerry_create_external_function](#jerry_create_external_function)
## jerry_object_native_free_callback_t
## jerry_value_free_callback_t
**Summary**
Native free callback of an object. It is used in `jerry_object_native_info_t` and for external Array buffers.
Native free callback of generic value types.
*Note*:
- Referred values by this method must have at least 1 reference. (Correct API usage satisfies this condition)
@@ -708,17 +708,45 @@ Native free callback of an object. It is used in `jerry_object_native_info_t` an
**Prototype**
```c
typedef void (*jerry_object_native_free_callback_t) (void *native_p);
typedef void (*jerry_value_free_callback_t) (void *native_p);
```
*New in version [[NEXT_RELEASE]]*.
**See also**
- [jerry_create_external_string](#jerry_create_external_string)
- [jerry_create_external_string_sz](#jerry_create_external_string_sz)
- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
## jerry_object_native_free_callback_t
**Summary**
Native free callback of an object. The callback receives both the memory pointer and the type
information passed to [jerry_set_object_native_pointer](#jerry_set_object_native_pointer).
*Note*:
- Referred values by this method must have at least 1 reference. (Correct API usage satisfies this condition)
**Prototype**
```c
typedef void (*jerry_object_native_free_callback_t) (void *native_p, struct jerry_object_native_info_t *info_p);
```
- `native_p` - native pointer passed to [jerry_set_object_native_pointer](#jerry_set_object_native_pointer).
- `info_p` - native type info passed to [jerry_set_object_native_pointer](#jerry_set_object_native_pointer).
*New in version 2.0*: Renamed from `jerry_object_free_callback_t`.
*Changed in version 2.2*: API calls are once again allowed. (See note)
*Changed in version [[NEXT_RELEASE]]*: `info_p` argument is added
**See also**
- [jerry_object_native_info_t](#jerry_object_native_info_t)
- [jerry_create_arraybuffer_external](#jerry_create_arraybuffer_external)
## jerry_error_object_created_callback_t
@@ -5655,7 +5683,7 @@ so the user can release the buffer which was provided.
jerry_value_t
jerry_create_arraybuffer_external (const jerry_length_t size
uint8_t *buffer_p,
jerry_object_native_free_callback_t free_cb);
jerry_value_free_callback_t free_cb);
```
- `size` - size of the buffer to use **in bytes** (should not be 0)
@@ -5667,6 +5695,8 @@ jerry_create_arraybuffer_external (const jerry_length_t size
*New in version 2.0*.
*Changed in version [[NEXT_RELEASE]]*: type of `free_cb` has been changed.
**Example**
```c
@@ -6473,7 +6503,7 @@ is no longer needed.
```c
jerry_value_t
jerry_create_external_string (const jerry_char_t *str_p,
jerry_object_native_free_callback_t free_cb)
jerry_value_free_callback_t free_cb)
```
- `str_p` - non-null pointer to string
@@ -6482,6 +6512,8 @@ jerry_create_external_string (const jerry_char_t *str_p,
*New in version 2.4*.
*Changed in version [[NEXT_RELEASE]]*: type of `free_cb` has been changed.
**Example**
```c
@@ -6519,7 +6551,7 @@ is no longer needed.
jerry_value_t
jerry_create_external_string_sz (const jerry_char_t *str_p,
jerry_size_t str_size,
jerry_object_native_free_callback_t free_cb)
jerry_value_free_callback_t free_cb)
```
- `str_p` - non-null pointer to string
@@ -6529,6 +6561,8 @@ jerry_create_external_string_sz (const jerry_char_t *str_p,
*New in version 2.4*.
*Changed in version [[NEXT_RELEASE]]*: type of `free_cb` has been changed.
**Example**
```c
@@ -8416,8 +8450,11 @@ typedef struct
#define SECRET_INFO ((void *) 42)
static void
buffer_native_freecb (void *native_p)
buffer_native_freecb (void *native_p,
jerry_object_native_info_t *info_p)
{
(void) info_p;
char *data_p = ((buffer_native_object_t*)native_p)->data_p;
if (data_p != NULL)
@@ -8429,14 +8466,21 @@ buffer_native_freecb (void *native_p)
}
static void
shape_native_freecb (void *native_p)
shape_native_freecb (void *native_p,
jerry_object_native_info_t *info_p)
{
(void) info_p;
free (native_p);
}
static void
destructor_freecb (void *native_p)
destructor_freecb (void *native_p,
jerry_object_native_info_t *info_p)
{
(void) native_p;
(void) info_p;
printf("Note: the object has been freed\n");
}
@@ -8988,8 +9032,11 @@ typedef struct
int match_foo_value;
} find_object_data_t;
static void native_freecb (void *native_p)
static void native_freecb (void *native_p,
jerry_object_native_info_t *info_p)
{
(void) info_p;
/* `native_p` was allocated via malloc. */
free (native_p);
} /* native_freecb */