MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 93 lines 2.6 kB view raw
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