MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1#ifndef ANT_NATIVE_PTR_H
2#define ANT_NATIVE_PTR_H
3
4#include "types.h"
5#include "internal.h" // IWYU pragma: keep
6
7static inline void *js_get_native(ant_value_t obj, uint32_t tag) {
8 ant_object_t *o = js_obj_ptr(obj);
9
10 if (!o || !tag) return NULL;
11 if (o->native.tag == tag) return o->native.ptr;
12
13 ant_object_sidecar_t *sidecar = ant_object_sidecar(o);
14 if (!sidecar) return NULL;
15
16 for (uint8_t i = 0; i < sidecar->native_count; i++)
17 if (sidecar->native_entries[i].tag == tag) return sidecar->native_entries[i].ptr;
18
19 return NULL;
20}
21
22static inline void js_clear_native(ant_value_t obj, uint32_t tag) {
23 ant_object_t *o = js_obj_ptr(obj);
24 if (!o || !tag) return;
25
26 ant_object_sidecar_t *sidecar = ant_object_sidecar(o);
27 if (o->native.tag == tag) {
28 if (sidecar && sidecar->native_count > 0) {
29 sidecar->native_count--;
30 o->native = sidecar->native_entries[sidecar->native_count];
31 } else {
32 o->native.ptr = NULL;
33 o->native.tag = 0;
34 }
35 return;
36 }
37
38 if (!sidecar) return;
39 for (uint8_t i = 0; i < sidecar->native_count; i++) {
40 if (sidecar->native_entries[i].tag != tag) continue;
41 sidecar->native_count--;
42 sidecar->native_entries[i] = sidecar->native_entries[sidecar->native_count];
43 return;
44 }
45}
46
47static inline void js_set_native(ant_value_t obj, void *ptr, uint32_t tag) {
48 ant_object_t *o = js_obj_ptr(obj);
49 if (!o || !tag) return;
50
51 if (o->native.tag == 0 || o->native.tag == tag) {
52 o->native.ptr = ptr;
53 o->native.tag = tag;
54 return;
55 }
56
57 ant_object_sidecar_t *sidecar = ant_object_ensure_sidecar(o);
58 if (!sidecar) return;
59
60 for (uint8_t i = 0; i < sidecar->native_count; i++) {
61 if (sidecar->native_entries[i].tag != tag) continue;
62 sidecar->native_entries[i].ptr = ptr;
63 return;
64 }
65
66 if (sidecar->native_count >= sidecar->native_cap) {
67 uint8_t next_cap = sidecar->native_cap ? (uint8_t)(sidecar->native_cap * 2) : 2;
68 ant_native_entry_t *next = realloc(sidecar->native_entries, next_cap * sizeof(*next));
69
70 if (!next) return;
71 sidecar->native_entries = next;
72 sidecar->native_cap = next_cap;
73 }
74
75 sidecar->native_entries[sidecar->native_count++] = (ant_native_entry_t){ ptr, tag };
76}
77
78static inline bool js_check_native_tag(ant_value_t obj, uint32_t tag) {
79 ant_object_t *o = js_obj_ptr(obj);
80
81 if (!o || !tag) return false;
82 if (o->native.tag == tag) return true;
83
84 ant_object_sidecar_t *sidecar = ant_object_sidecar(o);
85 if (!sidecar) return false;
86
87 for (uint8_t i = 0; i < sidecar->native_count; i++)
88 if (sidecar->native_entries[i].tag == tag) return true;
89
90 return false;
91}
92
93#endif