@@ -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}
275275MP_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+
277289STATIC 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_
296308STATIC 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
0 commit comments