11const types = @import ("types.zig" );
22const js = @import ("js_helpers.zig" );
33const beam_to_js = @import ("beam_to_js.zig" );
4+ const beam_helpers = @import ("beam_helpers.zig" );
5+ const inspect_binary = beam_helpers .inspect_binary ;
6+ const existing_atom = beam_helpers .existing_atom ;
7+ const make_new_binary = beam_helpers .make_new_binary ;
8+ const map_iterator_create = beam_helpers .map_iterator_create ;
9+ const map_iterator_get_pair = beam_helpers .map_iterator_get_pair ;
10+ const std = types .std ;
411const beam = types .beam ;
512const e = types .e ;
613const qjs = types .qjs ;
@@ -18,10 +25,9 @@ fn lookupKey(data: *BeamProxyData, key: []const u8, result: *e.ErlNifTerm) bool
1825 // Use a scratch env so we don't mutate the proxy's env heap.
1926 const scratch = beam .alloc_env () orelse return false ;
2027 defer beam .free_env (scratch );
21- // SAFETY: enif_make_new_binary initializes bin_term before it is read.
22- var bin_term : e.ErlNifTerm = undefined ;
23- const bin_ptr = e .enif_make_new_binary (scratch , key .len , & bin_term );
24- if (bin_ptr != null ) {
28+ if (make_new_binary (scratch , key .len )) | bin | {
29+ const bin_ptr = bin .data ;
30+ const bin_term = bin .term ;
2531 if (key .len > 0 ) {
2632 @memcpy (bin_ptr [0.. key .len ], key );
2733 }
@@ -32,9 +38,7 @@ fn lookupKey(data: *BeamProxyData, key: []const u8, result: *e.ErlNifTerm) bool
3238 }
3339
3440 // Try atom key
35- // SAFETY: enif_make_existing_atom_len initializes atom_key on success before use.
36- var atom_key : e.ErlNifTerm = undefined ;
37- if (e .enif_make_existing_atom_len (data .env , key .ptr , key .len , & atom_key , e .ERL_NIF_LATIN1 ) != 0 ) {
41+ if (existing_atom (data .env , key )) | atom_key | {
3842 if (e .enif_get_map_value (data .env , data .term , atom_key , result ) != 0 ) {
3943 return true ;
4044 }
@@ -68,8 +72,7 @@ fn get_own_property(ctx: ?*qjs.JSContext, desc: ?*qjs.JSPropertyDescriptor, obj:
6872 if (key_ptr == null ) return 0 ;
6973 defer qjs .JS_FreeCString (ctx , key_ptr );
7074
71- // SAFETY: lookupKey writes result before any successful read.
72- var result : e.ErlNifTerm = undefined ;
75+ var result = std .mem .zeroes (e .ErlNifTerm );
7376 if (! lookupKey (data , key_ptr [0.. len ], & result )) return 0 ;
7477
7578 if (desc ) | d | {
@@ -102,36 +105,28 @@ fn get_own_property_names(ctx: ?*qjs.JSContext, ptab: [*c][*c]qjs.JSPropertyEnum
102105 const raw = qjs .js_malloc (ctx , byte_size ) orelse return -1 ;
103106 const tab : [* ]qjs.JSPropertyEnum = @ptrCast (@alignCast (raw ));
104107
105- // SAFETY: enif_map_iterator_create initializes iter on success before use.
106- var iter : e.ErlNifMapIterator = undefined ;
107- if (e .enif_map_iterator_create (data .env , data .term , & iter , e .ERL_NIF_MAP_ITERATOR_FIRST ) == 0 ) {
108+ var iter = map_iterator_create (data .env , data .term , e .ERL_NIF_MAP_ITERATOR_FIRST ) orelse {
108109 qjs .js_free (ctx , raw );
109110 return -1 ;
110- }
111+ };
111112 defer e .enif_map_iterator_destroy (data .env , & iter );
112113
113- // SAFETY: enif_map_iterator_get_pair initializes key and val before use.
114- var key : e.ErlNifTerm = undefined ;
115- // SAFETY: enif_map_iterator_get_pair initializes val before use.
116- var val : e.ErlNifTerm = undefined ;
117114 var idx : u32 = 0 ;
118115
119- while (e . enif_map_iterator_get_pair (data .env , & iter , & key , & val ) != 0 ) : ({
116+ while (map_iterator_get_pair (data .env , & iter )) | pair | : ({
120117 _ = e .enif_map_iterator_next (data .env , & iter );
121118 }) {
122119 var key_str : [256 ]u8 = undefined ;
123120 var key_len : usize = 0 ;
124121
125- // SAFETY: enif_inspect_binary initializes bin on success before use.
126- var bin : e.ErlNifBinary = undefined ;
127- if (e .enif_inspect_binary (data .env , key , & bin ) != 0 ) {
122+ if (inspect_binary (data .env , pair .key )) | bin | {
128123 const copy_len = @min (bin .size , key_str .len );
129124 if (copy_len > 0 ) {
130125 @memcpy (key_str [0.. copy_len ], bin .data [0.. copy_len ]);
131126 }
132127 key_len = copy_len ;
133128 } else {
134- const alen = e .enif_get_atom (data .env , key , & key_str , key_str .len , e .ERL_NIF_LATIN1 );
129+ const alen = e .enif_get_atom (data .env , pair . key , & key_str , key_str .len , e .ERL_NIF_LATIN1 );
135130 if (alen > 0 ) {
136131 key_len = @intCast (alen - 1 );
137132 }
@@ -154,8 +149,7 @@ fn get_own_property_names(ctx: ?*qjs.JSContext, ptab: [*c][*c]qjs.JSPropertyEnum
154149 const okey = qjs .JS_AtomToCStringLen (ctx , & olen , otab [i ].atom );
155150 if (okey != null ) {
156151 defer qjs .JS_FreeCString (ctx , okey );
157- // SAFETY: lookupKey writes dummy before any successful read.
158- var dummy : e.ErlNifTerm = undefined ;
152+ var dummy = std .mem .zeroes (e .ErlNifTerm );
159153 if (! lookupKey (data , okey [0.. olen ], & dummy )) {
160154 if (idx < total ) {
161155 tab [idx ] = .{
@@ -202,8 +196,7 @@ fn has_property(ctx: ?*qjs.JSContext, obj: qjs.JSValue, atom: qjs.JSAtom) callco
202196 if (key_ptr == null ) return 0 ;
203197 defer qjs .JS_FreeCString (ctx , key_ptr );
204198
205- // SAFETY: lookupKey writes result before any successful read.
206- var result : e.ErlNifTerm = undefined ;
199+ var result = std .mem .zeroes (e .ErlNifTerm );
207200 return if (lookupKey (data , key_ptr [0.. len ], & result )) 1 else 0 ;
208201}
209202
0 commit comments