Skip to content

Commit 8775caf

Browse files
committed
modffi: Add .addr() method to just get symbol address.
1 parent d6f648d commit 8775caf

2 files changed

Lines changed: 14 additions & 0 deletions

File tree

unix/modffi.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,18 @@ STATIC mp_obj_t ffimod_var(mp_obj_t self_in, mp_obj_t vartype_in, mp_obj_t symna
274274
}
275275
MP_DEFINE_CONST_FUN_OBJ_3(ffimod_var_obj, ffimod_var);
276276

277+
STATIC mp_obj_t ffimod_addr(mp_obj_t self_in, mp_obj_t symname_in) {
278+
mp_obj_ffimod_t *self = self_in;
279+
const char *symname = mp_obj_str_get_str(symname_in);
280+
281+
void *sym = dlsym(self->handle, symname);
282+
if (sym == NULL) {
283+
nlr_raise(mp_obj_new_exception_arg1(&mp_type_OSError, MP_OBJ_NEW_SMALL_INT(errno)));
284+
}
285+
return mp_obj_new_int((mp_int_t)sym);
286+
}
287+
MP_DEFINE_CONST_FUN_OBJ_2(ffimod_addr_obj, ffimod_addr);
288+
277289
STATIC mp_obj_t ffimod_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
278290
(void)n_args;
279291
(void)n_kw;
@@ -296,6 +308,7 @@ STATIC mp_obj_t ffimod_make_new(mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_
296308
STATIC const mp_map_elem_t ffimod_locals_dict_table[] = {
297309
{ MP_OBJ_NEW_QSTR(MP_QSTR_func), (mp_obj_t) &ffimod_func_obj },
298310
{ MP_OBJ_NEW_QSTR(MP_QSTR_var), (mp_obj_t) &ffimod_var_obj },
311+
{ MP_OBJ_NEW_QSTR(MP_QSTR_addr), (mp_obj_t) &ffimod_addr_obj },
299312
{ MP_OBJ_NEW_QSTR(MP_QSTR_close), (mp_obj_t) &ffimod_close_obj },
300313
};
301314

unix/qstrdefsport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Q(fficallback)
4646
Q(ffivar)
4747
Q(as_bytearray)
4848
Q(callback)
49+
Q(addr)
4950
Q(func)
5051
Q(var)
5152
Q(get)

0 commit comments

Comments
 (0)